Пара мыслей, которые стоит рассмотреть здесь;
По часовой стрелке имеет смысл только в отношении происхождения. Я склонен думать о происхождении как о центре тяжести множества точек. например По часовой стрелке относительно точки в среднем положении четырех точек, а не в возможно очень отдаленном начале.
Если у вас есть четыре точки a, b, c, d, существует множество порядков этих точек по часовой стрелке вокруг вашего источника. Например, если (a, b, c, d) сформировано упорядочение по часовой стрелке, то (b, c, d, a), (c, d, a, b) и (d, a, b, c)
Ваши четыре точки уже образуют многоугольник? Если это так, то это вопрос проверки и изменения намотки, а не сортировки точек, например, a, b, c, d становится d, c, b, a. Если нет, я бы отсортировал на основе отношения соединения между каждой точкой и началом координат согласно ответу Клинья.
Редактировать: относительно ваших комментариев, на какие пункты свопить;
В случае треугольника (a, b, c) мы можем сказать, что это по часовой стрелке, если третья точка c находится с правой стороны линии ab . Я использую следующую побочную функцию, чтобы определить это на основе координат точки:
int side(double x1,double y1,double x2,double y2,double px,double py)
{
double dx1,dx2,dy1,dy2;
double o;
dx1 = x2 - x1;
dy1 = y2 - y1;
dx2 = px - x1;
dy2 = py - y1;
o = (dx1*dy2)-(dy1*dx2);
if (o > 0.0) return(LEFT_SIDE);
if (o < 0.0) return(RIGHT_SIDE);
return(COLINEAR);
}
Если у меня есть четырехточечный выпуклый многоугольник, (a, b, c, d), я могу рассматривать это как два треугольника, (a, b, c) и (c, d, a). Если (a, b, c) против часовой стрелки, я изменяю обмотку (a, b, c, d) на (a, d, c, b), чтобы изменить обмотку многоугольника в целом по часовой стрелке. *
Я настоятельно рекомендую нарисовать это с несколькими образцами точек, чтобы понять, о чем я говорю. Обратите внимание, что у вас есть множество исключительных случаев, таких как вогнутые многоугольники, коллинеарные точки, совпадающие точки и т. Д ...