コード例 #1
0
        private List <Point> OrderList(Point barycentre)
        {
            List <Point> sortPoints = new List <Point>();

            sortPoints = points.OrderBy(calculatedPoint =>
            {
                Vector3 vectorTest = calculatedPoint.GetPosition() - barycentre.GetPosition();
                return(MathUtils.AngleClockwise(Vector3.right, vectorTest));
            }).ThenBy(calculatedPoint => Vector3.Distance(barycentre.GetPosition(), calculatedPoint.GetPosition())).ToList();

            return(sortPoints);
        }
コード例 #2
0
        private void ComputeGraham()
        {
            Point bary = FindBarycentre();

            calculatedPoints = OrderList(bary);

            Point sInit = calculatedPoints[0];
            Point pivot = sInit;

            int  index = 0;
            bool goForward;

            do
            {
                Vector3 sourceAngle = calculatedPoints[index != 0 ? index - 1 : calculatedPoints.Count - 1].GetPosition() - pivot.GetPosition();

                Vector3 targetAngle = pivot.GetPosition() - calculatedPoints[(index + 1 == calculatedPoints.Count ? 0 : index + 1) % calculatedPoints.Count].GetPosition();

                float calculatedAngle = MathUtils.AngleClockwise(sourceAngle, targetAngle);
                if (calculatedAngle < 0)
                {
                    calculatedAngle = 2 * (float)Math.PI - calculatedAngle;
                }

                if (calculatedAngle < Math.PI)
                {
                    index = index + 1 >= calculatedPoints.Count ? 0 : index + 1;

                    pivot     = calculatedPoints[index];
                    goForward = true;
                }
                else
                {
                    index = index != 0 ? index - 1 : calculatedPoints.Count - 1;
                    sInit = calculatedPoints[index];
                    calculatedPoints.Remove(pivot);
                    pivot = sInit;

                    goForward = false;
                }
            } while (pivot != sInit || !goForward);
        }