コード例 #1
0
        public void TriangulatorTestObtuseTriangle()
        {
            ITriangulator triangulator = CreateDefaultTriangulator();

            // Use the Assert class to test conditions
            Vector3[] vertices = { new Vector3(0, 0, 0), new Vector3(2, 0, 0), new Vector3(1, 0, 0.04f) };
            triangulator.Add(vertices);

            Interpolant interp = triangulator.Find(new Vector3(0, 0, 0));

            CheckWeight(interp, 0, 1);
            CheckWeightsZero(interp, new int[] { 1, 2 });

            interp = triangulator.Find(new Vector3(2.0f, 0, 0));
            CheckWeight(interp, 1, 1);
            CheckWeightsZero(interp, new int[] { 0, 2 });

            /// This one is outside the triangle, but should interpolate to the obtuse vertex exactly.
            interp = triangulator.Find(new Vector3(1.0f, 0, 02f));
            CheckWeight(interp, 2, 1);
            CheckWeightsZero(interp, new int[] { 0, 1 });

            interp = triangulator.Find(new Vector3(1.0f, 0, 0.0f));
            //CheckWeight(interp, 2, 1);
            //CheckWeightsZero(interp, new int[] { 0, 1 });
        }
コード例 #2
0
 /// <summary> Triangulates a polygon, applying quality and constraint options. </summary>
 /// <param name="polygon">Polygon.</param>
 /// <param name="options">Constraint options.</param>
 /// <param name="quality">Quality options.</param>
 /// <param name="triangulator">The triangulation algorithm.</param>
 public static Mesh Triangulate(this Polygon polygon, ConstraintOptions options, QualityOptions quality,
                                ITriangulator triangulator)
 {
     return(triangulator
            .Triangulate(polygon.Points)
            .ApplyConstraints(polygon, options, quality));
 }
コード例 #3
0
        public void Subdivide(ITriangulator triangulator, float largestAreaFactor, float areaThreshold)
        {
            Debug.Assert(spriteMeshData != null);
            Debug.Assert(triangulator != null);

            m_VerticesTemp.Clear();
            m_EdgesTemp.Clear();
            m_EdgesTemp.AddRange(spriteMeshData.edges);

            for (int i = 0; i < spriteMeshData.vertexCount; ++i)
            {
                m_VerticesTemp.Add(spriteMeshData.GetPosition(i));
            }

            try
            {
                var indices = new List <int>();

                triangulator.Tessellate(0f, 0f, 0f, largestAreaFactor, areaThreshold, 100, m_VerticesTemp, m_EdgesTemp, indices);

                spriteMeshData.Clear();

                for (int i = 0; i < m_VerticesTemp.Count; ++i)
                {
                    spriteMeshData.AddVertex(m_VerticesTemp[i], default(BoneWeight));
                }

                spriteMeshData.edges.AddRange(m_EdgesTemp);
                spriteMeshData.indices.AddRange(indices);
            }
            catch (Exception)
            {
            }
        }
コード例 #4
0
        /// <summary>
        /// Injecting the reference to the triangulation that was newly built.
        /// </summary>
        /// <param name="triangulator">Reference to the data on the triangle that was built.</param>
        private void Initialize(ITriangulator triangulator)
        {
            this.triangulator = (SimpleTriangulator)triangulator;

            if (meshRenderer == null && meshFilter == null)
            {
                meshRenderer = gameObject.AddComponent <MeshRenderer>();
                meshFilter   = gameObject.AddComponent <MeshFilter>();

                Material[] materials = new Material[5];

                materials[0] = new Material(meshMaterial);
                materials[1] = new Material(weightsMaterial);
                materials[2] = new Material(weightsMaterial);
                materials[3] = new Material(weightsMaterial);
                materials[4] = new Material(wireFrameMaterial);

                meshRenderer.materials = materials;

                for (int i = 0; i < 3; i++)
                {
                    GameObject instantiatedGameObject = Instantiate(percentageWorldSpaceCanvasPrefab, transform);
                    SpacePinPercentageVisualizer percentageVisualizer = instantiatedGameObject.GetComponent <SpacePinPercentageVisualizer>();
                    percentageVisualizers[i] = percentageVisualizer;
                }
            }

            transform.position = new Vector3(transform.position.x, GetFrozenHeadPosition().y + verticalOffset, transform.position.z);
            triangleIsDirty    = true;
        }
