gpt4 book ai didi

c++ - 交叉数据结构

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:58:22 26 4
gpt4 key购买 nike

我有以下结构定义:

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 lineSegment”指针 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

最佳答案

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

关于c++ - 交叉数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14184367/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com