Несколько мыслей стоит рассмотреть здесь;
По часовой стрелке имеет смысл только относительно происхождения. Я бы подумал о происхождении как о центре тяжести множества точек. например По часовой стрелке относительно точки в среднем положении четырех точек, а не, возможно, очень далекого начала.
Если у вас есть четыре точки, 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. Если нет, я буду сортировать, основываясь на соединении между каждой точкой и источником, согласно реакции Wedges.
Edit: относительно ваших комментариев, что указывает на своп;
В случае треугольника (а, б, в), мы можем сказать, что это происходит по часовой стрелке, если третья точка с, находится на правой стороне линии аб. Я использую следующую боковую функцию для определения этого на основе координат точки;
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);
}
Если у меня есть четыре точки выпуклого многоугольника, (а, б, в, г), можно рассматривать это как два треугольника, (а, б, в) и (C, D, A). Если (a, b, c) против часовой стрелки, я изменяю обмотку (a, b, c, d) на (a, d, c, b), чтобы изменить обмотку многоугольника в целом по часовой стрелке.
Я настоятельно рекомендую нарисовать это несколькими пунктами, чтобы увидеть, о чем я говорю. Обратите внимание, что у вас есть много исключительных случаев, таких как вогнутые полигоны, коллинеарные точки, совпадающие точки и т. Д.
Вы имеете в виду по часовой стрелке вокруг начала координат? – 2008-10-28 06:41:14
Не обязательно. – 2008-10-28 06:49:06
Или он может быть по часовой стрелке вокруг бондарного центра. – vmarquez 2008-10-28 07:47:38