コード例 #5
0
        public bool Run()
        {
            Program.PrintTitle("SETUP - DEFAULT LAUNCHER");

            // Debug?
            var debugView = AskUser("Enable step visualizer triangulation?");

            // # of triangulations?
            Console.WriteLine("\nNumber of simultaneous triangulations?");
            Console.Write("> ");
            var n = 0;

            while (!int.TryParse(Console.ReadLine(), out n))
            {
                Console.WriteLine("Invalid input! Please enter a number");
                Console.Write("\n> ");
            }

            // Setup...
            var triangulator = new ITriangulator[n];
            var sdf          = new SDF[n];

            for (int i = 0; i < n; i++)
            {
                Program.PrintTitle($"PERFORM SETUP {i + 1} of {n}");
                triangulator[i] = Program.UserInstantiation <ITriangulator>("triangulation method");
                sdf[i]          = Program.UserInstantiation <IRuntimeSDF>("signed distance function").Instance();
            }


            // Triangulate!
            Tuple <Log, IPolygon, string, long>[] result;
            if (debugView)
            {
                result = TriangulateWithLog(triangulator, sdf);
            }
            else
            {
                result = Triangulate(triangulator, sdf);
            }

            // Show result!
            if (debugView)
            {
                if (!LaunchLogView(result))
                {
                    Export(result);
                }
            }
            else
            {
                if (!LaunchView(result))
                {
                    Export(result);
                }
            }

            return(!AskUser("Restart the application?"));
        }
コード例 #6
0
    public static DTConvexPolygroup TriangulateAll(List <DTPolygon> polygonList, ITriangulator triangulator)
    {
        var triangleList = new List <List <Vector2> >();

        foreach (var poly in polygonList)
        {
            triangleList.AddRange(triangulator.PolygonToTriangleList(poly));
        }
        return(new DTConvexPolygroup(triangleList));
    }
コード例 #7
0
ファイル: solar.cs プロジェクト: Staskkk/VRPhone
        public static ITriangulator bindTo_ITriangulator(IComponentIntrospect component)
        {
            global::System.IntPtr cPtr = solarPINVOKE.bindTo_ITriangulator(IComponentIntrospect.getCPtr(component));
            ITriangulator         ret  = (cPtr == global::System.IntPtr.Zero) ? null : new ITriangulator(cPtr, true);

            if (solarPINVOKE.SWIGPendingException.Pending)
            {
                throw solarPINVOKE.SWIGPendingException.Retrieve();
            }
            return(ret);
        }
コード例 #8
0
        public static void Triangulate(this SpriteMeshData spriteMeshData, ITriangulator triangulator)
        {
            Debug.Assert(triangulator != null);

            m_VerticesTemp.Clear();

            for (int i = 0; i < spriteMeshData.vertices.Count; ++i)
            {
                m_VerticesTemp.Add(spriteMeshData.vertices[i].position);
            }

            triangulator.Triangulate(m_VerticesTemp, spriteMeshData.edges, spriteMeshData.indices);
        }
コード例 #9
0
        public void Triangulate(ITriangulator triangulator)
        {
            Debug.Assert(spriteMeshData != null);
            Debug.Assert(triangulator != null);

            m_VerticesTemp.Clear();

            for (int i = 0; i < spriteMeshData.vertexCount; ++i)
            {
                m_VerticesTemp.Add(spriteMeshData.GetPosition(i));
            }

            triangulator.Triangulate(m_VerticesTemp, spriteMeshData.edges, spriteMeshData.indices);
        }
