2013-01-06 77 views
2

我有以下結構的定義:交叉數據結構

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 
+2

我建議你使用標準的STL容器(例如'std :: vector')和迭代容器的算法,而不是原始指針和手動分配/解除分配 –

+1

如果你的直線穿過一個或多個頂點的多邊形。只是在說'。 –

+0

不要描述代碼,顯示它。 –

回答

0

不知道我理解的問題。你問是否sizeof(vec)包含編譯器包含的附加數據?是的,它確實。但是,如果指針的類型爲char*,則只會增加sizeof(vec)。當指針的類型爲type*時,指針上的算術運算將其視爲指向數組元素,並對整個元素進行操作。所以你不需要使用sizeof

UPDATE:

現在,我已經看到了你的問題的編輯,我想我更好地理解它。的基本問題是:

給定一個陣列:

T* array[N] 

和結構類型:

struct S { 
    T A, B; 
}; 

可以使用一個S*指針來訪問的一對連續的元件的陣列中?

我認爲這應該工作。但是,你不應該使用sizeof技術產生的指針,你應該直接使用各類型之間用石膏正常指針運算:

const lineSegment *polyBorder = (lineSegment*)test.points; // first line 
polyBorder = (lineSegment*)(((vec*)polyBorder))+1); // second line 
polyBorder = (lineSegment*)(((vec*)polyBorder))+1); // third line 

這使得該型夯實清晰,並採取的方式Ç優勢/ C++做指針運算,自動乘以後面元素的大小。

+0

看指針類型更接近; polyBorder類型爲const lineSegment *(sizeof(lineSegment)min 2 * sizeof(vec))polygon.points類型爲vec *。 polyBorder被誤用來訪問一個vec-Array,所以我可以將兩個相鄰點視爲一條線段。 (我這樣做,所以我不必爲多邊形邊界創建n段線以用於相交(...)) – user1861174

+0

請將實際的聲明添加到您的問題中,並顯示您詢問的代碼。我無法通過描述而不是實際的代碼來了解您。 – Barmar

+0

無關緊要,無論如何你都不應該把'sizeof(vec)'添加到'vec *'。請記住,按照定義,「a [i] == *(a + i)」。 –