public static TriangleNet.Geometry.Polygon TriangleNetPolygon(this Polygon this_)
        {
            TriangleNet.Geometry.Polygon polygon = new TriangleNet.Geometry.Polygon();

            int boundary = 1;
            List <TriangleNet.Geometry.Vertex> vertices = new List <TriangleNet.Geometry.Vertex>();

            this_.EnumeratePolygons((Polygon eachPolygon) =>
            {
                // Collect vertices.
                vertices.Clear();
                eachPolygon.EnumeratePoints((Vector2 eachPoint) =>
                {
                    vertices.Add(new TriangleNet.Geometry.Vertex(
                                     (double)eachPoint.x,
                                     (double)eachPoint.y,
                                     boundary
                                     ));
                });

                // Add controur.
                polygon.Add(new TriangleNet.Geometry.Contour(vertices.ToArray(), boundary));

                // Track.
                boundary++;
            });

            return(polygon);
        }
Esempio n. 2
0
        private TriangleNet.Geometry.Polygon createPolygon()
        {
            TriangleNet.Geometry.Polygon polygon = new TriangleNet.Geometry.Polygon();

            for (int i = 0; i < vertexCount; i++)
            {
                Vector2 vector = Random.insideUnitCircle * radius;
                TriangleNet.Geometry.Vertex v = new TriangleNet.Geometry.Vertex(vector.x, vector.y);

                polygon.Add(v);
            }

            return(polygon);
        }
Esempio n. 3
0
        private TriangleNet.Mesh createMesh()
        {
            TriangleNet.Geometry.Polygon          polygon = createPolygon();
            TriangleNet.Meshing.ConstraintOptions options = new TriangleNet.Meshing.ConstraintOptions()
            {
                ConformingDelaunay = true
            };
            TriangleNet.Meshing.GenericMesher mesher = new TriangleNet.Meshing.GenericMesher();

            TriangleNet.Mesh mesh = (TriangleNet.Mesh)mesher.Triangulate(polygon, options);

            TriangleNet.Smoothing.SimpleSmoother smoother = new TriangleNet.Smoothing.SimpleSmoother();
            smoother.Smooth(mesh, smoothingIterations);

            return(mesh);
        }
