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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

判断点在线段的左边还是右边 判断线段是否相交

發布時間:2023/12/14 编程问答 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 判断点在线段的左边还是右边 判断线段是否相交 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在recast中遇到的一個操作,判斷點是在線段的左邊還是右邊
判斷在左邊和右邊在很多場景都有用到,是計算機幾何中比較基礎的概念。比如判斷是凹多邊形還是凸多邊形;判斷點是凹點還是凸點;判斷線段是否相交;判斷兩點是否在線段兩側等等。


如https://blog.csdn.net/qiushangren/article/details/90446381
這篇博客所說,順時針方向 三點組成的向量的叉積z值為負,逆時針方向三點組成的向量的叉積z值為正。這個可以反過來用于求點在線段的左右。
首先左右不能用客觀的視角來定,應該從向量的角度去判斷。所以先將線段轉換成向量,需要注意的是向量是有方向的有起止的。

如上,在xy平面上有線段AB(注意A為起點,B為終點)組成向量AB,存在點C1和C2,組成三角形ABC2和三角形ABC1。很明顯ABC2組成一個順時針方向的三個點,ABC1 組成了逆時針方向的三個點(注意這里的三角形必須包含了 向量AB)。
根據上面鏈接的博客可以很輕松的看出,

ABxAC2>0 而 ABxAC1<0 (叉乘,不是點乘),(注意都是以A為起點,也就是以已知向量的起點為起點)。

如果線段AB組成向量為BA,則
BAxBC2<0 而 BAxBC1 >0(注意這里都是以B為起點,以已知向量的起點為起點)。

總結:如果以AB的方向來判定,那么C1就是在AB的右邊,C2就是在AB的左邊,假設三角形頂點順序為ABC ,可以看到如果用ABC1組裝三角形,那么就是順時針的,如果ABC2組裝三角形,那就是逆時針的;如果以BA來判定,那C2在BA右邊,C1在BA的左邊,假設三角形頂點順序為BAC,BAC1為逆時針,BAC2位順時針。可以推斷如果在左邊,那么順序就是逆時針;如果在右邊,那么順序就是順時針。反過來也一樣,順時針表示在右邊,逆時針表示在左邊。ABxAC(注意A為起始點),使用右手定則,順時針為求出的結果(z)為負數,逆時針為求出的結果(z)正數。

//判斷線段是否相交 static int overlapSegSeg2d(const float* a, const float* b, const float* c, const float* d) {const float a1 = vcross2(a, b, d); const float a2 = vcross2(a, b, c);if (a1*a2 < 0.0f) { //相乘結果為負,說明一左一右。 說明c和d分別分布在ab的兩側。c和d沒有分布在兩側,肯定是不相交。float a3 = vcross2(c, d, a);float a4 = a3 + a2 - a1; //a4 = vcross2(c,d,b)。可以用四個點坐標計算一下,確實相等。if (a3 * a4 < 0.0f)return 1;//如果a和b也分布在cd兩側就說明相交}return 0; }//假設a(x1,y1) b(x2,y2) c(x3,y3) d(x4,y4) //b-a = (x2-x1),(y2-y1) ,d-a=(x4-x1),(y4-y1) => //a1 = (b-a)x(d-a) = (x2-x1)*(y4-y1)-(x4-x1)*(y2-y1) //a2 = (b-a)x(c-a) = (x2-x1)*(y3-y1)-(x3-x1)*(y2-y1) //a3 = (d-c)x(a-c) = (x4-x3)*(y1-y3)-(x1-x3)*(y4-y3) //a4 = a3+a2-a1 =a3 + (x2-x1)*(y3-y4)-(x3-x4)*(y2-y1) // =a3 + (x4-x3)*(y2-y1)-(x2-x1)*(y4-y3) = (x4-x3)*(y2-y3)-(x2-x3)*(y4-y3)

判斷點是凹點還是凸點:取目標點和目標點相鄰的兩個點,按逆時針方向,將目標點與前面的點相連成線段,判斷目標點后面的點是否在線段的左邊還是右邊,如果在左邊,則說明是凸點,否則是凹點。

判斷是凹多邊形還是凸多邊形:按逆時針方向判斷所有 邊的下一個點(逆時針方向與邊相鄰的點) 是否都在邊的左邊,如果都在左邊說面是凸多邊形。也可以按順時針方向來,判斷是否在右邊。

判斷兩點是否在線段兩側:直接判斷一個點在左邊一個點在右邊。

判斷線段是否相交:假設兩條線段a,b。先計算兩線段的bound是否相交做個快速排除,再判斷線段a的兩個頂點是否都在線段b的兩側,再判斷線段b的兩個頂點是否在線段a的兩側,如果兩個條件都滿足,則a b相交,否則不相交。(求交點)

?

?

總結

以上是生活随笔為你收集整理的判断点在线段的左边还是右边 判断线段是否相交的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。