次の構造体定義があります。
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; }
};
私の仕事は、与えられたポイント A が与えられたポリゴン P の内側にあるかどうかを決定するメソッド isPointInside(const vec &A, const polygon &P) を書くことです。
私の実装
まず、私の方法は、A から点 B で終わる線分 L を作成します。これは間違いなく多角形の外側です。次に、線分 L と交差する多角形のすべての境界を数えます。多角形 P の数えられた境界が奇数である場合、指定された点 A は、指定された多角形 P の内側にあります。
2 つの線分が交差するかどうかを調べるために使用する方法には、次の関数宣言があります。
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