Esempio n. 4
0
        static private void Test2dMesher()
        {
            // make a 2 non intersecting, non overlapping boxes put a hole in one of them and make sure the mesher does its job properly.

            var Pts   = new List <TriangleNet.Geometry.Vertex>();
            var Lines = new List <TriangleNet.Geometry.IEdge>();
            var Poly  = new TriangleNet.Geometry.Polygon();

            // box1
            Poly.Add(new TriangleNet.Geometry.Vertex(0, 0));
            Poly.Add(new TriangleNet.Geometry.Vertex(1, 0));
            Poly.Add(new TriangleNet.Geometry.Edge(0, 1));
            Poly.Add(new TriangleNet.Geometry.Vertex(1, 1));
            Poly.Add(new TriangleNet.Geometry.Edge(1, 2));
            Poly.Add(new TriangleNet.Geometry.Vertex(0, 1));
            Poly.Add(new TriangleNet.Geometry.Edge(2, 3));
            Poly.Add(new TriangleNet.Geometry.Edge(3, 0));
            // box2
            Poly.Add(new TriangleNet.Geometry.Vertex(2, 2));
            Poly.Add(new TriangleNet.Geometry.Vertex(3, 2));
            Poly.Add(new TriangleNet.Geometry.Edge(4, 5));
            Poly.Add(new TriangleNet.Geometry.Vertex(3, 3));
            Poly.Add(new TriangleNet.Geometry.Edge(5, 6));
            Poly.Add(new TriangleNet.Geometry.Vertex(2, 3));
            Poly.Add(new TriangleNet.Geometry.Edge(6, 7));
            Poly.Add(new TriangleNet.Geometry.Edge(7, 4));
            // hole in box1
            Poly.Add(new TriangleNet.Geometry.Vertex(.25, .25));
            Poly.Add(new TriangleNet.Geometry.Vertex(.75, .25));
            Poly.Add(new TriangleNet.Geometry.Edge(8, 9));
            Poly.Add(new TriangleNet.Geometry.Vertex(.75, .75));
            Poly.Add(new TriangleNet.Geometry.Edge(9, 10));
            Poly.Add(new TriangleNet.Geometry.Vertex(.25, .75));
            Poly.Add(new TriangleNet.Geometry.Edge(10, 11));
            Poly.Add(new TriangleNet.Geometry.Edge(11, 8));

            TriangleNet.IO.TriangleWriter.WritePoly(Poly, "MultiplePolyTest.poly");
        }
        public static List <Polyline> DelaunayTriangulation(this Polyline outerCurve, List <Polyline> innerCurves = null, double offsetDistance = -0.001, bool conformingDelaunay = true)
        {
            if (outerCurve == null)
            {
                BH.Engine.Base.Compute.RecordError("Cannot perform Delaunay Triangulation on an outer curve that is set to null.");
                return(new List <Polyline>());
            }

            // Create a zero length list if no holes input
            if (innerCurves == null)
            {
                innerCurves = new List <Polyline>();
            }

            double area = outerCurve.Area();

            for (int x = 0; x < innerCurves.Count; x++)
            {
                Polyline pLine = outerCurve.BooleanDifference(new List <Polyline> {
                    innerCurves[x]
                })[0];

                if (pLine.Area() != area)
                {
                    //The boolean difference returned a different polyline - offset this inner curve
                    innerCurves[x] = innerCurves[x].Offset(offsetDistance);
                }
            }

            // Get the transformation matrix
            Plane           plane           = outerCurve.IFitPlane();
            Vector          normal          = plane.Normal;
            List <Point>    vertices        = outerCurve.IDiscontinuityPoints();
            Point           refPoint        = vertices.Min();
            Point           refPointP       = BH.Engine.Geometry.Create.Point(refPoint.X, refPoint.Y, 0);
            Vector          zVector         = BH.Engine.Geometry.Create.Vector(0, 0, 1);
            Vector          rotationVector  = normal.CrossProduct(zVector).Normalise();
            double          rotationAngle   = normal.Angle(zVector);
            TransformMatrix transformMatrix = BH.Engine.Geometry.Create.RotationMatrix(vertices.Min(), rotationVector, rotationAngle);

            // Get the translation vector
            Vector translateVector = refPointP - refPoint;

            // Transform the original input curve/s
            Polyline        transformedCurve = Modify.Translate(outerCurve.Transform(transformMatrix), translateVector);
            List <Polyline> transformedHole  = new List <Polyline>();

            foreach (Polyline h in innerCurves)
            {
                if (h.IsCoplanar(outerCurve))
                {
                    transformedHole.Add(Modify.Translate(h.Transform(transformMatrix), translateVector));
                }
            }

            // Convert geometry to Triangle inputs
            TriangleNet.Geometry.Polygon       parentPolygon  = new TriangleNet.Geometry.Polygon();
            List <TriangleNet.Geometry.Vertex> parentVertices = new List <TriangleNet.Geometry.Vertex>();

            foreach (Point point in transformedCurve.IDiscontinuityPoints())
            {
                parentPolygon.Add(new TriangleNet.Geometry.Vertex(point.X, point.Y));
                parentVertices.Add(new TriangleNet.Geometry.Vertex(point.X, point.Y));
            }
            TriangleNet.Geometry.Contour parentContour = new TriangleNet.Geometry.Contour(parentVertices);
            parentPolygon.Add(parentContour);

            foreach (Polyline h in transformedHole)
            {
                List <TriangleNet.Geometry.Vertex> childVertices = new List <TriangleNet.Geometry.Vertex>();
                foreach (Point point in h.IDiscontinuityPoints())
                {
                    childVertices.Add(new TriangleNet.Geometry.Vertex(point.X, point.Y));
                }
                TriangleNet.Geometry.Contour childContour = new TriangleNet.Geometry.Contour(childVertices);
                Point childCentroid = h.PointInRegion();
                parentPolygon.Add(childContour, new TriangleNet.Geometry.Point(childCentroid.X, childCentroid.Y));
            }

            // Triangulate
            TriangleNet.Meshing.ConstraintOptions options = new TriangleNet.Meshing.ConstraintOptions()
            {
                ConformingDelaunay = conformingDelaunay,
            };
            TriangleNet.Meshing.QualityOptions quality = new TriangleNet.Meshing.QualityOptions()
            {
            };
            TriangleNet.Mesh mesh = (TriangleNet.Mesh)TriangleNet.Geometry.ExtensionMethods.Triangulate(parentPolygon, options, quality);

            // Convert triangulations back to BHoM geometry
            List <Polyline> translatedPolylines = new List <Polyline>();

            foreach (var face in mesh.Triangles)
            {
                // List points defining the triangle
                List <Point> pts = new List <Point>();
                pts.Add(BH.Engine.Geometry.Create.Point(face.GetVertex(0).X, face.GetVertex(0).Y));
                pts.Add(BH.Engine.Geometry.Create.Point(face.GetVertex(1).X, face.GetVertex(1).Y));
                pts.Add(BH.Engine.Geometry.Create.Point(face.GetVertex(2).X, face.GetVertex(2).Y));
                pts.Add(pts.First());
                translatedPolylines.Add(BH.Engine.Geometry.Create.Polyline(pts));
            }

            // Translate back to original plane
            List <Polyline> meshPolylines = new List <Polyline>();

            foreach (Polyline pl in translatedPolylines)
            {
                TransformMatrix matrixTransposed = transformMatrix.Invert();
                Polyline        meshPolyline     = pl.Translate(-translateVector).Transform(transformMatrix.Invert());
                meshPolylines.Add(meshPolyline);
            }

            return(meshPolylines);
        }