我正在编写雷达逻辑,用于找到附近的物体并在“雷达”窗口中显示它们,如下所示:
这个逻辑(行得通!)如下所示 - 稍微简化了原始版本: -- 5000 = radar distance
-- Width can be called from a.width
-- Height can be called from a.height
.
select * from positions a
inner join positions b on b.user_id = :user_id
left join users u on a.user_id = u.id
where 1=1
and (
a.x >= (b.x - 5000)
&& a.x <= (b.x + 5000)
&& a.y >= (b.y - 5000)
&& a.y <= (b.y + 5000)
)
我遇到的问题是一些物体非常大,甚至比雷达距离还大。这意味着,如果大物体的中心点超出了雷达距离,整个物体就会消失,即使它的高度/宽度仍在雷达范围内。以下是一个示例问题(向左移动导致黄色形状消失,即使它仍然在雷达视野范围内,但对象的中心点已经超出了雷达距离,因此未在sql结果中显示)。 我希望我已经解释得足够清楚,让人们能够理解。以下是我自己尝试解决这个问题的尝试(没有一个成功的):
失败尝试#1:
select * from positions a
inner join positions b on b.user_id = 10
left join users u on a.user_id = u.id
where 1=1
and (
a.x >= ((b.x+a.width) - 5000)
&& a.x <= ((b.x-a.width) + 5000)
&& a.y >= ((b.y+a.height) - 5000)
&& a.y <= ((b.y+a.height) + 5000)
)
失败尝试 #2:
select * from positions a
inner join positions b on b.user_id = 10
left join users u on a.user_id = u.id
where 1=1
and (
a.x >= (b.x - 5000)
&& a.x <= (b.x + 5000)
&& a.y >= (b.y - 5000)
&& a.y <= (b.y + 5000)
)
OR (
(a.x+a.width) >= ((b.x+a.width) - 5000)
&& (a.x-a.width) <= ((b.x-a.width) + 5000)
&& (a.y+a.height) >= ((b.y+a.height) - 5000)
&& (a.y-a.height) <= ((b.y+a.height) + 5000)
)
我觉得我已经到了开始混淆自己的地步。如果您需要任何额外的信息,请告诉我。 感谢考虑我的问题。
更详细的示例:
每个对象都有高度/宽度/x/y坐标,如下所示:
+----+------+------+--------+-------+
| id | x | y | height | width |
+----+------+------+--------+-------+
| 1 | 100 | 100 | 150 | 150 |
| 2 | -250 | 500 | 150 | 150 |
| 3 | 5000 | 2000 | 10000 | 10000 |
+----+------+------+--------+-------+
假设有一个任意的“雷达距离”设置为5,000。
如果我坐在坐标:
0x,0y
,我可以看到ID3
。如果我移动到坐标:-100x,0y
,我的SQL将不再检索ID3
,因为坐标的中心点扩展到了5,000雷达距离之外。然而-宽度向雷达的50%扩展,高度向雷达的50%扩展,这意味着对象仍应通过SQL被看到和检索。
SQL Fiddle(将-100
更改为0
,您将再次在返回的数据中看到大对象)
Select *
。SQL Fiddle 应该足以让人们继续进行,即使使用 *,本问题中的所有查询仍然按预期工作。 - Jack