import java.security.cert.TrustAnchor; import java.util.ArrayList; public class Face { PointComp[] points; Vector3D normal; public void rotate(Matrix camMatrix){ for (PointComp point: points){ camMatrix.multiplyPoint3to(point.point, point.rotatedPoint); } } public void project(int FPDis, int scrX, int scrY){ for (PointComp point: points){ point.rotatedPoint.projectOn(FPDis, scrX, scrY, point.projectedPoint); } } public void separateTris(){ } public void calculateNormal(){ // too many new variables Point3D point0 = points[0].point; Point3D point1 = points[1].point; Point3D point2; Vector3D vec1 = new Vector3D(point1.x - point0.x, point1.y - point0.y, point1.z - point0.z); Vector3D vec2 = new Vector3D(0,0,0); // initialisation otherwise intellij gets mad // find a vector which is not inline with other vectors boolean valid = false; int i = 2; while(!valid && i < points.length) { point2 = points[i].point; vec2 = new Vector3D(point2.x - point0.x, point2.y - point0.y, point2.z - point0.z); double angle = Math.abs(vec1.angleTo(vec2)); if(angle > 0.1 && angle < 2*Math.PI - 0.1){ // if the angle between the vectors is between a threshold, the two vectors are valid. // else, calculate the second vector using a different set of points. valid = true; }} if(!valid){throw new RuntimeException("Could not calculate normal of face");} normal = new Vector3D( vec1.y*vec2.z - vec1.z*vec2.y, vec1.z*vec2.x - vec1.x*vec2.z, vec1.x*vec2.y - vec1.y*vec2.x); } }