예제 #1
0
        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)));
            }
        }
예제 #2
0
파일: SurfaceModel.cs 프로젝트: tihilv/Pat
        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);
        }
예제 #3
0
        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]));
            }
        }
예제 #4
0
파일: VolumeService.cs 프로젝트: tihilv/Pat
        public double GetVolumeUnderSurface(TriangulatedSurface surface, double lowerLine)
        {
            double result = 0;

            foreach (var triangle in surface.Triangles)
            {
                result += GetVolumeUnderTriangle(triangle, lowerLine);
            }

            return(result);
        }
예제 #5
0
        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()
                       ));
        }
예제 #6
0
파일: MathTests.cs 프로젝트: tihilv/Pat
        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));
        }
예제 #7
0
        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()));
        }