public void TestCutter() { var a = new Point3D(1, 21, 2); var b = new Point3D(11, 11, 12); var c = new Point3D(11, 21, 2); var d = new Point3D(15, 17, 13); var e = new Point3D(3, 7, 11); var f = new Point3D(-5, 3, 3); var g = new Point3D(4, 4, 4); var i1 = new Point3D(6, 16, 7); var i2 = new Point3D(11, 16, 7); Triangle3D[] triangles = new [] { new Triangle3D(a, b, c), new Triangle3D(b, d, e), new Triangle3D(a, f, g), }; TriangulatedSurface surface = new TriangulatedSurface(triangles); Triangle3D[] resultTriangles = new [] { new Triangle3D(a, i1, i2), new Triangle3D(a, c, i2), new Triangle3D(a, f, g), }; TriangulatedSurfaceCutter cutter = new TriangulatedSurfaceCutter(); TriangulatedSurfaceCutterOptions options = (TriangulatedSurfaceCutterOptions)cutter.GetDefaultOptions(); options.CutDepth = "7 m"; var newSurface = cutter.GetModifiedSurface(surface, options); Assert.AreEqual(resultTriangles.Length, newSurface.Triangles.Length); foreach (var resultTriangle in resultTriangles) { Assert.True(newSurface.Triangles.Any(t => t.AreEqual(resultTriangle))); } }
public static Model3DGroup GetVisualModel(TriangulatedSurface triangulatedSurface) { var maxZ = triangulatedSurface.Triangles.Any() ? triangulatedSurface.Triangles.SelectMany(t => t.Points).Max(p => p.Z) : 0; var material = new MaterialGroup { Children = new MaterialCollection { new DiffuseMaterial(new SolidColorBrush(_color) { Opacity = 1.00 }), new SpecularMaterial(Brushes.LightYellow, 2.0) } }; Model3DGroup model = new Model3DGroup(); foreach (var t in triangulatedSurface.Triangles) { model.Children.Add(CreateTriangleModel(t, material, maxZ)); } return(model); }
public void TestSurfaceMover() { var a = new Point3D(2, 0, 2); var b = new Point3D(12, 0, 3); var c = new Point3D(10, 10, 1); var d = new Point3D(2, 20, 4); var e = new Point3D(12, 20, 5); Triangle3D[] triangles = new [] { new Triangle3D(a, b, c), new Triangle3D(d, e, c), new Triangle3D(a, d, c), new Triangle3D(b, e, c) }; TriangulatedSurface surface = new TriangulatedSurface(triangles); TriangulatedSurfaceMover mover = new TriangulatedSurfaceMover(); TriangulatedSurfaceMoverOptions options = (TriangulatedSurfaceMoverOptions)mover.GetDefaultOptions(); Point3D vectorToMove = new Point3D(10, 8, 3); options.X = $"{vectorToMove.X} m"; options.Y = $"{vectorToMove.Y} m"; options.Z = $"{vectorToMove.Z} m"; var newSurface = mover.GetModifiedSurface(surface, options); for (var index = 0; index < triangles.Length; index++) { var triangle = triangles[index]; Assert.True(new Triangle3D(triangle.A + vectorToMove, triangle.B + vectorToMove, triangle.C + vectorToMove).AreEqual(newSurface.Triangles[index])); } }
public double GetVolumeUnderSurface(TriangulatedSurface surface, double lowerLine) { double result = 0; foreach (var triangle in surface.Triangles) { result += GetVolumeUnderTriangle(triangle, lowerLine); } return(result); }
public TriangulatedSurface GetModifiedSurface(TriangulatedSurface surface, IOptions options) { TriangulatedSurfaceMoverOptions smOptions = (TriangulatedSurfaceMoverOptions)options; var moveVector = new Point3D(smOptions.X, smOptions.Y, smOptions.Z); return(new TriangulatedSurface( surface.Triangles.Select(p => new Triangle3D( p.A + moveVector, p.B + moveVector, p.C + moveVector )).ToArray() )); }
public void TestVolumes() { IVolumeService service = new VolumeService(); TriangulatedSurface surface = new TriangulatedSurface(new [] { new Triangle3D(new Point3D(0, 0, 10), new Point3D(10, 0, 10), new Point3D(0, 10, 10)) }); var result = service.GetVolumeUnderSurface(surface, 10); Assert.True(Equality.AreEqual(0, result)); result = service.GetVolumeUnderSurface(surface, 20); Assert.True(Equality.AreEqual(500, result)); surface = new TriangulatedSurface(new [] { new Triangle3D(new Point3D(0, 0, 10), new Point3D(10, 0, 5), new Point3D(0, 10, 10)) }); result = service.GetVolumeUnderSurface(surface, 20); Assert.True(Equality.AreEqual(500 + 250.0 / 3.0, result)); }
public TriangulatedSurface GetModifiedSurface(TriangulatedSurface surface, IOptions options) { var cutOptions = (TriangulatedSurfaceCutterOptions)options; List <Triangle3D> triangles = new List <Triangle3D>(); foreach (var triangle in surface.Triangles) { if (Equality.AreLessOrEqual(triangle.Points.Max(p => p.Z), cutOptions.CutDepth)) { triangles.Add(triangle); } else if (Equality.AreMoreOrEqual(triangle.Points.Min(p => p.Z), cutOptions.CutDepth)) { continue; } else { Point3D[] pointsToInclude = triangle.Points.Where(p => Equality.Less(p.Z, cutOptions.CutDepth)).ToArray(); List <IntersectionData> intersectionList = new List <IntersectionData>(); var intersect = Intersection(triangle.A, triangle.B, cutOptions.CutDepth); if (intersect != null) { intersectionList.Add(intersect.Value); } intersect = Intersection(triangle.B, triangle.C, cutOptions.CutDepth); if (intersect != null) { intersectionList.Add(intersect.Value); } intersect = Intersection(triangle.A, triangle.C, cutOptions.CutDepth); if (intersect != null) { intersectionList.Add(intersect.Value); } var firstPoint = pointsToInclude[0]; triangles.Add(new Triangle3D(firstPoint, intersectionList[0].Intersection, intersectionList[1].Intersection)); if (pointsToInclude.Length == 2) { var secondPoint = pointsToInclude[1]; if (intersectionList[0].HasPoint(secondPoint)) { triangles.Add(new Triangle3D(firstPoint, secondPoint, intersectionList[0].Intersection)); } else if (intersectionList[1].HasPoint(secondPoint)) { triangles.Add(new Triangle3D(firstPoint, secondPoint, intersectionList[1].Intersection)); } else { throw new Exception("Unexpected program behavior."); } } } } return(new TriangulatedSurface(triangles.ToArray())); }