【計算幾何】點定位(線段,三角形,多邊形)

CN_swords發表於2017-02-25

判斷是否點線上段上


1.滿足向量 AC×AB == 0,使C點滿足在AB的直線上


2.滿足C在AB構成的矩形內,使C點排除在AB的延長線和反向延長線上
注意:考慮豎直和水平的情況,橫座標和縱座標都要判斷。

bool dot_line(point a,point b,point c)
{
    V v_line,v_dot;
    v_line.start = a;
    v_line.end = b;
    v_dot.start = a;
    v_dot.end = c;
    double temp = cross_mul(v_line,v_dot);
    if(fabs(temp) < esp && c.x >= min(a.x,b.x) && c.x <= max(a.x,b.x) && c.y >= min(a.y,b.y) && c.y <= max(a.y,b.y))
        return true;
    return false;
}

判斷點在三角形內外

點在平面內與三角形三個點構成的三個三角形的面積和 與 原三角形的面積比較

如果相等,即可判斷在三角形內

struct triangle
{
    point a,b,c;
};

bool dot_triangle(point x,triangle f)
{
    V ax,bx,cx,ab,ac;
    ax.start = f.a;
    ax.end = x;
    bx.start = f.b;
    bx.end = x;
    cx.start = f.c;
    cx.end = x;
    ab.start = f.a;
    ab.end = f.b;
    ac.start = f.a;
    ac.end = f.c;
    double abx = fabs(cross_mul(ax,bx));
    double acx = fabs(cross_mul(ax,cx));
    double bcx = fabs(cross_mul(bx,cx));
    double abc = fabs(cross_mul(ab,ac));
    if(fabs(abx+acx+bcx - abc) < esp)
        return true;
    return false;
}


判斷點在多邊形內外

1. 掃描線法

顧名思義,從要判斷的點構造任意射線,計算射線與多邊形的交點個數,一般情況下,個數為奇數則在多邊形裡面,反之在外面。

既然寫一般情況,那麼就有特殊情況。

除了要注意,在用多邊形的邊和射線相交來算交點,如果交於頂點處,射線與兩個邊相交,但只能算一個點

也有可能射線與邊重合,還有可能點在多邊形邊上,

另外最麻煩的是如下圖情況,只能算一個點,然而書上的解決方法(如果頂點是所屬邊上縱座標上較大的頂點)我不大認同,我想下圖反一下不就行不通了嗎,可能是我沒懂。。。


2. 叉乘判別法(只適用凸多邊形)

原理比較簡單,對於一個處於凸多邊形內部的點,與所有頂點連線,生成以此點開始的向量,根據頂點的順序運算相鄰向量的叉積,叉積的符號一直不變。

特殊情況:叉積為0,其實繼續判斷即可。


3. 角度和的判斷法

原理更簡單,在多邊形內部,點和多邊形頂點連線組成的所有三角形角度(以所求點為頂點)和為360。




相關文章