Exemplo n.º 1
0
        public void Contains_CheckContainsOfElementsThatAreInCollection_ReturnTrue(string value)
        {
            //arrange
            CircularLinkedList <string> circularList = new CircularLinkedList <string>()
            {
                "2", "2", "5", "8", "1", "6"
            };
            //act
            var contains = circularList.Contains(value);

            //assert
            Assert.True(contains);
        }
Exemplo n.º 2
0
    // Returns a polygonized mesh from a 2D outer contour
    private static void EarClipping(Contour a_rDominantOuterContour, Vector2 a_f2Scale, Vector3 a_f3PivotPoint, float a_fWidth, float a_fHeight, out Vector3[] a_rVerticesArray, out int[] a_rTrianglesArray, out Vector2[] a_rUVs)
    {
        // Sum of all contours count
        int iVerticesCount = a_rDominantOuterContour.Count;

        // Mesh vertices array
        a_rVerticesArray = new Vector3[iVerticesCount];

        // Mesh UVs array
        a_rUVs = new Vector2[iVerticesCount];

        // Vertex indexes lists array (used by ear clipping algorithm)
        CircularLinkedList <int> oVertexIndexesList = new CircularLinkedList <int>( );

        // Build contour vertex index circular list
        // Store every Vector3 into mesh vertices array
        // Store corresponding index into the circular list
        int iVertexIndex = 0;

        foreach (Vector2 f2OuterContourVertex in a_rDominantOuterContour.Vertices)
        {
            a_rVerticesArray[iVertexIndex] = f2OuterContourVertex;
            oVertexIndexesList.AddLast(iVertexIndex);

            ++iVertexIndex;
        }

        // Build reflex/convex vertices lists
        LinkedList <int> rReflexVertexIndexesList;
        LinkedList <int> rConvexVertexIndexesList;

        BuildReflexConvexVertexIndexesLists(a_rVerticesArray, oVertexIndexesList, out rReflexVertexIndexesList, out rConvexVertexIndexesList);

        // Triangles for this contour
        List <int> oTrianglesList = new List <int>(3 * iVerticesCount);

        // Build ear tips list
        CircularLinkedList <int> rEarTipVertexIndexesList = BuildEarTipVerticesList(a_rVerticesArray, oVertexIndexesList, rReflexVertexIndexesList, rConvexVertexIndexesList);

        // Remove the ear tips one by one!
        while (rEarTipVertexIndexesList.Count > 0 && oVertexIndexesList.Count > 2)
        {
            CircularLinkedListNode <int> rEarTipNode = rEarTipVertexIndexesList.First;

            // Ear tip index
            int iEarTipVertexIndex = rEarTipNode.Value;

            // Ear vertex indexes
            CircularLinkedListNode <int> rContourVertexNode = oVertexIndexesList.Find(iEarTipVertexIndex);
            CircularLinkedListNode <int> rPreviousAdjacentContourVertexNode = rContourVertexNode.Previous;
            CircularLinkedListNode <int> rNextAdjacentContourVertexNode     = rContourVertexNode.Next;

            int iPreviousAjdacentContourVertexIndex = rPreviousAdjacentContourVertexNode.Value;
            int iNextAdjacentContourVertexIndex     = rNextAdjacentContourVertexNode.Value;

            // Add the ear triangle to our triangles list
            oTrianglesList.Add(iPreviousAjdacentContourVertexIndex);
            oTrianglesList.Add(iEarTipVertexIndex);
            oTrianglesList.Add(iNextAdjacentContourVertexIndex);

            // Remove the ear tip from vertices / convex / ear lists
            oVertexIndexesList.Remove(iEarTipVertexIndex);
            rConvexVertexIndexesList.Remove(iEarTipVertexIndex);

            // Adjacent n-1 vertex
            // if was convex => remain convex, can possibly an ear
            // if was an ear => can possibly not remain an ear
            // if was reflex => can possibly convex and possibly an ear
            if (rReflexVertexIndexesList.Contains(iPreviousAjdacentContourVertexIndex))
            {
                CircularLinkedListNode <int> rPreviousPreviousAdjacentContourVertexNode = rPreviousAdjacentContourVertexNode.Previous;

                Vector3 f3AdjacentContourVertex         = a_rVerticesArray[rPreviousAdjacentContourVertexNode.Value];
                Vector3 f3PreviousAdjacentContourVertex = a_rVerticesArray[rPreviousPreviousAdjacentContourVertexNode.Value];
                Vector3 f3NextAdjacentContourVertex     = a_rVerticesArray[rPreviousAdjacentContourVertexNode.Next.Value];

                if (IsReflexVertex(f3AdjacentContourVertex, f3PreviousAdjacentContourVertex, f3NextAdjacentContourVertex) == false)
                {
                    rReflexVertexIndexesList.Remove(iPreviousAjdacentContourVertexIndex);
                    rConvexVertexIndexesList.AddFirst(iPreviousAjdacentContourVertexIndex);
                }
            }

            // Adjacent n+1 vertex
            // if was convex => remain convex, can possibly an ear
            // if was an ear => can possibly not remain an ear
            // if was reflex => can possibly convex and possibly an ear
            if (rReflexVertexIndexesList.Contains(iNextAdjacentContourVertexIndex))
            {
                CircularLinkedListNode <int> rNextNextAdjacentContourVertexNode = rNextAdjacentContourVertexNode.Next;

                Vector3 f3AdjacentContourVertex         = a_rVerticesArray[rNextAdjacentContourVertexNode.Value];
                Vector3 f3PreviousAdjacentContourVertex = a_rVerticesArray[rNextAdjacentContourVertexNode.Previous.Value];
                Vector3 f3NextAdjacentContourVertex     = a_rVerticesArray[rNextNextAdjacentContourVertexNode.Value];

                if (IsReflexVertex(f3AdjacentContourVertex, f3PreviousAdjacentContourVertex, f3NextAdjacentContourVertex) == false)
                {
                    rReflexVertexIndexesList.Remove(iNextAdjacentContourVertexIndex);
                    rConvexVertexIndexesList.AddFirst(iNextAdjacentContourVertexIndex);
                }
            }

            if (rConvexVertexIndexesList.Contains(iPreviousAjdacentContourVertexIndex))
            {
                if (IsEarTip(a_rVerticesArray, iPreviousAjdacentContourVertexIndex, oVertexIndexesList, rReflexVertexIndexesList))
                {
                    if (rEarTipVertexIndexesList.Contains(iPreviousAjdacentContourVertexIndex) == false)
                    {
                        rEarTipVertexIndexesList.AddLast(iPreviousAjdacentContourVertexIndex);
                    }
                }
                else
                {
                    rEarTipVertexIndexesList.Remove(iPreviousAjdacentContourVertexIndex);
                }
            }

            if (rConvexVertexIndexesList.Contains(iNextAdjacentContourVertexIndex))
            {
                if (IsEarTip(a_rVerticesArray, iNextAdjacentContourVertexIndex, oVertexIndexesList, rReflexVertexIndexesList))
                {
                    if (rEarTipVertexIndexesList.Contains(iNextAdjacentContourVertexIndex) == false)
                    {
                        rEarTipVertexIndexesList.AddFirst(iNextAdjacentContourVertexIndex);
                    }
                }
                else
                {
                    rEarTipVertexIndexesList.Remove(iNextAdjacentContourVertexIndex);
                }
            }

            rEarTipVertexIndexesList.Remove(iEarTipVertexIndex);
        }

        // Create UVs, rescale vertices, apply pivot
        Vector2 f2Dimensions = new Vector2(1.0f / a_fWidth, 1.0f / a_fHeight);

        for (iVertexIndex = 0; iVertexIndex < iVerticesCount; ++iVertexIndex)
        {
            Vector3 f3VertexPos = a_rVerticesArray[iVertexIndex];

            //a_rUVs[ iVertexIndex ] = Vector2.Scale( f3VertexPos, f2Dimensions );
            a_rUVs[iVertexIndex] = new Vector2(f3VertexPos.x * f2Dimensions.x, f3VertexPos.y * f2Dimensions.y);
            Vector2 f2Vertex = (f3VertexPos - a_f3PivotPoint);
            f2Vertex.x *= a_f2Scale.x;
            f2Vertex.y *= a_f2Scale.y;
            a_rVerticesArray[iVertexIndex] = f2Vertex;
        }

        a_rTrianglesArray = oTrianglesList.ToArray( );
    }
Exemplo n.º 3
0
        private static LinkedListNode<Vector2> TraverseList(CircularLinkedList<Vector2> contour,
                                                            CircularLinkedList<Vector2> entering,
                                                            CircularLinkedList<Vector2> exiting,
                                                            ICollection<Vector2> polygon,
                                                            LinkedListNode<Vector2> currentNode,
                                                            Vector2 startNode,
                                                            CircularLinkedList<Vector2> contour2)
        {
            LinkedListNode<Vector2> contourNode = contour.Find(currentNode.Value);
            if (contourNode == null)
                return null;

            entering.Remove(currentNode.Value);

            while (contourNode != null
                    &&
                        !entering.Contains(contourNode.Value)
                        &&
                        !exiting.Contains(contourNode.Value)
                    )
            {
                polygon.Add(contourNode.Value);
                contourNode = contour.NextOrFirst(contourNode);

                if (contourNode.Value == startNode)
                    return null;
            }

            entering.Remove(contourNode.Value);
            polygon.Add(contourNode.Value);

            return contour2.NextOrFirst(contour2.Find(contourNode.Value));
        }