昨天小學了一點計算幾何學的內容,想把它記下來,以便以後翻閱。
1.判斷點是否在多邊形中
先說一下思路:
判斷點(p)是否在多邊形中,可以先以點p向左引一條射線(l),我們知道,從射線l左端的無窮遠處開始一直到點p的過程中,當遇到多邊形的第乙個交點時l進入了多邊形,當遇到第二個交點時,l穿出了多邊形。。。。。。。。。可知,規律如下,當在遇到p點之前l與多邊形的交點為偶數個時,說明p點不在多邊形內,當在遇到p點之前l與多邊形得交點為奇數個時,說明p點在多邊形內。
但是,這個規律並不具有普遍性,還有幾種特殊情況不滿足此規律,需要額外考慮:
(1)當點p在多邊形的某條邊上時,可以直接判斷其在多邊形中。
(2)對於多邊形的水平邊不作考慮。
(3)對於多邊形的頂點與l相交,則需要判斷該頂點是否為頂點所在的邊的那個縱座標較大的頂點,如果是較大的那個頂點與l相交則計數,否則忽略。
偽**如下:?
........fun()
if
(s不是水平的)
}
else
if
(s與l相交)
}
}
if
(count%2==0)
else
}
2.判斷線段是否在多邊形內
思路:(1)首先,要判斷一條線段是否在多邊形內,先要判斷線段的兩個端點是否在多邊形內。如果兩個端點不全在多邊形內,那麼,線段肯定是不在多邊形內的。
(2)其次,如果線段和多邊形的某條邊內交(兩線段內交是指兩線段相交且交點不在兩線段的端點),則線段肯定不在多邊形內。
(3)如果多邊形的某個頂點和線段相交,則必須判斷兩相交交點之間的線段是否包含於多邊形內。
偽**:?
if
(線段pq的端點不都在多邊形內)
點集pointset初始化為空;
for
(多邊形的每一條邊s)
else
if
else
if
(線段pq與s相交)
}
將pointset中的點按照x-y座標排序;
for
(pointset中每兩個相鄰點pointset[i],pointset[i+1])
}
return
true
;
判斷點是否在多邊形內
1.叉乘判別法 只適用於凸多邊形 想象乙個凸多邊形,其每乙個邊都將整個2d螢幕劃分成為左右兩邊,連線每一邊的第乙個端點和要測試的點得到乙個向量v,將兩個2維向量擴充套件成3維的,然後將該邊與v叉乘,判斷結果3維向量中z分量的符號是否發生變化,進而推導出點是否處於凸多邊形內外。這裡要注意的是,多邊形頂...
判斷點是否在多邊形內
判斷點是否在多邊形內有三個步驟 自csdn 第一步 判斷這個點是不是就是多邊形的端點 第二步 判斷這個點是不是落在多邊形的邊界上 第三步 通過這個點橫向作一平行射線,判斷與多邊形的交點數,如果交點是頂點,則交點數加一,結果如果是奇數,則該點落在多邊形之內,如果是偶數,則反之。具體演算法涉及向量叉積,...
判斷點是否在凸多邊形內
判斷點是否在凸多邊形內的方法很多,此處僅給出使用向量叉積判斷點是否在凸多邊形內的方法。以下圖為例說明問題 原則 1.將多邊形的第i條邊的第乙個頂點指向點p得到向量 v1,然後將從第乙個頂點指向第二個頂點得到向量v2,叉乘這兩個向量。2.如果叉乘結果與上一條邊的叉乘結果的乘積大於0則繼續執行,如果乘積...