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 回答