コード例 #10
0
        public void TriangulatorTestLine()
        {
            ITriangulator triangulator = CreateDefaultTriangulator();

            Vector3[] vertices =
            {
                new Vector3(-1.3f, 0, 1.3f),
                new Vector3(-0.3f, 0, 1.3f),
                new Vector3(0.3f,  0, 1.3f),
                new Vector3(1.3f,  0, 1.3f),
                new Vector3(2.0f,  0, 1.3f),
                new Vector3(3.0f,  0, 1.3f),
                new Vector3(4.0f,  0, 1.3f)
            };
            triangulator.Add(vertices);

            Interpolant interp;

            for (int i = 0; i < vertices.Length; ++i)
            {
                interp = triangulator.Find(vertices[i]);
                CheckWeight(interp, i, 1.0f);
                CheckWeightsZero(interp, AllButOne(vertices.Length, i));
            }

            for (int i = 0; i < vertices.Length; ++i)
            {
                interp = triangulator.Find(vertices[i] + new Vector3(0.0f, 0.0f, -1.7f));
                CheckWeight(interp, i, 1.0f);
                CheckWeightsZero(interp, AllButOne(vertices.Length, i));
            }

            for (int i = 1; i < vertices.Length; ++i)
            {
                Vector3 midPoint = (vertices[i] + vertices[i - 1]) * 0.5f;
                interp = triangulator.Find(midPoint);
                CheckWeight(interp, i, 0.5f);
                CheckWeight(interp, i - 1, 0.5f);
            }

            for (int i = 1; i < vertices.Length; ++i)
            {
                Vector3 midPoint = (vertices[i] + vertices[i - 1]) * 0.5f + new Vector3(0.0f, 0.0f, 1.1f);
                interp = triangulator.Find(midPoint);
                CheckWeight(interp, i, 0.5f);
                CheckWeight(interp, i - 1, 0.5f);
            }
        }
コード例 #11
0
        public void TriangulatorTestTriangulationTime()
        {
            List <Vector3> vertices = new List <Vector3>();
            float          maxX     = 50.0f;
            float          maxZ     = 50.0f;

            for (float x = 0; x <= maxX; ++x)
            {
                for (float z = 0; z <= maxZ; ++z)
                {
                    vertices.Add(new Vector3(x, 0.0f, z));
                }
            }

            int         reduction         = 3;
            List <long> buildTimes        = new List <long>();
            List <long> findTimes         = new List <long>();
            int         maxMsPerVertBuild = 4;
            float       maxMsFind         = 1.5f;

            Stopwatch   stopwatch = new Stopwatch();
            Interpolant triIter;
            int         minVertices = reduction * 2;

            Vector3[] vertArray = vertices.ToArray();

            while (vertArray.Length >= minVertices)
            {
                ITriangulator triangulator = CreateDefaultTriangulator();
                vertArray = vertices.ToArray();
                stopwatch.Restart();
                triangulator.Add(vertArray);
                stopwatch.Stop();
                UnityEngine.Debug.Log($"Processed {vertices.Count} vertices: {stopwatch.ElapsedMilliseconds}ms");
                buildTimes.Add(stopwatch.ElapsedMilliseconds);
                Assert.IsTrue(stopwatch.ElapsedMilliseconds < vertices.Count * maxMsPerVertBuild, $"Test proc {vertArray.Length} verts took {stopwatch.ElapsedMilliseconds} ms");
                stopwatch.Restart();
                triIter = triangulator.Find(new Vector3(maxX * 0.33f, 0, maxZ * 0.33f));
                stopwatch.Stop();
                UnityEngine.Debug.Log($"Searched {vertices.Count} vertices: {stopwatch.ElapsedMilliseconds}ms");
                findTimes.Add(stopwatch.ElapsedMilliseconds);
                Assert.IsTrue(stopwatch.ElapsedMilliseconds <= maxMsFind, $"Test find {vertArray.Length} verts took {stopwatch.ElapsedMilliseconds} ms");

                vertices.RemoveRange(vertices.Count / reduction, vertices.Count - vertices.Count / reduction);
            }
        }
