當前位置:成語大全網 - 書法字典 - python如何判斷兩個mask遮罩是否相交?

python如何判斷兩個mask遮罩是否相交?

先判斷兩條線段是否不平行(最好同時判斷是否有交點且不平行,因為浮點運算不準確),再計算兩條線段的交點。下面是C語言代碼:

#包括

#包括

#定義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;

}