求两直线交点算法
有中间交点 则CD在AB异侧
A
B
×
A
C
A
B
×
A
D
\nobreak AB \times AC \newline AB \times AD
AB×ACAB×AD
异号
叉乘后相乘小于零
等于零的几种情况
A = B
C与AB共线
D与AB共线
求交点,可由面积比例用叉乘计算
C E C D = S A B C S A B C D . \frac{CE}{CD} =\frac{S_{ABC}}{S_{ABCD}} . CDCE=SABCDSABC.
CE与CD之比若在0与1之间 说明点在CD上 (0 为C 1为D)
综上 代码部分
float cross(float* A, float* B, float* C, float* D)
{
return (B[0] - A[0]) * (D[1] - C[1]) - (B[1] - A[1]) * (D[0] - C[0]);
}
int intersect(float* a, float *b, float *c, float *d, float* res)
{
if (a[0] == b[0] && a[1] == b[1])
return 0; // a == b
float a1 = cross(a,b,a,c);
float a2 = cross(a,b,a,d);
if (a1 == 0 && a2 == 0) //ab cd共线
return 0;
float t = a1 / (a1 - a2); // 面积1与面积2异号 保持a1方向
if (a1*a2 > 0 || t < 0 || t > 1)
return -1; //无交点
res[0] = c[0] + t*(d[0] - c[0]);
res[1] = c[1] + t*(d[1] - c[1]);
return 1;
}