Консультация № 64479
27.11.2006, 20:19
0.00 руб.
0 1 1
Здравсвуйте!

Помогите пожалуйста...

есть многоугольник Polygon(p, n-1) p-массив точек n-их кол-во
мне надо вращать его относительно точки (x,y) - вот как я делаю
f++;
for(int i=0; i<n; i++)
{
x1=x+(p[i].x-x)*cos(f)+(p[i].y-y)*sin(f);
y1=y-(p[i].x-x)*sin(f)+(p[i].y-y)*cos(f);
p[i].x=x1;
p[i].y=y1;
}

Проблема в том что при вращение он незначительно дифформируется и через некоторое время уменьшается до прямой...

В чем моя ошибка и как мне можно исправить? Или как сделать по другому зная токо кол-во точек их начальные координаты и координаты токи относительно которой будет вращение?

Второй вопрос: Как мне сделать растяжение и сжатие этого же много угольника относительно его середины по оси Х и У? (зная начальные точки и их кол-во, ну и например коэффициент сжатия, растяжения)?

Помоги плис!!!

Обсуждение

Неизвестный
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;
}
}
Удачи!
Форма ответа