Я пытаюсь вычислить нормали каждого лица.Computing face normal in C++
void myFace::computeNormal()
{
myHalfedge* e1 = adjacent_halfedge;
myHalfedge* e2 = e1->prev;
myVertex* v1 = e1->source;
myVertex* v2 = e2->source;
myVertex* v3 = (e1->next)->source;
myPoint3D* p1 = v1->point;
myPoint3D* p2 = v2->point;
myPoint3D* p3 = v3->point;
myVector3D vect1 = *p3-*p1;
myVector3D vect2 = *p2-*p1;
normal = &vect1.crossproduct(vect2);
}
void myMesh::computeNormals()
{
myFace* f = NULL;
for (int i = 0; i < faces.size(); i++)
{
f = faces[i];
f->computeNormal();
}
}
f->computeNormal();
Но когда называется, все предыдущие значения заменяются последним вычисленным значением. Может ли кто-нибудь дать мне совет, что должно быть неправильно?
РЕДАКТИРОВАТЬ (Добавлено векторное произведение)
void myVector3D::crossproduct(myVector3D & v1, myVector3D & v2)
{
dX = v1.dY * v2.dZ - v1.dZ * v2.dY;
dY = v1.dZ * v2.dX - v1.dX * v2.dZ;
dZ = v1.dX * v2.dY - v1.dY * v2.dX;
}
myVector3D myVector3D::crossproduct(myVector3D & v1)
{
myVector3D result;
result.crossproduct(*this, v1);
return result;
}
Как определяется кросспродукт()? А член нормальный? Вызов выглядит подозрительно. – laune
Обычный определяется как 'myVector3D * normal;' – kmaci
'normal = & vect1.crossproduct (vect2);' принимает адрес * временного * - возвращаемый 'myVector3D' должен быть сохранен где-то по значению. Когда стек появляется, указатель 'normal' недействителен, а следующий вызов' crossproduct' создает следующий продукт в том же месте в стеке, поэтому его видно старым недействительным указателем. –