2.2.1
下面開始程式的設計:
由於本部分需要判斷空間多邊形的拓撲關係,現在約定凸多邊形的邊界和內部,凸多邊形用頂點座標的逆時針方向序列確定。凸多邊形
p q
的頂點序列為
p1 p2 ..pn
和q1 q2 …qn
。為了簡單,假設
p邊界上不包含
q的頂點,
q的邊界上不包含
p的頂點。這使得p 和
q或者完全分離,或者重疊而交出乙個新的凸多邊形。(這是我對本部分的初步設計。)
程式部分:
struct point
};定義點的儲存結構同時根據需要過載了
operator !=
。然後是主類實現拓撲關係判斷。此外還有兩個輔助類dotline.h
,lineintersect.h分別實現點線判斷,兩線段相交求交點,為主類提供相應的輔助功能。
yolk.h(主類)
class convexpolyintersection
};為了有次序地求出交點,可以在兩個多邊形上交替的前進,原則是在哪個多邊形的邊上可能有交點就等待,在另乙個多邊形的邊上前進。如果兩個凸多邊形相交,本程式可以精確的輸出交得的新凸多邊形的座標。並且已經具備了一定的拓撲關係判斷能力,可是由於程式在設計之前新增了很多苛刻限制,使得程式不能很好的判斷
eq 和相切關係。但是基本的分明蛋黃
rcc5
程式已經完成。
難點問題解決
主要難點是判斷多邊形頂點前進的方法,規定p0=
p1 q0
=q1
,接下來在哪個多邊形上前進,需要區分
8種情況,其中前四種和後四種是p 和
q的地位對調。如圖情形
(1)(
2)(3
)(4)
(5)(
6)(7
)(8)
pi在qi-1qi左
左 右
右 右
左 右
左 qi在
pi-1pi左
左 右
左 左
左 右
右 安排在那個多邊形前進 q
p qp p
q pq
這樣完成了理論部分。
本來我認為完成上面的程式就已經大功告成,可是我發現他不遵守
rcc標準,即沒有求三原謂詞p,
c和i,雖然程式在改進後可以完全實現
rcc5
拓撲判斷功能,但是已經無法直接求取三原謂詞p,
c和i了。因為程式中關於三原謂詞p ,
c 和i的理解發生了偏差,程式中是按照相交為
p考慮的,即求出交集
p=true
。而當c=true 時p
並不為真,他僅僅關注邊和點,而理論中應該是關注邊所圍成的面積。p是
c的一部分。所以將對程式進行改寫。
由於下面將繼續使用點線判斷類,所以對此類的實現進行詳細介紹:
dotline.h
(注意這裡直線是有方向性的)
怎麼判斷座標為(xp,
yp)的點
p是在直線的哪一側呢
?設直線是由其上兩點(
x1,y1
)(x2,y2)
確定的,直線方向是由(x1,
y1)到(x2,
y2)的方向。這時若直線方程記為
ax+by+c=0
則有:a=y2-y1; b=x1-x2; c=x2*y1-x1*y2;
這時可以計算d:
d=a*xp+b*yp+c
若d<0
,則點(xp,
yp)在直線的左側;若
d>0
,則點在直線的右側;d=
0點在直線上。
接下來將
實現真正的rcc5
程式。在原有程式的實踐基礎上,求三原謂詞p ,
c 和i 關係實際上就是求凸多邊形的邊界頂點與另乙個凸多邊形的位置關係。即:
p(x,y)只要有凸多邊形x或
y 的乙個頂點在凸多邊形y 或
x 內,說明x,
y 有相交部分(即,面積有重合部分),
p=true
否則p=false
。c (x,y)
凸多邊形
y 的所有頂點都在凸多邊形
x 中或上,
c=true
,否則c=false
。i (x,y)
與c (x,y)
同理。這樣就減少了設計的複雜性,同時相切問題也會得到解決,即主要注意「點線」關係,就可以很好的判斷各種關係。
難點問題解決:
這樣程式的焦點就都集中在乙個功能齊全的點與線段關係判斷類上。此類首先能判斷點與線段所在直線的位置關係(點在直線左側;點在直線右側
或本程式將繼承dotline.h
實現
superdotline.h
#include」dotline.h」/*
標頭檔案*/
class superdot: public dot
superdot(double xp1,double yp1,double x11,double y11,double x22,double y22):dot(xp1, yp1,x11,y11,x22,y22){}
~superdot(){}
int judgedeeply();/*
此函式返回點線關係結果
*/};
/*點線關係:1
--點在凸多邊形
內部是點在直線的公共左側
0 2
3 點與線段端點重合
4 */
其中輸出結果為
3 4
時,是為
rcc8
程式準備的。此程式由於是對dotline.h的擴充套件,所以函式數量較少。
完成點線關係判斷後,實現
rcc5
判斷實現
yolk1.h
(在yolk.h
的基礎上對其進行標準
rcc5
重寫求三原謂詞p ,
c和i)
本程式繼承了
yolk.h
的優點,使用指標儲存點結構(對頂點數沒有限制)。
class yolk :public superdot
public:
yolk(int itmp,int jtmp);
~yolk()
void printrelate();
};演算法設計:
此類的焦點集中在
relatercc()
函式上。他對向量資料進行兩次掃瞄判斷三原謂詞p,
c和i。以「點
、凸多邊形」拓撲關係為基礎。如當其中乙個凸多邊形的端點在另乙個的內部時,可以判斷
p=true.
javascript 判斷點在麵內,點在圓內
點在多邊形內常用的演算法就是使用射線法,作為筆記直接上 判斷乙個點是否在多邊形內部 param points 多邊形座標集合 param testpoint 測試點座標 返回true為真,false為假 function insidepolygon points,testpoint return i...
判斷點在多邊形內部
微博 文中所指的多邊形均為凸多邊形,一些描述可能有誤,歡迎指正。在開始之前,我們需要先構建好測試環境。我構建了乙個比較特殊的多邊形,如下。從最上面的頂點順時針座標 螢幕座標系 分別為 40,10 60,30 60,50 20,50 20,30 根據對多邊形的了解,我們可以得出如下結論 如果乙個點在多...
判斷點在多邊形內部
用的是射線法,我的 取的是向右的射線 這題沒有點在邊上的情況,但是還是要考慮很多 比如射線覆蓋邊,射線交短點的情況,為了區分各種狀況 我分成了6中相交情況 唉 有點多了 不過比較清晰 不知道別人是怎麼做的 include struct edge struct point 儲存邊 edge e 105...