コード例 #12
0
        /// <summary>
        /// Check trivial interpolation at vertices and on edges connecting vertices.
        /// </summary>
        /// <param name="triangulator"></param>
        /// <param name="vertices"></param>
        private void CheckVertices(ITriangulator triangulator, Vector3[] vertices)
        {
            Interpolant interp;

            for (int i = 0; i < vertices.Length; ++i)
            {
                interp = triangulator.Find(vertices[i]);
                CheckWeight(interp, i, 1);
                CheckWeightsZero(interp, AllButOne(vertices.Length, i));

                int     next     = (i + 1) % vertices.Length;
                Vector3 midPoint = (vertices[i] + vertices[next]) * 0.5f;
                interp = triangulator.Find(midPoint);
                CheckWeight(interp, i, 0.5f);
                CheckWeight(interp, next, 0.5f);
            }
        }
コード例 #13
0
        public void TriangulatorTestSquare()
        {
            ITriangulator triangulator = CreateDefaultTriangulator();

            Vector3[] vertices =
            {
                new Vector3(-1, 0, -1),
                new Vector3(1,  0, -1),
                new Vector3(1,  0,  1),
                new Vector3(-1, 0, 1)
            };
            triangulator.Add(vertices);

            CheckVertices(triangulator, vertices);

            Interpolant interp;

            Vector3 center = Vector3.zero;

            for (int i = 0; i < vertices.Length; ++i)
            {
                center += vertices[i];
            }
            center *= 1.0f / vertices.Length;
            interp  = triangulator.Find(center);
            // Check that the interpolation is the center of either the diagonal formed by vert[0]-vert[2]
            // or the diagonal vert[1]-vert[3].
            float[] wgts = new float[vertices.Length];
            for (int i = 0; i < interp.idx.Length; ++i)
            {
                if (interp.weights[i] > 0)
                {
                    wgts[interp.idx[i]] = interp.weights[i];
                }
            }
            float eps    = 1.0e-4f;
            bool  diag02 = FloatCompare(wgts[0], 0.5f, eps) && FloatCompare(wgts[1], 0, eps) && FloatCompare(wgts[2], 0.5f, eps) && FloatCompare(wgts[3], 0, eps);
            bool  diag13 = FloatCompare(wgts[0], 0, eps) && FloatCompare(wgts[1], 0.5f, eps) && FloatCompare(wgts[2], 0, eps) && FloatCompare(wgts[3], 0.5f, eps);

            UnityEngine.Debug.Log($"diag02 {diag02}, diag13 {diag13}");
            UnityEngine.Debug.Log($"w0={wgts[0]}, w1={wgts[1]}, w2={wgts[2]}, w3={wgts[3]}");

            Assert.IsTrue((diag02 || diag13) && !(diag02 && diag13));
        }
コード例 #14
0
        public void Setup()
        {
            m_MousePosition = Vector2.zero;
            m_HoveredVertex = -1;
            m_HoveredEdge   = -1;
            m_ClosestEdge   = -1;

            m_View = Substitute.For <ISpriteMeshView>();
            m_View.mouseWorldPosition.Returns(x => m_MousePosition);
            m_View.hoveredVertex.Returns(x => m_HoveredVertex);
            m_View.hoveredEdge.Returns(x => m_HoveredEdge);
            m_View.closestEdge.Returns(x => m_ClosestEdge);
            m_View.WorldToScreen(Arg.Any <Vector2>()).Returns(x => ((Vector2)x[0] * 100f));
            m_View.IsActionTriggered(Arg.Any <MeshEditorAction>()).Returns(true);

            m_SelectedVertices = new List <int>();
            m_Selection        = Substitute.For <ISelection <int> >();
            m_Selection.Count.Returns(x => m_SelectedVertices.Count);
            m_Selection.Contains(Arg.Any <int>()).Returns(x => m_SelectedVertices.Contains((int)x[0]));
            m_Selection.elements.Returns(x => m_SelectedVertices.ToArray());
            m_Selection.activeElement.Returns(x =>
            {
                if (m_SelectedVertices.Count == 0)
                {
                    return(-1);
                }
                return(m_SelectedVertices[0]);
            });

            m_CacheUndo    = Substitute.For <ICacheUndo>();
            m_Triangulator = Substitute.For <ITriangulator>();

            m_SpriteMeshData                      = new SpriteMeshData();
            m_SpriteMeshData.frame                = new Rect(0f, 0f, 100f, 100f);
            m_SpriteMeshController                = new SpriteMeshController();
            m_SpriteMeshController.frame          = m_SpriteMeshData.frame;
            m_SpriteMeshController.spriteMeshData = m_SpriteMeshData;
            m_SpriteMeshController.spriteMeshView = m_View;
            m_SpriteMeshController.selection      = m_Selection;
            m_SpriteMeshController.cacheUndo      = m_CacheUndo;
            m_SpriteMeshController.triangulator   = m_Triangulator;

            m_SpriteMeshDataController.spriteMeshData = m_SpriteMeshData;
        }
