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; }
};

私の仕事は、与えられたポイント 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
4

1 に答える 1

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++ がポインター演算を行う方法を利用して、舞台裏で要素のサイズを自動的に乗算します。

于 2013-01-06T16:59:49.220 に答える