您如何计算2条线是朝向还是远离?


10

给定描述2条线段的4个点,如何计算线A朝向或远离线B?

2条线的长度是固定的,可以测量为x1 / y1到x2 / y2之间的距离。

在此处输入图片说明


贝塞尔曲线的情况与直线的情况有何不同?您是否有一条曲线可以完全包围另一条线(以便每个方向都指向“朝向”)?
bummzack 2011年

1
您可能需要澄清您的条款。在“几何图形”中,“线”在任一方向上都无限延伸,而不是半线或线段,因此,除非平行,否则2条线始终交叉。您要问哪一个?您绘制了一个箭头,这意味着方向,对我而言,这意味着一条线段或最多一半的线。您对“走向”和“离开”的定义是什么?
Hackworth

Bezier曲线可能难以用求解光线线相交测试所需的相等性来表示。顺便说一句,我将代表您的箭头的单词更改为“ ray”。您可能会得到更快的答复。如果我没有时间在午餐时间有时间,我会回答这个问题。如果没有,这是游戏中极为常见的任务。Google“射线线段相交测试”。我怀疑贝塞尔曲线测试很相似,但我从未尝试过。
布兰登

3
您应该将问题一分为二。带有线段的零件非常简单。具有贝塞尔曲线的零件非常复杂,只有一个近似的数值解。
sam hocevar 2011年

我已按照要求将问题分为2个部分。第二部分是在这里:gamedev.stackexchange.com/questions/21463/...
Robinicks

Answers:


11

让我们AB上黑线两分。让C并且D成为您的蓝色细分。z叉积坐标的符号AB^AC告诉您C黑线是“左”还是“右”。同样,叉乘积AB^CD告诉您是CD转向黑线的“左”还是“右”。

我们真的不想知道它是左还是右。我们想要做的就是确保它们是相同方向或相反方向,这就是为什么我们将两个值相乘。

因此,以下伪代码应该起作用:

z1 = (xB-xA)*(yC-yA) - (yB-yA)*(xC-xA);
z2 = (xB-xA)*(yD-yC) - (yB-yA)*(xD-xC);
z3 = z1 * z2;

if (z3 < 0)
    ; /* Pointing towards (BUT maybe even crossing) */
else if (z3 > 0 || z2 != 0)
    ; /* Pointing away */
else
    ; /* Parallel */

恐怕我需要一些时间来为贝塞尔曲线编写适当的解决方案。以下情况是朝着还是远离?

问题?


对于曲线,我相信您可以在最接近线段的点处找到曲线的切线,并以与测试其他线段相同的方式使用它。可能比听起来更难:)
notlesh 2011年

@stephelton:再次查看第二张图片的贝塞尔曲线,指向一条弯曲的曲线。或考虑一条切线平行于可能相交的线但向该线弯曲并相交的曲线。
卡斯卡贝尔2011年

trollface +1,而且数学不错:)。但是,您的“朝”图实际上仍然有一个“远离”-只需将起点移动到直线上方即可。
乔纳森·迪金森

@JonathanDickinson谢谢,我更新了图像以使它的询问内容更加清晰!
sam hocevar 2011年

2

假设起点是绿色圆圈,终点是红色箭头

计算起点(作为DS)和黑色线段之间的距离,并对终点(红色箭头)与DE相同。如果DS> DE,则该线段指向。如果DE> DS,则指向远处。如果两者相等,则两者是平行的。

你可以找到如何计算从点的距离段在这里,和二次贝塞尔曲线在这里。但是,根据贝塞尔曲线的形状,它可能会返回怪异的结果(曲线可以自己交叉)


保证DS> DE仅适用于直线。对于Beziers而言,它可能会失败。另外,您不知道他对“走向”的定义。如果箭头的延长线越过由2个点定义的线,但不越过由相同点定义的线段,它是否仍然“朝”?
Hackworth

我说的是两个部分,而不是线条,因此没有“箭头的延伸”。同样,箭头指向的位置也无关紧要,因为我们在这里讨论距离。黑线上最接近的点可以是黑线的起点/终点,这无关紧要。这两个段可以是共线的,此方法仍将按预期工作。对于贝塞尔曲线,我提到根据曲线的形状会给出奇怪的结果。
Ravachol
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.