js判斷多邊形的座標點是順時針還是逆時針的兩種方法

2021-09-24 19:57:22 字數 1800 閱讀 8790

由於arcgis對順時針生成的多邊形面積計算為正,逆時針生成的為負,所以產生了需要判斷多邊形座標是順時針還是逆時針的需求。

首先我們可以通過三點構成的兩個向量的叉乘結果 k 來判斷這三點的走向是順時針還是逆時針的。

如果k<0,則為順時針,

如果k>0,則為逆時針,

如果k=0,則平行。

當多邊形是凸多邊形時,各個點均滿足這個規律,但如果是凹多邊形,在凹邊處就會存在特殊情況。

因此我們需要找到乙個絕對為凸邊的點,通過這個點與相鄰兩點所構成的兩個向量的走向就可以反映整個多邊形的走向了。

顯然這個點可以是多邊形中的極值點,即x最大或x最小,或y最大或y最小的點,這就是第一種方法。

// 三個點可以判斷向量是順時針旋轉還是逆時針旋轉的,但由於可能存在凹邊,所以並不是任意三點都可以正確反映多邊形的走向

// 因此需要取多邊形中絕對是凸邊的點來判斷,

// 多邊形中的極值點(x最大或x最小或y最大或y最小)它與相鄰兩點構成的邊必然是凸邊,因此我們先取出多邊形中的極值點,再由極值點和其前後兩點去判斷向量的走向,從而判斷出多邊形的走向。

function iscoordshun2(c_str)

if(coords[0] == coords[coords.length-1])

coords = coords.reverse();

var maxxindex = 0;

var maxx = parsefloat(coords[maxxindex].split(",")[0]);

var c1,c2,c3;

var x1,y1,x2,y2,x3,y3;

for(var i=0;imaxx)

}if(maxxindex==0)else if(maxxindex==coords.length-1)else

x1 = parsefloat(c1.split(",")[0]);

y1 = parsefloat(c1.split(",")[1]);

x2 = parsefloat(c2.split(",")[0]);

y2 = parsefloat(c2.split(",")[1]);

x3 = parsefloat(c3.split(",")[0]);

y3 = parsefloat(c3.split(",")[1]);

var s = ((x1-x3)*(y2-y3)-(x2-x3)*(y1-y3));

return s<0;

}

我們知道多邊形的內角和滿足 (n-2)*180,因此我們可以試著計算出位於向量右側(即順時針的一側)的所成夾角的角度之和m。

如果多邊形座標點是順時針繪製的,m約等於內角和公式;

如果是逆時針繪製的,m約等於n*180+360。

// 多邊形的點兩兩構成乙個向量,每兩個向量構成乙個角度,其右側的角度為向量順時針方向的角度,

// 我們通過計算所有的向量兩兩構成的這個順時針角度的和是否等於多邊形內角和(n-2)*180,

// 如果等於,則說明向量的順時針方向角是多邊形內角,說明向量前進方向是順時針,

// 否則,則是逆時針,此時計算出來的角度和應為n*180+多邊形外交和360。

// 計算過程存在小數點誤差,因此判斷相等時使用乙個範圍。

function iscoordshun1(c_str)

if(coords[0] == coords[coords.length-1])

//角度和

var angsum = 0;

for(var i=0;i0)else

}

簡單多邊形 判斷此多邊形是順時針還是逆時針。

為了讓所有選手都感到開心,nowcoder練習賽總會包含一些非常基本的問題。比如說 按順時針或逆時針方向給你乙個簡單的多邊形的頂點座標,請回答此多邊形是順時針還是逆時針。輸入包含n 1行。第一行包含乙個整數n,表示簡單多邊形的頂點數。在下面的n行中,第i行包含兩個整數x i,yi,表示簡單多邊形中的...

判斷封閉多邊形的點的序列是順時針還是逆時針

原理如下 本方法有問題,希望看的朋友注意,不要誤導了你們 判斷的方法如下圖所示,首先找到最西邊的點,在圖中是3號點,則從該點前乙個點開始的連續三個點 在圖中是2 3 4三個點 的排序就代表了整個拐點序列的排序 而這三個點的排序可以通過比較座標方位角判斷出來 若中間點到前點的座標方位角小於中間點到後點...

判斷乙個座標點是否在不規則多邊形內部的演算法

參考 1,將多邊形的座標存在在乙個陣列裡,首先我們需要取得該陣列在橫座標和縱座標的最大值和最小值,根據這四個值minx,maxx,miny,maxy,算出乙個四邊形,判斷目標點是否在這個四邊形內,不滿足,直接返回false,證明該目標點不在此多邊形內部。if m pos.x minx m pos.x...