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(const vec &A, const polygon &P) 来确定给定点 A 是否在给定多边形 P 内。

我的实现
首先,我的方法创建了一条线段 L,从 A 开始,到 B 点结束,这绝对是在多边形之外。其次,它计算与线段 L 相交的多边形的所有边界。如果多边形 P 的计算边界是奇数,则给定点 A 恰好在给定多边形 P 内。

我用来找出两条线段是否相交的方法具有以下函数声明:

bool intersect(const line&, const line&);

多边形是定义多边形的所有角点的数组。具有 n 个角点的多边形 P

P = (P1, P2, ..., PN)

具有以下边界:

(P1, P2), (P2, P3), ..., (P(N-1), PN), (PN, P1)

要遍历所有边界,我想使用“const lineSegment”指针 polyBorder,它指向 polyBorder.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
4

1 回答 1

0

不确定我是否理解这个问题。您是在问是否sizeof(vec)包含编译器包含的附加数据?是的,它确实。sizeof(vec)但是,如果您的指针是 type ,您只会增加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++ 进行指针运算的方式,自动乘以幕后元素的大小。

于 2013-01-06T16:59:49.220 回答