交叉数据结构

时间:2013-01-06 16:49:38

标签: c++ memory

我有以下结构定义:

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

1 个答案:

答案 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 ++做指针算法的方式,自动乘以幕后元素的大小。