Ejemplo n.º 1
0
        private static ModelVisual3D Planar(IFeature basePath)
        {
            TongJi.Geometry.Polyline curve = new TongJi.Geometry.Polyline(basePath.GeoData);
            if (curve.AlgebraicArea < 0)
            {
                curve = curve.ReversePoints();
            }
            var points = curve.Points.ToList();

            if (points.Last() == points.First())
            {
                points.RemoveAt(points.Count - 1);
            }
            var triangles = DelaunayOfPolygon(points);

            MeshBuilder mb = new MeshBuilder();

            foreach (var tri in triangles)
            {
                var a = new Point3D(tri.A.x, tri.A.y, 0);
                var b = new Point3D(tri.B.x, tri.B.y, 0);
                var c = new Point3D(tri.C.x, tri.C.y, 0);
                mb.AddTriangle(a, b, c);
            }
            ModelVisual3D visual = new ModelVisual3D();

            visual.Content = new GeometryModel3D(mb.ToMesh(), MaterialHelper.CreateMaterial(Colors.Blue));
            return(visual);
        }
        public static MeshBuilder Planar(TongJi.Geometry.Polyline curve)
        {
            if (curve.AlgebraicArea < 0)
            {
                curve = curve.ReversePoints();
            }
            var points = curve.Points.ToList();

            if (points.Last() == points.First())
            {
                points.RemoveAt(points.Count - 1);
            }
            var triangles = DelaunayOfPointSet(points);

            //var vertices = new FarseerPhysics.Common.Vertices(curve.Points.Select(p => new Microsoft.Xna.Framework.Vector2((float)p.x, (float)p.y)).ToArray());
            //var triangles = FarseerPhysics.Common.Decomposition.EarclipDecomposer.TriangulatePolygon(vertices);

            //var vertices = new TongJi.Geometry.Computational.Vertices(curve.Points.Select(p => new TongJi.Geometry.Computational.Vector2((float)p.x, (float)p.y)));
            //var decomp = new TongJi.Geometry.Computational.Decompose();
            //var triangles = decomp.Run(vertices);

            //int index0 = 0;

            //var points = curve.Points.Select(p => new Point3D((float)p.x, (float)p.y, 0)).ToList();
            //int pointCount = curve.Count;

            MeshBuilder mb = new MeshBuilder();

            //points.ForEach(p => mb.Vertices.Add(p));

            //Vector3D normal = Vector3D.Zero;
            //if (pointCount > 2)
            //{
            //    normal = (points[1] - points[0]).Cross(points[2] - points[0]).Normalize();
            //}
            //points.ForEach(p => mb.Normals.Add(normal));

            //mb.MakePlanarFaces(index0, pointCount);

            foreach (var tri in triangles)
            {
                var a = tri.A.ToPoint3D();
                var b = tri.B.ToPoint3D();
                var c = tri.C.ToPoint3D();
                mb.AddTriangle(a, b, c);
                //if ((b - a).Cross(c - a).z > 0)
                //{
                //    mb.AddTriangle(a, b, c);
                //}
                //else
                //{
                //    mb.AddTriangle(a, c, b);
                //}
            }
            return(mb);
        }