алгоритм , похоже, неверный, так как правильно знак определяется через раз
опять же, что делать с вершинами, совпавшими с первой. Сейчас я их просто игнорирую при суммировании
вот код:
Раскрывающийся текст
//определить, по часовой стрелке направление или нет
bool CGrafics::Poligon_GetDirIsClock(CPoint* points,int count)const
{
if(!points || count<3)return true;
//считаем первую точку началом радиус-вектора
const LONG& x0=points[0].x;
const LONG& y0=points[0].y;
//остальные вершины представляют собой концы радиус-вектора
// для всех по очереди считаем векторное произведение
// и суммируем со знаком
double vecSumm=0;
LONG x1=points[1].x;
LONG y1=points[1].y;
for(int i=2;i<count; i++)
{
LONG x2=points[i].x;
LONG y2=points[i].y;
if(x1==x0 && y1==y0 || x2==x0 && y2==y0)
{
//одна из точек совпала с начальной точкой
}
else
{
//модуль вектора поворота надо будет разделить на произведения
//модулей векторов, чтобы не учитывалась длина векторов
LONG module1=sqrtl((x1-x0)*(x1-x0)+(y1-y0)*(y1-y0));
LONG module2=sqrtl((x2-x0)*(x2-x0)+(y2-y0)*(y2-y0));
if(module1 && module2)
{
vecSumm+=(x1*y2-y1*x2)*1.0/(module1*module2);
}
}
x1=x2;
y1=y2;
}
//знак суммы покажет направление вращения
return vecSumm>0;
}
Подскажите, кто знает, по какому алгоритму определить направление ввода полигона