如果将2行传递给函数,它如何推断出它们是否相交?每一行都是2 CPoint
个对象的形式 - 所以我总共有4个点。以下是我提出的内容。它计算每条线的斜率和Y截距,并计算它们的交点。然后检查交叉点是否位于该段上;如果是,则返回false;如果不是,即它们不相交,则返回true。
虽然,它显示了许多问题。有没有更简单,更有效的方法来做到这一点?
注意:我不太确定用于斜率和Y截距的数据类型。
bool CShortestPathFinderDoc::edgeTest(CPoint P,CPoint P2,CPoint E,CPoint E2)
{
bool status=true;
double m1,m2; //slopes
double b1,b2; //y-intercepts
double y,x; //intersection point
m1=((double)P.y-P2.y)/((double)P.x-P2.x);
m2=((double)E.y - E2.y)/( (double)E.x - E2.x);
if(m1 == m2) //if lines are colinear
return true;
b1=P.y-(m1*P.x) // Get the..
b2=E->y - (m2*E.x); // Y-intercepts.
x=(b2-b1)/(m1-m2);
y=m1*x + b1; //x,y is the intersection point!!!
if((x<P2.x && x>P.x)) //if intersection point lies on line!!!!!
{
if(P2.y > P.y)
if(y<P2.y && y>P.y)
status=false;
if(P2.y < P.y)
if(y<P.y && y>P2.y)
status=false;
}
return status;
}
答案 0 :(得分:0)
Wolfram拥有您需要的一切,特别是Line-Line Distance,即行之间的距离。如果line为零(+ -epsilon),则它们相交。
答案 1 :(得分:0)
Line segment intersection正是您要找的。也许您可以根据需要调整扫描线算法。
BTW:在上面的代码片段中,为了找出两条2D线是否平行,您只需要从输入点定义的矢量计算标量积。