public System.Drawing.Point[] GetBox(int scale, int centerX, int centerY, out System.Drawing.Point invisible, List <System.Windows.Forms.Label> debug) { var points = ProjectionTool.ToArray(_box); var projection = ProjectionTool.Projection(points, (double)TypeOfProjection / 2, 45); int invisibleIndex = ProjectionTool.FindInvisible(points, debug); invisibleIndex = 0; switch (invisibleIndex) { case 0: invisibleIndex = 2; break; case 1: invisibleIndex = 3; break; case 2: invisibleIndex = 0; break; case 3: invisibleIndex = 1; break; case 4: invisibleIndex = 6; break; case 5: invisibleIndex = 7; break; case 6: invisibleIndex = 4; break; case 7: invisibleIndex = 5; break; } var result = ProjectionTool.ToPoints(projection, scale, centerX, centerY); invisible = result[invisibleIndex]; return(result); }
public static int FindInvisible(double[,] points, List <System.Windows.Forms.Label> debug) { var cameraPoint = new double[, ] { { 4, 4, -5 } }; var projectedCameraPoint = ProjectionTool.Projection(cameraPoint, 1, 45); var normal = new Point(1, 1, -1); var projectedNormal = ProjectionTool.Projection(cameraPoint, 1, 45); var cameraPlain = new Plane(cameraPoint, normal);//new double[] { 1, 1, -1, -2 }; var testRes = new List <double>(); var soTest = ToJagged(points); testRes.Add(IsVisible(cameraPoint, new Plane(soTest[0], soTest[2], soTest[6]))); testRes.Add(IsVisible(cameraPoint, new Plane(soTest[2], soTest[3], soTest[7]))); testRes.Add(IsVisible(cameraPoint, new Plane(soTest[4], soTest[6], soTest[7]))); testRes.Add(IsVisible(cameraPoint, new Plane(soTest[0], soTest[1], soTest[5]))); testRes.Add(IsVisible(cameraPoint, new Plane(soTest[1], soTest[3], soTest[7]))); testRes.Add(IsVisible(cameraPoint, new Plane(soTest[0], soTest[2], soTest[3]))); int maxDistanceIndex = 0; double maxDistance = 0; for (int i = 0; i < points.GetLength(0); i++) { var currentPoint = new Point(points[i, 0], points[i, 1], points[i, 2]); var distance = PlaneDotDistance(currentPoint, cameraPlain); if (i < debug.Count) { debug[i].Text = String.Format("Distance {0}", distance); } if (distance > maxDistance) { maxDistanceIndex = i; maxDistance = distance; } } return(maxDistanceIndex); }