◆求个公式。两线段相交。
已知四个点。A(x1,y1) B(x2,y2) C(x3,y3) B(x4,y4)
求线段AB与BC是否相交,如果相交,交点是多少。用x1,y1、x2,y2、x3,y3、x4,y4表达出来。
数学忘完了。求救。!!
[解决办法]
y-y1=yi-y2/xi-x2 (x-x1) 构造两条直线长度.在对求到的值进行(xi-x2)范围判断.
[解决办法]
上网搜一下线段相交的判定。
似乎分两步,
分别是通过构建矩形的快速排斥检测,和通过计算差乘的跨立检测
[解决办法]
最基本的方法:
根据
若相交,则交点在两条直线上:
1、( x - x1 ) / ( x2 - x1 ) = ( y - y1 ) / ( y2 - y1 )
=》( x - x1 )*( y2 - y1 ) = ( y - y1 )*( x2 - x1 )
2、( x - x3 ) / ( x2 - x3 ) = ( y - y3 ) / ( y4 - y3 )
=》( x - x3 ) * ( y4 - y3 ) = ( y - y3 ) * ( x4 - x3 )
因为是线段,所以若有交点,则交点必在两端点之间:
3、( x - x1 ) * ( x2 - x1 ) >= 0 && ( x - x3 ) * ( x4 - x3 ) >= 0
( 不用再判断y,因为从(1)(2)可知(y-y1)*(y2-y1) 与 (x-x1)*(x2-x1)同号)
[解决办法]
private bool IsCross(Point A, Point B, Point C, Point D)
{
int a = Math.Sign(Cross(A, C, D)) ^ Math.Sign(Cross(B, C, D));
int b = Math.Sign(Cross(C, A, B)) ^ Math.Sign(Cross(D, A, B));
return (a == b && a == -2);
}
private int Det(int X1, int Y1, int X2, int Y2)
{
return X1 * Y2 - X2 * Y1;
}
private int Cross(Point A, Point B, Point C)
{
return Det(B.X - A.X, B.Y - A.Y, C.X - A.X, C.Y - A.Y);
}