TPolygon CreatePoly(t3dpoint p,t3dpoint punkt_na_plaszczyznie, float SIZE)
{
// SIZE = 16384.0;
TPolygon Result;
t3dpoint n, tmp;
float a, b, c,d;
d = getplaneD(p,punkt_na_plaszczyznie);
// Create a huge polygon on the given plane.
//Result.Count := 4;
a = abs(p.x);
b = abs(p.y);
c = abs(p.z);
if ((a >= b) && (a >= c) ) {
// Plane is mostly YZ-aligned.
Result.V[0] = triplesingletoT3DPOINT(-(p.y*-SIZE + p.z*-SIZE + d)/p.x, -SIZE, -SIZE);
Result.V[1] = triplesingletoT3DPOINT(-(p.y*SIZE + p.z*-SIZE + d)/p.x, SIZE, -SIZE);
Result.V[2] = triplesingletoT3DPOINT(-(p.y*SIZE + p.z*SIZE + d)/p.x, SIZE, SIZE);
Result.V[3] = triplesingletoT3DPOINT(-(p.y*-SIZE + p.z*SIZE + d)/p.x, -SIZE, SIZE);
}
if ( (b >= a) && (b >= c) ) {
// Plane is mostly XZ-aligned.
Result.V[0] = triplesingletoT3DPOINT(-SIZE, -(p.x*-SIZE + p.z*-SIZE +d)/p.y, -SIZE);
Result.V[1] = triplesingletoT3DPOINT(SIZE, -(p.x*SIZE + p.z*-SIZE + d)/p.y, -SIZE);
Result.V[2] = triplesingletoT3DPOINT(SIZE, -(p.x*SIZE + p.z*SIZE + d)/p.y, SIZE);
Result.V[3] = triplesingletoT3DPOINT(-SIZE, -(p.x*-SIZE + p.z*SIZE + d)/p.y, SIZE);
}
if ( (c >= a) && (c >= b) ) {
// Plane is mostly XY-aligned.
Result.V[0] = triplesingletoT3DPOINT(-SIZE, -SIZE, -(p.x*-SIZE + p.y*-SIZE + d)/p.z);
Result.V[1] = triplesingletoT3DPOINT(SIZE, -SIZE, -(p.x*SIZE + p.y*-SIZE + d)/p.z);
Result.V[2] = triplesingletoT3DPOINT(SIZE, SIZE, -(p.x*SIZE + p.y*SIZE + d)/p.z);
Result.V[3] = triplesingletoT3DPOINT(-SIZE, SIZE, -(p.x*-SIZE + p.y*SIZE + d)/p.z);
}
n = vectorcross(vectors_substract_v1minusv2(Result.V[0], Result.V[1]),
vectors_substract_v1minusv2(Result.V[2], Result.V[1]));
Result.normal = p;
Result.Count = 4;
if (Dot(p, n) <= 0 ) {
tmp = Result.V[1];
Result.V[1] = Result.V[3];
Result.V[3] = tmp;
}
return Result;
}
p to normalna plaszczyzny