日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

python判断两线段是否相交_c语言 判断两直线段是否相交

發(fā)布時(shí)間:2024/4/13 python 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python判断两线段是否相交_c语言 判断两直线段是否相交 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

轉(zhuǎn)了多人的放到一起比較!!

//功能:求點(diǎn)在有向直線左邊還是右邊

//返回:0共線、1左邊、-1右邊

intleft_right(pointa,pointb,doublex,doubley)

{

doublet;

a.x-=x;b.x-=x;

a.y-=y;b.y-=y;

t=a.x*b.y-a.y*b.x;

returnt==0?0:t>0?1:-1;

}

//功能:線段c,d和直線a,b是否相交

boolintersect1(pointa,pointb,pointc,pointd)

{

returnleft_right(a,b,c.x,c.y)^left_right(a,b,d.x,d.y)==-2;

}

//功能:判斷線段c,d和線段a,b是否相交

boolintersect(pointa,pointb,pointc,pointd)

{

returnintersect1(a,b,c,d)&&intersect(c,d,a,b);

}

以上是一位大神的!!

//

判斷兩線段是否相交:

方法(1):快速排斥(兩個(gè)MBR是否有交集)+跨立(一個(gè)線段的兩個(gè)端點(diǎn)在另一線段的兩端)。

給出C語言代碼如下:

/*

* 由兩個(gè)點(diǎn)構(gòu)造一個(gè)向量

*/

Vector VectorConstruct(Point A, Point B)

{

Vector v;

v.x = B.x - A.x;

v.y = B.y - A.y;

return v;

}

// 向量的叉積

double CrossProduct(Vector a, Vector b)

{

return a.x * b.y - a.y * b.x;

}

/*

* 由兩個(gè)點(diǎn)構(gòu)造一個(gè)MBR

*/

MBR MbrConstruct(Point A, Point B)

{

MBR m;

if (A.x > B.x)

{

m.xmax = A.x;

m.xmin = B.x;

}

else

{

m.xmax = B.x;

m.xmin = A.x;

}

if (A.y > B.y)

{

m.ymax = A.y;

m.ymin = B.y;

}

else

{

m.ymax = B.y;

m.ymin = A.y;

}

return m;

}

/*

* 判斷兩個(gè)MBR是否有交集,有返回1,否0

*/

int MbrOverlap(MBR m1, MBR m2)

{

double xmin, xmax, ymin, ymax;

xmin = Max(m1.xmin, m2.xmin);

xmax = Min(m1.xmax, m2.xmax);

ymin = Max(m1.ymin, m2.ymin);

ymax = Min(m1.ymax, m2.ymax);

return (xmax >= xmin && ymax >= ymin) ? 1 : 0;

}

/*

* 判斷兩線段(線段AB和CD)是否相交,是返回1,否0

*快速排斥+跨立

*/

int SegmentIntersection(Point A, Point B, Point C, Point D)

{

// (1)判斷AB和CD所在的MBR是否相交

MBR m1 = MbrConstruct(A, B);

MBR m2 = MbrConstruct(C, D);

if (MbrOverlap(m1, m2) == 0)

return 0;

// (2)跨立判斷

Vector CA = VectorConstruct(C, A);

Vector CB = VectorConstruct(C, B);

Vector CD = VectorConstruct(C, D);

Vector AC = VectorConstruct(A, C);

Vector AD = VectorConstruct(A, D);

Vector AB = VectorConstruct(A, B);

// AB跨立CD,并且,CD跨立AB

if (CrossProduct(CD, CA) * CrossProduct(CD, CB) <= 0 && CrossProduct(AC, AB) * CrossProduct(AD, AB) <= 0)

return 1;

else

return 0;

}

方法(2):判斷是否為凸多邊形。凸多邊形的判斷是,當(dāng)從某個(gè)點(diǎn)開始繞一周,要么全順時(shí)針拐彎,要么全逆時(shí)針。

/*

* 判斷兩線段(線段AB和CD)是否相交,是返回1,否0

*判斷四邊形ACBD是否是一個(gè)凸四邊形

*/

int SegmentIntersection(Point A, Point B, Point C, Point D)

{

Vector AC = VectorConstruct(A, C);

Vector CB = VectorConstruct(C, B);

Vector BD = VectorConstruct(B, D);

Vector DA = VectorConstruct(D, A);

double c[4];

c[0] = CrossProduct(AC, CB);

c[1] = CrossProduct(CB, BD);

c[2] = CrossProduct(BD, DA);

c[3] = CrossProduct(DA, AC);

int f1=0, f2=0;// 計(jì)算正數(shù),負(fù)數(shù)的個(gè)數(shù)

int i;

for (i=0; i<4; i++)

{

if (c[i] > 0) f1++;

if (c[i] < 0) f2++;

}

if (f1 > 0 && f2 > 0)// 有正,有負(fù),返回?zé)o交集

return 0;

else

return 1;

}

總結(jié)

以上是生活随笔為你收集整理的python判断两线段是否相交_c语言 判断两直线段是否相交的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。