Exemple #1
0
        public void Initialize()
        {
            float area = 0.0f;

            mDirection = GeoPolygonUtils.CalculatePolygonArea(mPolygon, ref area);
            if (mDirection == PolygonDirection.CW)
            {
                Reverse();
                mDirection = PolygonDirection.CCW;
            }
            else
            {
                area = -area;
                InitializeArray();
            }
        }
Exemple #2
0
        public static List <Vector3> CalculateConvexHull(List <Vector3> vertices, bool use2d, int ignore = 1)
        {
            List <Vector3> temp = new List <Vector3>();

            if (use2d)
            {
                int x = 0;
                int y = 1;
                if (ignore == 0)
                {
                    x = 1;
                    y = 2;
                }
                else if (ignore == 1)
                {
                    x = 0;
                    y = 2;
                }
                else
                {
                    x = 0;
                    y = 1;
                }
                List <Vector2> temp2 = new List <Vector2>();
                foreach (Vector3 v in vertices)
                {
                    temp2.Add(new Vector2(v[x], v[y]));
                }
                temp2 = JarvisConvex.BuildHull(temp2);
                GeoPolygonUtils.ReverseIfCW(ref temp2);
                foreach (Vector2 v in temp2)
                {
                    temp.Add(vertices.Find((Vector3 v3) => { return(v3[x] == v[0] && v3[y] == v[1]); }));
                }
            }
            else
            {
                temp = QuickHull.BuildHull(vertices);
            }
            return(temp);
        }
        private static void UpdateEdge(HalfEdge edgeToRemove, PriorityQueue<int, HalfEdge, float> priorityQueue, HashSet<EdgeID> deletedEdgeSet, List<Vector2> pointList)
        {
            HalfEdge left = GetUndeletedLeft(edgeToRemove, deletedEdgeSet);
            HalfEdge right = GetUndeletedRight(edgeToRemove, deletedEdgeSet);
            HalfEdge reLeft = RepresentActive(left);
            if (priorityQueue.Contain(reLeft.mKey))
	        {
		        // Check if this is still removable
                HalfEdge leftOfLeft = GetUndeletedLeft(left.mPartner, deletedEdgeSet);
                if ((leftOfLeft.mPartner != null && (leftOfLeft.mPartner.mKey == right.mKey || leftOfLeft.mPartner.mKey == edgeToRemove.mKey)) ||
                    !GeoPolygonUtils.IsConvex(pointList[edgeToRemove.mIndex], pointList[right.mNext.mIndex], pointList[leftOfLeft.mIndex]))
                {
                    priorityQueue.Remove(reLeft.mKey);
                }
                else
                {
                    // Need to update the priority
                    float pri = GetSmallestAdjacentAngleOnEdge(left, deletedEdgeSet, pointList);
                    priorityQueue.Remove(reLeft.mKey);
                    priorityQueue.Enqueue(reLeft.mKey, reLeft, pri);
                }
	        }
            HalfEdge reRight = RepresentActive(right);
            if (priorityQueue.Contain(reRight.mKey))
	        {
                HalfEdge rightOfRight = GetUndeletedRight(right, deletedEdgeSet);
                if ((rightOfRight.mPartner != null && (rightOfRight.mPartner.mKey == left.mKey || rightOfRight.mKey == edgeToRemove.mKey)) ||
                    !GeoPolygonUtils.IsConvex(pointList[edgeToRemove.mIndex], pointList[rightOfRight.mNext.mIndex], pointList[left.mIndex]))
                {
                    priorityQueue.Remove(reRight.mKey);
                }
                else
                {
                    priorityQueue.Remove(reRight.mKey);
                    priorityQueue.Enqueue(reRight.mKey, reRight, GetSmallestAdjacentAngleOnEdge(right, deletedEdgeSet, pointList));
                }
	        }
        }