コード例 #15
0
        public static void Subdivide(this SpriteMeshData spriteMeshData, ITriangulator triangulator, float largestAreaFactor)
        {
            Debug.Assert(triangulator != null);

            m_VerticesTemp.Clear();

            for (int i = 0; i < spriteMeshData.vertices.Count; ++i)
            {
                m_VerticesTemp.Add(spriteMeshData.vertices[i].position);
            }

            triangulator.Tessellate(0f, 0f, 0f, largestAreaFactor, 100, m_VerticesTemp, spriteMeshData.edges, spriteMeshData.indices);

            spriteMeshData.vertices.Clear();
            for (int i = 0; i < m_VerticesTemp.Count; ++i)
            {
                spriteMeshData.vertices.Add(new Vertex2D(m_VerticesTemp[i]));
            }
        }
コード例 #16
0
        public void Triangulate(ITriangulator triangulator)
        {
            Debug.Assert(spriteMeshData != null);
            Debug.Assert(triangulator != null);

            FillMeshDataContainers(ref m_VerticesTemp, ref m_EdgesTemp, out var weightData, out var hasWeightData);

            var indices = new List <int>();

            triangulator.Triangulate(m_VerticesTemp, m_EdgesTemp, indices);

            if (m_VerticesTemp.Count == 0)
            {
                spriteMeshData.Clear();
                CreateQuad();

                FillMeshDataContainers(ref m_VerticesTemp, ref m_EdgesTemp, out weightData, out hasWeightData);
                indices.Clear();
                triangulator.Triangulate(m_VerticesTemp, m_EdgesTemp, indices);
            }

            spriteMeshData.Clear();
            spriteMeshData.edges.AddRange(m_EdgesTemp);
            spriteMeshData.indices.AddRange(indices);

            var hasNewVertices = m_VerticesTemp.Count != weightData.Count;

            for (var i = 0; i < m_VerticesTemp.Count; ++i)
            {
                var boneWeight = default(BoneWeight);
                if (!hasNewVertices)
                {
                    boneWeight = weightData[i].ToBoneWeight(true);
                }
                spriteMeshData.AddVertex(m_VerticesTemp[i], boneWeight);
            }

            if (hasNewVertices && hasWeightData)
            {
                CalculateWeights(new BoundedBiharmonicWeightsGenerator(), null, 0.01f);
            }
        }
コード例 #17
0
        public void Setup()
        {
            m_MousePosition = Vector2.zero;
            m_HoveredVertex = -1;
            m_HoveredEdge   = -1;
            m_ClosestEdge   = -1;

            m_View = Substitute.For <ISpriteMeshView>();
            m_View.mouseWorldPosition.Returns(x => m_MousePosition);
            m_View.hoveredVertex.Returns(x => m_HoveredVertex);
            m_View.hoveredEdge.Returns(x => m_HoveredEdge);
            m_View.closestEdge.Returns(x => m_ClosestEdge);
            m_View.WorldToScreen(Arg.Any <Vector2>()).Returns(x => ((Vector2)x[0] * 100f));

            m_SelectedVertices = new List <int>();
            m_Selection        = Substitute.For <ISelection>();
            m_Selection.Count.Returns(x => m_SelectedVertices.Count);
            m_Selection.IsSelected(Arg.Any <int>()).Returns(x => m_SelectedVertices.Contains((int)x[0]));
            m_Selection.GetEnumerator().Returns(x => m_SelectedVertices.GetEnumerator());
            m_Selection.single.Returns(x =>
            {
                if (m_SelectedVertices.Count == 1)
                {
                    return(m_SelectedVertices[0]);
                }
                return(-1);
            });

            m_UndoObject   = Substitute.For <IUndoObject>();
            m_Triangulator = Substitute.For <ITriangulator>();

            m_SpriteMeshData       = new SpriteMeshData();
            m_SpriteMeshData.frame = new Rect(0f, 0f, 100f, 100f);
            m_SpriteMeshController = new SpriteMeshController();
            m_SpriteMeshController.spriteMeshData = m_SpriteMeshData;
            m_SpriteMeshController.spriteMeshView = m_View;
            m_SpriteMeshController.selection      = m_Selection;
            m_SpriteMeshController.undoObject     = m_UndoObject;
            m_SpriteMeshController.triangulator   = m_Triangulator;
        }
