點 多邊形內外判斷

2022-01-17 07:08:29 字數 1591 閱讀 6638

問題情境:

1.判斷點是否在人體某個部位(不規則多邊形)上

思路辨析:

判斷方法有好多種,需要考慮到實用性(侷限性)和**化簡易程度。

1.面積和判斷,內角和判斷**角法)等,或侷限於多邊形形狀(凹、凸),或**計算有複雜地方(弧長,角度計算),或侷限於多邊形頂點的順序問題等。

2.觀察及檢驗之下,射線法(判斷奇偶)和改進的弧長法,可用。

原理闡釋:

1.射線法:以被測點為一端點,做一射線(任何斜率都可,一般做水平線或豎直線),如果穿越多邊形邊的次數為偶(點在外),為奇(點在內)。自己動手畫圖加以理解。侷限性,射線過多邊形的頂點,或射線過某條多邊形的邊。所以**中要特殊考慮。

2.改進的弧長法:叫法不同而已。原理可以從轉角法(或弧長法)出發理解。以被測點為原點建座標系,判斷兩個頂點所屬象限的關係(兩個頂點沒有次序關係):同乙個象限認為是 0,間隔乙個象限是 1,間隔二個象限 是± 2(分方向),間隔三個象限是-1。得出值求和,不為0即在多邊形內部。限制,點在座標軸上的判斷,要特殊考慮。

3.弧長法:以被測點為圓心,作單位圓,把邊投影到單位圓上,對應一段段 弧長,規定逆時針為正,順時針為負,計算弧長代數和:代數和為0,點在多邊形外部;代數和為2π,點在多邊形內部;代數和為π,點在多邊形邊上。

**:1.射線法的**暫不附上。

2.改進的弧長法(c#):

//    /// /// 判斷某點是否在多邊形裡面

///

/// 點

/// 多邊形各個頂點

///

public bool isinmultiline(point point, point points)

int zone1 = point_norm[0].x >= 0 ? (point_norm[0].y >= 0 ? 0 : 3) : (point_norm[0].y >= 0 ? 1 : 2);// 計算象限

int sum = 0;

for (i = 1; i < point_norm.length; i++)

int crossvalue = point_norm[i].y * point_norm[i - 1].x - point_norm[i].x * point_norm[i - 1].y; // 計算叉積

if (crossvalue == 0 && point_norm[i - 1].x * point_norm[i].x <= 0 && point_norm[i - 1].y * point_norm[i - 1].y <= 0)

int zone2 = point_norm[i].x >= 0 ? (point_norm[i].y >= 0 ? 0 : 3) : (point_norm[i].y >= 0 ? 1 : 2);// 計算象限

if (zone2 == (zone1 + 1) % 4)

else if (zone2 == (zone1 + 3) % 4)

else if (zone2 == (zone1 + 2) % 4)

else

}zone1 = zone2;

}if (i < point_norm.length || sum != 0)

else

}

多邊形判斷點內外

在圖形學中判斷乙個點是否在多邊形內,若多邊形不是自相交的,那麼可以簡單的判斷這個點在多邊形內部還是外部 若多邊形是自相交的,那麼就需要根據非零環繞數規則和奇 偶規則判斷。判斷多邊形是否是自相交的 多邊形在平面內除頂點外還有其他公共點 內 外測試 不自交的多邊形 多邊形僅在頂點處連線,而在平面內沒有其...

演算法 點在多邊形內外判斷

射線發 射線發判斷點是否在多邊形內部 p 待判斷的點。格式 poly 多邊形定點,陣列成員格式相同 private string raycasting point p,listpoly 判斷線段兩短點是否在射線兩側 if sy py sy py tyif x px return flag in ou...

點在多邊形內外的判斷

點與多邊形的的位置關係 點在形內 點在形外 點在邊界上 判斷方法 射線法 轉角法 射線法 通常取x軸正方向為射線方向 奇數次相交,則在形內 偶數次相交,則在形外 對於凹多邊形也是可以的 射線法的特殊情況 與定點相交 與其相鄰的端點或者線段在射線的異側,則認為是相交 否則不認為相交 與邊部分重合 縮點...