#包括
#包括
#定義eps 1e-8
#定義零(x) (((x)>0?(x):-(x))結構點{double x,y;};
//計算叉積(P1-P0)x(P2-P0)
double xmult(點p1,點p2,點p0){
return(p 1 . x-P0 . x)*(p2 . y-P0 . y)-(p2 . x-P0 . x)*(p 1 . y-P0 . y);
}
//判斷點是否在線段上,包括端點。
int dot_online_in(點p,點l1,點l2){
返回零(xmult(p,l1,L2))& amp;& amp(l1.x-p.x)*(l2.x-p.x)}
//判斷兩點在線段的同壹邊,point在線段上返回0。
int same_side(點p1,點p2,點l1,點l2){
return xmult(l1,p1,l2)*xmult(l1,p2,l2)>eps
}
//判斷兩條直線平行
int parallel(點u1,點u2,點v1,點v2){
返回零((u 1 . x-U2 . x)*(v 1 . y-v2 . y)-(v 1 . x-v2 . x)*(u 1 . y-U2 . y));
}
//判斷三點式* * *線
int dots_inline(點p1,點p2,點p3){
返回零(xmult(p1,p2,P3));
}
//判斷兩條線段相交,包括端點和部分重合。
int intersect_in(點u1,點u2,點v1,點v2){
如果(!dots_inline(u1,u2,v1)||!dots_inline(u1,u2,v2))
回歸!same_side(u1,u2,v1,v2)& amp;& amp!same_side(v1,v2,u1,U2);
return dot_online_in(u1,v1,v2)||dot_online_in(u2,v1,v2)||dot_online_in(v1,u1,u2)||dot_online_in(v2,u1,U2);
}
//計算兩條線段的交點,請判斷線段是否相交(以及是否平行!)
點交點(點u1,點u2,點v1,點v2){
point ret = u 1;
雙t =((u 1 . x-v 1 . x)*(v 1 . y-v2 . y)-(u 1 . y-v 1 . y)*(v 1 . x-v2 . x))
/((u 1 . x-U2 . x)*(v 1 . y-v2 . y)-(u 1 . y-U2 . y)*(v 1 . x-v2 . x));
ret . x+=(U2 . x-u 1 . x)* t;
ret . y+=(U2 . y-u 1 . y)* t;
返回ret
}
int main(void)
{
點u1,u2,v1,v2,ans
Printf("請輸入線段1的兩個端點:\ n ");
scanf("%lf%lf%lf%lf ",& ampu1.x。u 1 . y & amp;U2 . x & amp;U2 . y);
Printf("請輸入線段2的兩個端點:\ n ");
scanf("%lf%lf%lf%lf ",& ampv1.x。v 1 . y & amp;v2 . x & amp;v2 . y);
if (parallel(u1,u2,v1,v2)||!intersect_in(u1,u2,v1,v2)){
Printf("沒有交集!\ n ");
}
否則{
ans =交集(u1,u2,v1,v2);
Printf("交集為:(%lf,%lf)",ans.x,ans . y);
}
返回0;
}