27.11.2006, 22:13
общий
это ответ
Здравствуйте, Минус!
Вам нужно работать с точками, координаты которых будут храниться в вещественном виде,
т.к. при возрастании количества операций растет погрешность вычислений.
Можно, например, определить такой тип:
typedef struct tagFPOINT
{
double x;
double y;
tagFPOINT(double _x, double _y) : x(_x),y(_y) {}
tagFPOINT() {}
} FPOINT;
- точка в вещественных координатах.
Можно также сделать по-другому. Иметь массив начальных точек и массив точек повернутого полигона.
Рассчет проводить с точками из первого, а записывать результат во второй. Тогда можно использовать и целочисленные координаты. Но с вещественными все равно лучше.
Вот пример функции масштабирования относительно точки (x,y):
p-исходный массив, n-количество точек, pOut-конечный массив, Zoom-вектор масштабирования
void Resize(FPOINT *p, int n, FPOINT *pOut, FPOINT Zoom)
{
for(int i=0; i<n; ++i)
{
x1=x+(p[i].x-x)*Zoom.x;
y1=y+(p[i].y-y)*Zoom.y;
pOut[i].x=x1;
pOut[i].y=y1;
}
}
Удачи!