我有以下结构定义:
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(const vec& A,const polygon& P),它确定给定的点A是否在给定的多边形P内。
我的实施
首先,我的方法创建一个从A开始并在B点结束的线段L,它肯定在多边形之外。其次,它计算与线段L相交的多边形的所有边界。给定的点A恰好在给定的多边形P内,如果多边形P的计数边界是奇数。
我用来查明两个线段相交的方法有以下函数声明:
bool intersect(const line&, const line&);
多边形是定义多边形的所有角点的数组。带有n个角点的多边形P
P = (P1, P2, ..., PN)
有以下边框:
(P1, P2), (P2, P3), ..., (P(N-1), PN), (PN, P1)
要遍历所有边界,我想使用一个&const; const lineSegment' -pointer polyBorder,它指向polygon.points数组(类型为vec)并且将增加每次迭代后的sizeof(vec)。
在每次迭代中(第n次迭代除外)我想调用
intersect(L, *polyBorder);
问题
这个迭代是否适用于任何c / c ++编译器,或者为vec和lineSegment做一些编译器存储其他数据,这样这种方法对这些不起作用?
意思是,这是指针的用法,在c / c ++标准中有明确的定义,还是这个实现特定的?
//编辑
一些例子代码(没有经过测试,可能无法正常工作!):</ p>
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
答案 0 :(得分:0)
不确定我理解这个问题。您是否询问sizeof(vec)
是否包含编译器包含的其他数据?是的,它确实。但是,如果指针的类型为sizeof(vec)
,则只会增加char*
。当指针的类型为type*
时,指针上的算术运算将其视为指向type
元素的数组,并对整个元素进行操作。因此,您无需使用sizeof
。
更新:
现在我已经看到你的问题编辑,我想我更了解它。基本问题是:
给定一个数组:
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 / C ++做指针算法的方式,自动乘以幕后元素的大小。