2013-01-06 38 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)”。 –