コード例 #18
0
 public GenericMesher(ITriangulator triangulator)
     : this(triangulator, RobustPredicates.Default)
 {
 }
コード例 #19
0
 public GenericMesher()
 {
     this.predicates = new RobustPredicates();
     this.triangulator = new Dwyer(this.predicates);
 }
コード例 #20
0
 public ModelSurfaceAreaCalculator(ITriangulator triangulator)
 => _triangulator = triangulator;
コード例 #21
0
 internal override void OnCreate()
 {
     m_Triangulator     = new Triangulator();
     m_OutlineGenerator = new OutlineGenerator();
     m_WeightGenerator  = new BoundedBiharmonicWeightsGenerator();
 }
コード例 #22
0
 public GenericMesher(ITriangulator triangulator)
     : this(triangulator, new Configuration())
 {
 }
コード例 #23
0
ファイル: MeshTool.cs プロジェクト: BoltSheep/CowardGame-1
 internal override void OnCreate()
 {
     m_SpriteMeshController = new SpriteMeshController();
     m_SpriteMeshView       = new SpriteMeshView(new GUIWrapper());
     m_Triangulator         = new Triangulator();
 }
コード例 #24
0
        public bool Run()
        {
            // Start up!
            Program.PrintTitle("EXPRESSION TRIANGULATION");
            Console.WriteLine("This launcher run all the following algorithms:\n");
            ITriangulator[] t = new ITriangulator[] { Program.UserInstantiation <ITriangulator>("triangulation method") };

            // Equation
            Console.WriteLine("Please enter equation containing x, y and z:");
            var         values = new HashSet <char>(new[] { 'x', 'y', 'z' });
            IExpression expr   = null;
            bool        parsed = false;

            while (!parsed)
            {
                try {
                    expr = ExpressionParser.Parse(Console.ReadLine());
                    if (expr.CanCompute(values))
                    {
                        parsed = true;
                    }
                    else
                    {
                        Console.WriteLine("\nInvalid input! The only valid variables are x, y and z");
                    }
                } catch (ArgumentException) {
                    Console.WriteLine("\nInvalid input! Please enter a valid expression");
                }
            }

            Console.WriteLine("Understood that as:");
            Console.WriteLine(expr.ToString());
            SDF[] sdf = new SDF[] { new ParsedExpression(expr) };

            // Debug?
            var debugView = AskUser("Enable step visualizer triangulation?");

            // Triangulate!
            Tuple <Log, IPolygon, string, long>[] result;
            if (debugView)
            {
                result = TriangulateWithLog(t, sdf);
            }
            else
            {
                result = Triangulate(t, sdf);
            }

            // Show result!
            if (debugView)
            {
                if (!LaunchLogView(result))
                {
                    Export(result);
                }
            }
            else
            {
                if (!LaunchView(result))
                {
                    Export(result);
                }
            }

            return(!AskUser("Restart the application?"));
        }
コード例 #25
0
 private void OnNewTriangulationWasBuilt(object sender, ITriangulator triangulation)
 {
     Initialize(triangulation);
 }
