0

法線として保存するベクトルの配列を作成しています。クラスでベクトルを使用する方法をまだ学習していないため、同様に機能する構造体を作成しました。

struct vector3
{
    double xcoord;
    double ycoord;
    double zcoord;
};

次に、関数の最初に、これがあります。

vector3 vector;
vector3* normalField = new vector3[x];

関数がループする間、各ループで新しい値を「ベクトル」に適用します。関数の最後で、配列の一部をベクトルに設定します。

normalField[x] = vector;

アイデアは、大量の新しいベクトルを作成しないことでメモリを節約することです。これは、そのベクトルのグループに対していつどこで削除機能を使用できるかがわからないためです。これは機能しますか?か否か?これを行う最善の方法は何ですか?

コードは全体として非常に冗長です。手続き的に生成された地形の法線フィールドを作成するアルゴリズムを作成しています。なんらかの愚かな理由で、組み込みのベクトル クラスを使用することは想定されていないため、使用しません。教授を責めます。

4

2 に答える 2

3

割り当て normalField[x] = vector は、データを vector にディープ コピーします。normalField[] にある要素と同じ数のベクトルを作成します。

C++ では、構造体とクラスの唯一の違いは、構造体のデータ メンバーと関数はデフォルトでパブリックですが、クラスではデフォルトでプライベートであることも覚えておいてください。

于 2013-05-16T18:51:58.280 に答える
0

必要なものは、配列を介して実装し、ベクトルの必要性が高まったときに新しいより大きな配列を作成する (基本的に の動作を複製するstd::vector) か、次のようなリンク リストを使用して実装できます。

struct vector3List {
     vector3 v;
     vector3List * next;
};

もちろん、より洗練されたソリューションも存在しますが、その選択はベクトルに対して何をする必要があるかによって異なります。

リストの使用方法がわからない場合は、次の例をご覧ください。

vector3List * listBegin = new vector3List();
// Setup your vector
listBegin->v.coordX = 6;
// Set the end of the list
listBegin->next = 0;

// You need one more vector
listBegin->next = new vector3List();
// Use some kind of helper pointer to keep track of what vector you are examining
// if you need it
vector3List * iterator = listBegin->next;
// Setup this new second vector
iterator->v.coordX = 5;
// Remember to set the end of the list!
iterator->next = 0;

// Iterate throgh the list
iterator = listBegin;
while ( iterator != 0 ) {
    // Do stuff
    iterator = iterator->next;
}

もちろん、これは単純な実装ですが、アイデアは得られます。

于 2013-05-16T19:06:39.307 に答える