2014-02-20 2 views
1

Я пытаюсь вычислить нормали каждого лица.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; 
} 
+0

Как определяется кросспродукт()? А член нормальный? Вызов выглядит подозрительно. – laune

+0

Обычный определяется как 'myVector3D * normal;' – kmaci

+2

'normal = & vect1.crossproduct (vect2);' принимает адрес * временного * - возвращаемый 'myVector3D' должен быть сохранен где-то по значению. Когда стек появляется, указатель 'normal' недействителен, а следующий вызов' crossproduct' создает следующий продукт в том же месте в стеке, поэтому его видно старым недействительным указателем. –

ответ

3

Виновником может быть "нормальным = & vect1.crossproduct (vect2)". Значение функции call «crossproduct» является временным только внутри функции «computeNormal». После выхода из этой функции эта переменная становится недействительной. Таким образом, указатель «нормальный» указывает на значение мусора. Вы можете использовать «myVector3D normal» вместо «myVector3D * normal».

+0

Когда я изменил 'myVector3D * normal;' на 'myVector3D normal;', у меня такая же проблема. – kmaci

+0

Вы изменили 'normal = vect1.crossproduct (vect2);' тоже правильно? – taytay