コード例 #26
0
 /// <summary>
 /// Initializes a new instance of the <see cref="GenericMesher" /> class.
 /// </summary>
 /// <param name="triangulator">The <see cref="ITriangulator" /> algorithm implementation.</param>
 public GenericMesher(ITriangulator triangulator)
     : this(triangulator, new Configuration())
 {
 }
コード例 #27
0
 public GenericMesher(ITriangulator triangulator, Configuration config)
 {
     this.config = config;
     this.triangulator = triangulator;
 }
コード例 #28
0
        public bool Run()
        {
            Program.PrintTitle("SETUP - FIGURE BUILDER");
            Console.WriteLine("This launcher let's you create a SDF operator tree");
            SDF figure = userSDF();


            Program.PrintTitle("FIGURE BUILDER");
            Console.WriteLine("You choose to create:");
            Console.WriteLine(figure.ToString());
            Console.WriteLine("Nice choice!");

            // # of triangulations?
            Console.WriteLine("\nNumber of simultaneous triangulations?");
            Console.Write("> ");
            var n = 1;

            int.TryParse(Console.ReadLine(), out n);

            // Setup...
            var triangulator = new ITriangulator[n];
            var sdf          = new SDF[n];

            for (int i = 0; i < n; i++)
            {
                Program.PrintTitle($"PERFORM SETUP {i + 1} of {n}");
                triangulator[i] = Program.UserInstantiation <ITriangulator>("triangulation method");
                sdf[i]          = figure;
            }

            // Debug?
            var debugView = AskUser("Enable step visualizer triangulation?");

            // Triangulate!
            Tuple <Log, IPolygon, string, long>[] result;
            if (debugView)
            {
                result = TriangulateWithLog(triangulator, sdf);
            }
            else
            {
                result = Triangulate(triangulator, sdf);
            }

            // Show result!
            if (debugView)
            {
                if (!LaunchLogView(result))
                {
                    Export(result);
                }
            }
            else
            {
                if (!LaunchView(result))
                {
                    Export(result);
                }
            }

            return(!AskUser("Restart the application?"));
        }
コード例 #29
0
 public PointIsInsideMesh(ITriangulator triangulator, Vector3 point)
 {
     _triangulator = triangulator;
     _point        = point;
 }
コード例 #30
0
 public GenericMesher(ITriangulator triangulator, IPredicates predicates)
 {
     this.predicates = predicates;
     this.triangulator = triangulator;
 }
コード例 #31
0
 /// <summary>
 /// Triangulates a polygon, applying quality and constraint options.
 /// </summary>
 /// <param name="options">Constraint options.</param>
 /// <param name="quality">Quality options.</param>
 /// <param name="triangulator">The triangulation algorithm.</param>
 public static IMesh Triangulate(this IPolygon polygon, ConstraintOptions options, QualityOptions quality,
     ITriangulator triangulator)
 {
     return (new GenericMesher(triangulator)).Triangulate(polygon, options, quality);
 }
コード例 #32
0
 /// <summary>
 /// Triangulates a polygon, applying quality and constraint options.
 /// </summary>
 /// <param name="polygon">Polygon instance.</param>
 /// <param name="options">Constraint options.</param>
 /// <param name="quality">Quality options.</param>
 /// <param name="triangulator">The triangulation algorithm.</param>
 public static IMesh Triangulate(this IPolygon polygon, ConstraintOptions options, QualityOptions quality,
                                 ITriangulator triangulator)
 {
     return((new GenericMesher(triangulator)).Triangulate(polygon, options, quality));
 }
コード例 #33
0
 /// <summary>
 /// Initializes a new instance of the <see cref="GenericMesher" /> class.
 /// </summary>
 /// <param name="triangulator">The <see cref="ITriangulator" /> algorithm implementation.</param>
 /// <param name="config">The <see cref="Configuration" />.</param>
 public GenericMesher(ITriangulator triangulator, Configuration config)
 {
     this.config       = config;
     this.triangulator = triangulator;
 }
コード例 #34
0
 public TriangleExtractor(ITriangulator triangulator)
 => _triangulator = triangulator;