Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 检查两条线段是否碰撞(仅检查它们是否相交,而不是在何处)_Algorithm_Math_Intersection - Fatal编程技术网

Algorithm 检查两条线段是否碰撞(仅检查它们是否相交,而不是在何处)

Algorithm 检查两条线段是否碰撞(仅检查它们是否相交,而不是在何处),algorithm,math,intersection,Algorithm,Math,Intersection,我需要一个快速算法来检查两条非无限直线是否相交。必须要快,因为它会在手机上运行很多次 算法只需返回yes或no,它不必精确地找出线的交叉点 我在这里看过: 但这条线索是一个丛林,人们一直说“这就是答案”,但另外两个家伙说,这是不正确的,因为这个和那个错误 请帮我找到一个好的,有效的算法 只是想澄清一下:我需要一个你给出的函数… lineApointAx lineApointAy lineApointBx lineApointBy lineBpointAx lineBpointAy lineBpo

我需要一个快速算法来检查两条非无限直线是否相交。必须要快,因为它会在手机上运行很多次

算法只需返回yes或no,它不必精确地找出线的交叉点

我在这里看过: 但这条线索是一个丛林,人们一直说“这就是答案”,但另外两个家伙说,这是不正确的,因为这个和那个错误

请帮我找到一个好的,有效的算法

只是想澄清一下:我需要一个你给出的函数…
lineApointAx

lineApointAy

lineApointBx

lineApointBy

lineBpointAx

lineBpointAy

lineBpointBx

lineBpointBy

…根据两条线是否相交,返回true或false


如果您回答的是(伪)代码,而不是公式,我将不胜感激。

如果您的两个给定点是(X1,Y1)和(X2,Y2),请想象这两个点都是无限直线,而不仅仅是线段:

  • 确定两者的公式(请参见:)

  • 确定两条线的交点(请参见:)

  • 如果X1

  • 一个管段的两端位于另一个管段的不同侧面是必要且充分的,反之亦然。要确定点在哪一侧,只需取一个叉积,看看它是正的还是负的:

    (Bx-Ax)(Py-By)-(By-Ay)(Px-Bx)

    编辑:
    详细说明:假设您正在查看两条线段[AB]和[CD]。当且仅当((A和B位于[CD]的不同侧面)和(C和D位于[AB]的不同侧面)时,线段相交

    要查看两个点p和Q是否位于线段[EF]的不同侧面,请计算两个叉积,一个用于p,一个用于Q:

    (Fx-Ex)(Py-Fy)-(Fy-Ey)(Px-Fx)

    (外汇-外汇)(Qy-Fy)-(Fy-Ey)(Qx-外汇)


    如果结果具有相同的符号(正号或负号),则忽略它,点位于同一侧,线段不相交。如果一个是正的,另一个是负的,那么这些点在相反的边上。

    概念上重复的可能重复:“最佳的过早优化!”。哦,是吗?平均每帧以60 fps的速度进行30次交叉点检查,而渲染和大量其他计算也应在每帧之间的16 ms时间内进行。考虑到我还想支持最长两年的廉价手机,我想说,想在任何地方优化我的代码是可以理解的。特别是因为将来还会增加更多的计算。但也许你是对的,但是快速代码从来没有错。这不是过早的优化,而是算法优化。如果可以合理预期编译器会执行优化,那么优化只是过早的,不管它是否真的会执行优化。编译器可能能够智能地将除法2改为按位操作(而手工操作是过早的优化),但编译器永远无法将插入排序算法转换为快速排序算法。至少,只要编译器只是编译我们的指令,而实际上不在编程上进行协作,就不会发生这种情况。@RayHayes我不明白为什么会关闭它。像这样的大多数简单计算机几何问题都有一个公认的“最佳方法”或“最便宜”算法。我来这里是因为我赶时间,想抓住算法,而不是坐下来想一大堆公式。这将是非常有帮助的,他在这里寻找的答案(类似于,但简化)标记为接受,并修改。我认为重点是,他想要一个更快的方法来做这件事,这对我来说意味着一种不涉及找到交点的方法。唯一的问题是,找到交叉点并检查它——就像你建议的那样——实际上相当快。是的,我不知道更快意味着什么。比什么快?他只是说了“快”。不过,这对我们这些想知道线段交叉位置的人来说还是很有用的。对于那些更晚来的人来说:这不是一个稳定的算法,你必须对接近彼此重合的线对以及平行于坐标轴的线进行特殊处理。@Franz,你能举个例子吗?你确定这有效吗?例如,一条线段是从(0,0)到(0,1)的直线,另一条线段是从(-1,2)到(+1,2)的直线。然后点(-1,2)位于从(0,0)到(0,1)的直线段的一侧,而点(+1,2)位于另一侧,但两段不重叠。@templatetypedef:注意我说的是“反之亦然”。(0,0)和(0,1)都位于第二段的同一侧。@AlexWien:是的,编写代码可能很难。注意:对于未来的读者,如果这是真的,您可以在这里使用我的内联JavaScript实现:@Viclib:如果您这样做,算法仍然有效。A或B(或两者之间的任意点)的选择是任意的。