Exemplo n.º 1
0
        public void Generate(IList <VERTEX> input, bool assignIds = true, bool checkInput = false)
        {
            Clear();
            Buffer = new ObjectBuffer <VERTEX>(Dimension);
            int inputCount = input.Count;

            if (inputCount < Dimension + 1)
            {
                return;
            }

            Buffer.AddInput(input, assignIds, checkInput);
            InitConvexHull();

            // Expand the convex hull and faces.
            while (Buffer.UnprocessedFaces.First != null)
            {
                SimplexWrap <VERTEX> currentFace = Buffer.UnprocessedFaces.First;
                Buffer.CurrentVertex = currentFace.FurthestVertex;
                UpdateCenter();
                // The affected faces get tagged
                TagAffectedFaces(currentFace);

                // Create the cone from the currentVertex and the affected faces horizon.
                if (!Buffer.SingularVertices.Contains(Buffer.CurrentVertex) && CreateCone())
                {
                    CommitCone();
                }

                else
                {
                    HandleSingular();
                }

                // Need to reset the tags
                int count = Buffer.AffectedFaceBuffer.Count;

                for (int i = 0; i < count; i++)
                {
                    Buffer.AffectedFaceBuffer[i].Tag = 0;
                }
            }

            for (int i = 0; i < Buffer.ConvexSimplexs.Count; i++)
            {
                SimplexWrap <VERTEX> wrap = Buffer.ConvexSimplexs[i];
                wrap.Tag = i;
                Simplexs.Add(new Simplex <VERTEX>(Dimension));
            }

            for (int i = 0; i < Buffer.ConvexSimplexs.Count; i++)
            {
                SimplexWrap <VERTEX> wrap    = Buffer.ConvexSimplexs[i];
                Simplex <VERTEX>     simplex = Simplexs[i];
                simplex.IsNormalFlipped = wrap.IsNormalFlipped;
                simplex.Offset          = wrap.Offset;

                for (int j = 0; j < Dimension; j++)
                {
                    simplex.Normal[j]   = wrap.Normal[j];
                    simplex.Vertices[j] = wrap.Vertices[j];

                    if (wrap.AdjacentFaces[j] != null)
                    {
                        simplex.Adjacent[j] = Simplexs[wrap.AdjacentFaces[j].Tag];
                    }

                    else
                    {
                        simplex.Adjacent[j] = null;
                    }
                }

                simplex.CalculateCentroid();
            }

            Buffer.Clear();
            Buffer = null;
        }