#include <math.h> struct plane { float a, b, c, d; }; struct vertex { vertex(float sx = 0, float sy = 0, float sz = 0): x(sx), y(sy), z(sz) {}; ~vertex(){}; float x; float y; float z; vertex &operator = (vertex &vIn) { x = vIn.x; y = vIn.y; z = vIn.z; return *this; } vertex operator - (vertex vIn) { vertex t; t.x = x - vIn.x; t.y = y - vIn.y; t.z = z - vIn.z; return t; } }; plane Get_Plane(vertex *Vertex) { plane p; vertex edge1, edge2; edge1 = Vertex[1] - Vertex[0]; edge2 = Vertex[2] - Vertex[0]; p.a = edge1.y * edge2.z - edge1.z * edge2.y; p.b = edge1.z * edge2.x - edge1.x * edge2.z; p.c = edge1.x * edge2.y - edge1.y * edge2.x; float len = sqrtf(p.a * p.a + p.b * p.b + p.c * p.c); p.a = p.a / len; p.b = p.b / len; p.c = p.c / len; p.d=-(p.a*Vertex[0].x+p.b*Vertex[0].y+p.c*Vertex[0].z); return p; }; int main () { vertex Vertex[3]; Vertex[0].x = -12.0f; Vertex[0].y = 0.0f; Vertex[0].z = 12.0f; Vertex[1].x = 12.0f; Vertex[1].y = 12.0f; Vertex[1].z = 12.0f; Vertex[2].x = 12.0f; Vertex[2].y = 0.0f; Vertex[2].z = 12.0f; plane p = Get_Plane(Vertex); return 0; }
В функции main мы заполняем вершины треугольника. Причем отодвигаем треугольник по оси Z на 12 единиц от зрителя, то есть в положительном направлении оси Z. В результате выполнения этого кода мы получим плоскость:
plane p = plane(0.0, 0.0, -1.0, 12.0);
Как видим это правильное решение, так как мы отодвинули треугольник на 12 единиц по оси Z и нормаль (лицевая сторона треугольника) смотрит в отрицательном направлении оси Z, то есть -1.