如何检测直线(方向d和-d从点p)和线段(在点p1和p2之间)是否在2D中相交?如果他们这样做,我怎么能得到他们的交叉点 .
有很多例子可以检测两个线段是否相交,但这应该更简单 .
我找到了这个,但我不明白什么是副操作员:http://www.loria.fr/~lazard//ARC-Visi3D/Pant-project/files/Line_Segment_Line.html
如何检测直线(方向d和-d从点p)和线段(在点p1和p2之间)是否在2D中相交?如果他们这样做,我怎么能得到他们的交叉点 .
有很多例子可以检测两个线段是否相交,但这应该更简单 .
我找到了这个,但我不明白什么是副操作员:http://www.loria.fr/~lazard//ARC-Visi3D/Pant-project/files/Line_Segment_Line.html
3 回答
如果这是一个2D任务(线和线段位于同一平面并且它们由二维坐标指定),则很容易 .
构造一个与d(线的方向)垂直的向量,称为n .
计算点积n . (p1-p)和n . (p2-p) . 如果它们具有相同的符号,则没有交叉点 . 如果它们有相反的符号,则有一个交叉点 . 通过一些思考,您可以弄清楚如何根据p,p1-p和p2-p计算交点的位置 .
您可以简单地检查两条线(您的线和线段线)是否相交并评估交叉点 .
第1行:(x,y)(t)= p t * d;第2行:(x,y)(t)= p1 k *(p2 - p1)
在交叉点:p t * d = p1 k *(p2 - p1) - 两个方程(每x和每y)
从这些方程式中,您可以简单地找到k和t参数 . 如果0 <k <1,则交点处于(p1,p2)
如果你知道k或t,你可以简单地计算交点从(x,y)(t)= p t * d或(x,y)(t)= p1 k *(p2 - p1)
让
p(x,y)
和a
它的方向线方程为D = a.x+b
其中b = y - a.x
让
p1(x1,y1)
和p2(x2,y2)
对于[x1;x2]
a' = (y2-y1)/(x2-x1)
和b' = y2 - a'.x2 = y1 - a'.x1
中的任何x
,方程为D' = a'.x+b'
的段如果
[x1;x2]
之间有一个x
D = D'
因此如果X = (b'-b)/(a-a')
属于[x1;x2]
那么Y = a.X+b = a'.X+b
会给你一个交叉点P(X,Y)
例如 :
让
p(255,255)
,a = 1
=>b = 0
让
p1(60,179)
和p2(168,54)
=>
a' = -125/108
=>
b' = 24596/99
=>
X = (24596/99 - 0)/(1+125/108) = 115,1587983
=>
Y = (24596/99 - 0)/(1+125/108) = 115,1587983
X
介于60和168之间,因此在P(X,Y)
处有一个交叉点