我正在编写雷达逻辑来查找附近的物体,然后将它们显示在“雷达”窗口中:
逻辑(有效!)如图所示 - 与原始逻辑相比略有简化:
-- 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)
)
我遇到的问题是有些对象非常大。 IE。甚至比雷达距离还大。这意味着如果大物体的中心点爬出雷达距离,即使高度/宽度仍在雷达距离内,整个物体也会移动。
这是问题的一个例子(向左移动会导致黄色形状消失,即使它在技术上仍处于雷达视野距离内,但物体的中心点离开雷达距离导致它不显示在 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,你会再次看到返回数据中的大对象)
最佳答案
好的,我想我找到了我的问题的答案。我认为这可以完成工作:
set @my_x = -100;
set @my_y = 0;
set @radar_distance = 5000;
select * from positions a
where 1=1
and (
a.x >= (@my_x - @radar_distance)
&& a.x <= (@my_x + @radar_distance)
&& a.y >= (@my_y - @radar_distance)
&& a.y <= (@my_y + @radar_distance)
)
or (
a.x+(a.width/2) >= (@my_x - @radar_distance)
&& a.x-(a.width/2) <= (@my_x + @radar_distance)
&& a.y+(a.height/2) >= (@my_y - @radar_distance)
&& a.y-(a.height/2) <= (@my_y + @radar_distance)
)
虽然我仍然认为,如果物体的尺寸拉伸(stretch)得比雷达长,它仍然会破裂。我现在要测试
是的,这有效。
我还认为我也可以在 OR 之前取出整个第一 block 条件。需要测试
关于mysql - 从一定范围内的 X/Y 坐标获取正确的数据,但包括宽度和高度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53822850/
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
我正在查看instance_variable_set的文档并看到给出的示例代码是这样做的:obj.instance_variable_set(:@instnc_var,"valuefortheinstancevariable")然后允许您在类的任何实例方法中以@instnc_var的形式访问该变量。我想知道为什么在@instnc_var之前需要一个冒号:。冒号有什么作用? 最佳答案 我的第一直觉是告诉你不要使用instance_variable_set除非你真的知道你用它做什么。它本质上是一种元编程工具或绕过实例变量可见性的黑客攻击
请帮助我理解范围运算符...和..之间的区别,作为Ruby中使用的“触发器”。这是PragmaticProgrammersguidetoRuby中的一个示例:a=(11..20).collect{|i|(i%4==0)..(i%3==0)?i:nil}返回:[nil,12,nil,nil,nil,16,17,18,nil,20]还有:a=(11..20).collect{|i|(i%4==0)...(i%3==0)?i:nil}返回:[nil,12,13,14,15,16,17,18,nil,20] 最佳答案 触发器(又名f/f)是
我正在尝试从Postgresql表(table1)中获取数据,该表由另一个相关表(property)的字段(table2)过滤。在纯SQL中,我会这样编写查询:SELECT*FROMtable1JOINtable2USING(table2_id)WHEREtable2.propertyLIKE'query%'这工作正常:scope:my_scope,->(query){includes(:table2).where("table2.property":query)}但我真正需要的是使用LIKE运算符进行过滤,而不是严格相等。然而,这是行不通的:scope:my_scope,->(que
我刚刚被困在这个问题上一段时间了。以这个基地为例:moduleTopclassTestendmoduleFooendend稍后,我可以通过这样做在Foo中定义扩展Test的类:moduleTopmoduleFooclassSomeTest但是,如果我尝试通过使用::指定模块来最小化缩进:moduleTop::FooclassFailure这失败了:NameError:uninitializedconstantTop::Foo::Test这是一个错误,还是仅仅是Ruby解析变量名的方式的逻辑结果? 最佳答案 Isthisabug,or
我有一个驼峰式字符串,例如:JustAString。我想按照以下规则形成长度为4的字符串:抓取所有大写字母;如果超过4个大写字母,只保留前4个;如果少于4个大写字母,则将最后大写字母后的字母大写并添加字母,直到长度变为4。以下是可能发生的3种情况:ThisIsMyString将产生TIMS(大写字母);ThisIsOneVeryLongString将产生TIOV(前4个大写字母);MyString将生成MSTR(大写字母+tr大写)。我设法用这个片段解决了前两种情况:str.scan(/[A-Z]/).first(4).join但是,我不太确定如何最好地修改上面的代码片段以处理最后一种
有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳
question的一些答案关于redirect_to让我想到了其他一些问题。基本上,我正在使用Rails2.1编写博客应用程序。我一直在尝试自己完成大部分工作(因为我对Rails有所了解),但在需要时会引用Internet上的教程和引用资料。我设法让一个简单的博客正常运行,然后我尝试添加评论。靠我自己,我设法让它进入了可以从script/console添加评论的阶段,但我无法让表单正常工作。我遵循的其中一个教程建议在帖子Controller中创建一个“评论”操作,以添加评论。我的问题是:这是“标准”方式吗?我的另一个问题的答案之一似乎暗示应该有一个CommentsController参
我喜欢使用Textile或Markdown为我的项目编写自述文件,但是当我生成RDoc时,自述文件被解释为RDoc并且看起来非常糟糕。有没有办法让RDoc通过RedCloth或BlueCloth而不是它自己的格式化程序运行文件?它可以配置为自动检测文件后缀的格式吗?(例如README.textile通过RedCloth运行,但README.mdown通过BlueCloth运行) 最佳答案 使用YARD直接代替RDoc将允许您包含Textile或Markdown文件,只要它们的文件后缀是合理的。我经常使用类似于以下Rake任务的东西:
假设我有这个范围:("aaaaa".."zzzzz")如何在不事先/每次生成整个项目的情况下从范围中获取第N个项目? 最佳答案 一种快速简便的方法:("aaaaa".."zzzzz").first(42).last#==>"aaabp"如果出于某种原因你不得不一遍又一遍地这样做,或者如果你需要避免为前N个元素构建中间数组,你可以这样写:moduleEnumerabledefskip(n)returnto_enum:skip,nunlessblock_given?each_with_indexdo|item,index|yieldit