private MeshGeometry3D BuildCropModelGeo(ICropBox cropBox) { MeshGeometry3D geo = new MeshGeometry3D(); var hashPoint = new Dictionary <Model.Point3D, int>(); var z0tl = new Model.Point3D(cropBox.XL, cropBox.YL, cropBox.ZL); var z0tr = new Model.Point3D(cropBox.XR, cropBox.YL, cropBox.ZL); var z0bl = new Model.Point3D(cropBox.XL, cropBox.YR, cropBox.ZL); var z0br = new Model.Point3D(cropBox.XR, cropBox.YR, cropBox.ZL); var z1tl = new Model.Point3D(cropBox.XL, cropBox.YL, cropBox.ZR); var z1tr = new Model.Point3D(cropBox.XR, cropBox.YL, cropBox.ZR); var z1bl = new Model.Point3D(cropBox.XL, cropBox.YR, cropBox.ZR); var z1br = new Model.Point3D(cropBox.XR, cropBox.YR, cropBox.ZR); BuildPlane(geo, hashPoint, z0tl, z0tr, z0br, z0bl); //front BuildPlane(geo, hashPoint, z0tr, z1tr, z1br, z0br); //right BuildPlane(geo, hashPoint, z1tl, z0tl, z0bl, z1bl); //left BuildPlane(geo, hashPoint, z1tr, z1tl, z1bl, z1br); //back BuildPlane(geo, hashPoint, z1tl, z1tr, z0tr, z0tl); //top BuildPlane(geo, hashPoint, z0bl, z0br, z1br, z1bl); //bottom foreach (var source in hashPoint.OrderBy(pair => pair.Value)) { SafeAddPoint(geo, new Point3D(source.Key.X, source.Key.Y, source.Key.Z)); } return(geo); }
private static int AddPoint(Dictionary <Model.Point3D, int> points, Model.Point3D point) { int ndx; if (points.TryGetValue(point, out ndx)) { return(ndx); } points.Add(point, points.Count); return(points.Count - 1); }
private void AddRandomPolyToMesh(MeshGeometry3D mesh, Model.Point3D center, double size) { int offset = mesh.Positions.Count; if (++_randomPolyCounter > 3) { _randomPolyCounter = 0; } Point3D p1, p2, p3; switch (_randomPolyCounter) { case 0: p1 = new Point3D(center.X, center.Y, center.Z); p2 = new Point3D(center.X + size, center.Y, center.Z); p3 = new Point3D(center.X, center.Y + size, center.Z); break; case 1: p1 = new Point3D(center.X, center.Y, center.Z); p2 = new Point3D(center.X, center.Y, center.Z + size); p3 = new Point3D(center.X + size, center.Y, center.Z); break; case 2: p1 = new Point3D(center.X, center.Y, center.Z); p2 = new Point3D(center.X, center.Y + size, center.Z); p3 = new Point3D(center.X, center.Y, center.Z + size); break; case 3: p1 = new Point3D(center.X + size, center.Y, center.Z); p2 = new Point3D(center.X, center.Y, center.Z + size); p3 = new Point3D(center.X, center.Y + size, center.Z); break; default: return; } SafeAddPoint(mesh, p1); SafeAddPoint(mesh, p2); SafeAddPoint(mesh, p3); mesh.TriangleIndices.Add(offset + 0); mesh.TriangleIndices.Add(offset + 1); mesh.TriangleIndices.Add(offset + 2); }
private void BuildEndPlanes(MeshGeometry3D geo, Dictionary <Model.Point3D, int> hashPoint, List <Model.Point3D> points, bool counter) { if (points.Count < 3) { return; } var center = new Model.Point3D(); var ndx = new List <int>(); foreach (var point3D in points) { ndx.Add(AddPoint(hashPoint, point3D)); center.X += point3D.X; center.Y += point3D.Y; center.Z += point3D.Z; } ndx.Add(AddPoint(hashPoint, points.First())); center.X /= points.Count; center.Y /= points.Count; center.Z /= points.Count; var centerNdx = AddPoint(hashPoint, center); for (var i = 0; i < points.Count; i++) { if (counter) { geo.TriangleIndices.Add(ndx[i + 1]); geo.TriangleIndices.Add(ndx[i]); geo.TriangleIndices.Add(centerNdx); } else { geo.TriangleIndices.Add(centerNdx); geo.TriangleIndices.Add(ndx[i]); geo.TriangleIndices.Add(ndx[i + 1]); } } }
private void AddTriangle(MeshGeometry3D geo, Dictionary <Model.Point3D, int> hashPoint, Model.Point3D p1, Model.Point3D p2, Model.Point3D p3) { var ndx1 = AddPoint(hashPoint, p1); var ndx2 = AddPoint(hashPoint, p2); var ndx3 = AddPoint(hashPoint, p3); geo.TriangleIndices.Add(ndx1); geo.TriangleIndices.Add(ndx2); geo.TriangleIndices.Add(ndx3); }
private void BuildPlane(MeshGeometry3D geo, Dictionary <Model.Point3D, int> hashPoint, Model.Point3D p1, Model.Point3D p2, Model.Point3D p3, Model.Point3D p4) { AddTriangle(geo, hashPoint, p1, p2, p3); AddTriangle(geo, hashPoint, p3, p4, p1); }