我有一条射线,我需要找到它命中的最近线段。我认为如果我先对线段进行排序,可以在 O(log n) 时间内完成此操作,但我不记得如何对它们进行排序......我认为某种树最有效,但我该如何排序他们的起点和终点?如果可能的话,我还想快速插入到这个数据结构中。
一条射线与一条线段有很多代码,但我需要一些关于一条射线与多条线段的代码...我不知道要用谷歌搜索什么术语。
适当文章的链接很好,C++ 代码更好。谢谢! :)
PS:线段实际上是非自相交多边形的边,按 CCW 顺序排序...但我认为以不同的方式排序它们可能有一些优势?
这都是二维的。
再三考虑,我不完全确定这是否可能。某种空间划分可能会有所帮助,但除此之外,我想不出任何方法来对线进行排序,以便将它们与任意射线进行比较。
最佳答案
您可以采用多边形的边界框(最小-最大 x,y 坐标)并在框内构建网格。然后,对于每个单元格,记住穿过该单元格的所有线。
找到这样的交叉点:
您还可以使网格分层(即 quadtree - 您要求的树),并使用相同的算法遍历它。 This is done in raytracing in 3D时间复杂度为O(sqrt(N))。
或者,使用我在光线追踪器中所做的方法:
收集四叉树中被射线击中的所有叶节点:
计算根的射线-矩形交点(不难)。如果根被光线击中,则递归地处理它的子节点。
这很酷的一点是,当一个树节点没有被命中时,您就跳过了处理整个子树(可能是一个大的矩形区域)。
最后,这相当于遍历网格 - 您收集光线路径上的最小单元格,然后测试其中的所有对象是否相交。您只需测试所有这些并选择最近的交点(这样您就可以探索射线路径上的所有线)。
这是 O(sqrt(N))。
在网格遍历中,当找到路口时,可以停止搜索。要通过四叉树遍历实现此目的,您必须以正确的顺序搜索子项 - 按距离对 4 个矩形交叉点排序或巧妙地遍历 4 单元网格(我们回到遍历)。
这只是一种不同的方法,我认为实现起来比较困难,而且效果很好(我在真实数据上测试过 - O(sqrt(N)))。同样,如果您至少有几条线,您将只能从这种方法中受益,我认为当多边形有 10 条边时,与仅测试所有边相比,好处微乎其微。
关于c++ - 用于快速射线相交的线段容器? (二维),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/732687/
大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm
当我使用has_one时,它工作得很好,但在has_many上却不行。在这里您可以看到object_id不同,因为它运行了另一个SQL来再次获取它。ruby-1.9.2-p290:001>e=Employee.create(name:'rafael',active:false)ruby-1.9.2-p290:002>b=Badge.create(number:1,employee:e)ruby-1.9.2-p290:003>a=Address.create(street:"123MarketSt",city:"SanDiego",employee:e)ruby-1.9.2-p290
如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:
我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我
我正在使用带有Rails的Devise,我想添加一个方法“getAllComments”,所以我这样写:classUser在我的Controller中:defdashboard@user=current_user@comments=@user.getAllComments();end当我访问我的url时,我得到了undefinedmethod`getAllComments'for#我做错了什么?谢谢 最佳答案 因为getAllComments是一个类方法,而您正试图将其作为实例方法访问。您要么需要访问它:User.getAllCom
我正在使用Rails3.2.3和Ruby1.9.3p0。我发现我经常需要确定某个字符串是否出现在选项列表中。看来我可以使用Ruby数组.includemethod:或正则表达式equals-tildematchshorthand用竖线分隔选项:就性能而言,一个比另一个好吗?还有更好的方法吗? 最佳答案 总结:Array#include?包含String元素,在接受和拒绝输入时均胜出,对于您的示例只有三个可接受的值。对于要检查的更大的集合,看起来Set#include?和String元素可能会获胜。如何测试我们应该根据经验对此进行测试
我正在处理http://prepwork.appacademy.io/mini-curriculum/array/中概述的数组问题我正在尝试创建函数my_transpose,它接受一个矩阵并返回其转置。我对写入二维数组感到很困惑!这是一个代码片段,突出了我的困惑。rows=[[0,1,2],[3,4,5],[6,7,8]]columns=Array.new(3,Array.new(3))putscolumns.to_s#Outputisa3x3arrayfilledwithnilcolumns[0][0]=0putscolumns.to_s#Outputis[[0,nil,nil],[
我有一个数组数组,想将元素附加到子数组。+=做我想做的,但我想了解为什么push不做。我期望的行为(并与+=一起工作):b=Array.new(3,[])b[0]+=["apple"]b[1]+=["orange"]b[2]+=["frog"]b=>[["苹果"],["橙子"],["Frog"]]通过推送,我将推送的元素附加到每个子数组(为什么?):a=Array.new(3,[])a[0].push("apple")a[1].push("orange")a[2].push("frog")a=>[[“苹果”、“橙子”、“Frog”]、[“苹果”、“橙子”、“Frog”]、[“苹果”、“