簡體   English   中英

線路交叉口

[英]Line intersection

如何查找是否在多邊形中截取了一條線

問題有點模棱兩可,但我們還是試試:

假設線上的點(x,y)由方程Ax + By + C = 0定義。然后我們可以通過評估Ax + By + C來明確地確定點(x,y)是否在線上。該點不在線上,然后Ax + By + C的符號告訴我們該點的哪一側。 因此,通過檢查多邊形的每個頂點(x,y)的表達式Ax + By + C的符號,我們可以確定多邊形的所有點是否在線的同一側。

(稍微不同的問題是確定多邊形是否與線段相交。)

您可以從某個網頁上的此實現中讀取合理的答案

Point  * intersection2(Point * _line1, Point * _line2) {

Point  p1,p2,p3,p4;
p1=_line1[0]; p3=_line2[0];
p2=_line1[1]; p4=_line2[1];

// Store the values for fast access and easy
// equations-to-code conversion
double x1 = p1.x, x2 = p2.x, x3 = p3.x, x4 = p4.x;
double y1 = p1.y, y2 = p2.y, y3 = p3.y, y4 = p4.y;

double A1 = y2-y1;
double B1 = x1-x2;
double C1 = (A1*x1)+(B1*y1);

double A2 = y4-y3;
double B2 = x3-x4;
double C2 = A2*x3+B2*y3;

double det = A1*B2 - A2*B1;

if (det==0){
    return NULL;
}else{
    // Return the point of intersection
    Point  * ret = new CvPoint2D64f ();
    ret->x = (B2*C1 - B1*C2)/det;
    ret->y = (A1*C2 - A2*C1)/det;
    return ret;

}

}

參考。 C ++示例:幾何概念線交點及其應用程序,2D繪圖來自網站ucancode的lbackstrom

您需要坐標圖上的多邊形點以及線的斜率和x和y截距來查找該信息。 從那里它是簡單的數學。

取決於你想要什么(我將假設一個線段,因為我本周剛編寫該代碼)你可以分兩部分:

首先,我建議將編碼行編碼為

a*X + b*Y - c = 0

因為該形式沒有像X=5Y=4X=3*Y這樣的線的邊角情況。

  • 測試線是否與多邊形的任何一側相交
    • 測試兩條線的末端是否在另一條線的兩側。 建議的形式只需檢查LHS的極性即可
  • 測試線上的點是否在多邊形內
    • 測試從輸入線上的某個點到多邊形外部的線是否在奇數個點處對多邊形進行測試。 請注意,您需要檢查從多個位置出現的相同點,並且由於FP錯誤,無法通過完全匹配測試來完成。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM