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); }
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); }