我有以下結構的定義:交叉數據結構
struct vec { // 2-dim vector
long d[2];
};
struct lineSegment { // a 2D-LineSegment with start/end points A, B
vec A, B;
};
struct polygon { // a 2D-Polygon
vec *points;
polygon(unsigned int points) {
vec = new vec[points];
}
polygon() {}
~polygon() { delete[] vec; }
};
我的任務是寫一個方法isPointInside(常量VEC & A,const的多邊形& P)確定,如果一個給定的點A是內部的給定多邊形P還是不是。
我實現
首先我的方法創建一個線段L從A開始,並在B點結束,那絕對是多邊形之外。其次,它計算與線段L相交的多邊形的所有邊界。如果多邊形P的計數邊界是奇數,則給定點A恰好在給定多邊形P內。
我用找出來了,如果兩個線段相交做具有下面的函數聲明的方法:
bool intersect(const line&, const line&);
多邊形是定義該多邊形的所有拐角點的陣列。具有n個角點
P = (P1, P2, ..., PN)
多邊形P具有如下邊界:
(P1, P2), (P2, P3), ..., (P(N-1), PN), (PN, P1)
遍歷所有邊界,我想用一個「常量lineSegment'指針polyBorder,即指着裏面polygon.points數組(vec類型),並且在每次迭代之後都會通過sizeof(vec)增加。
在每次迭代(除了第n次迭代),我想打電話給
intersect(L, *polyBorder);
問題
是否與任何C/C++編譯器本次迭代的工作,或者做一些編譯器存儲的其他數據對於vec和lineSegment,這種方法不適用於這些?
含義,是指針的用法,在c/C++標準中明確定義,還是特定於此實現?
//編輯
有些爲例碼(未測試,可能不工作!):
polygon test(4);
// initialise the points in test.points
const lineSegment *polyBorder = reinterpret_cast<lineSegment*>((const void*)test.points); // first line
// do something
polyBorder = reinterpret_cast<const lineSegment*>(((const void*)polyBorder)+sizeof(vec)); // second line
// do something
polyBorder = reinterpret_cast<const lineSegment*>(((const void*)polyBorder)+sizeof(vec)); // third line
// do something
我建議你使用標準的STL容器(例如'std :: vector')和迭代容器的算法,而不是原始指針和手動分配/解除分配 –
如果你的直線穿過一個或多個頂點的多邊形。只是在說'。 –
不要描述代碼,顯示它。 –