C - Графика, невозможно повернуть многоугольник

В приведенной ниже программе я пытаюсь повернуть треугольник на 45 градусов против часовой стрелки. Многоугольник действительно повернулся на некоторый угол и переместился в какое-то другое место. Пожалуйста, дайте мне знать, как это можно исправить.

#include<stdio.h>
#include<conio.h>
#include<graphics.h>
#include<math.h>

int main(void)
{
 int poly[8], rpoly[8],angle;
 int gd = DETECT, gm;
 initgraph(&gd,&gm,"C:\\TC\\BGI");

 printf("\n Enter co-ordinates for Triangle :  \n\n");

 printf("Vertex 1 (x,y)  : ");
 scanf("%d %d", &poly[0], &poly[1]);
 printf("Vertex 2 (x,y)  : ");
 scanf("%d %d", &poly[2], &poly[3]);
 printf("Vertex 3 (x,y)  : ");
 scanf("%d %d", &poly[4], &poly[5]);
 poly[6] = poly[0];
 poly[7] = poly[1];

 setcolor(2);
 drawpoly(4,poly);

 angle = 45;
 rpoly[0] = poly[0]*cos(angle) - poly[1]*sin(angle);
 rpoly[1] = poly[0]*sin(angle) + poly[1]*cos(angle);

 rpoly[2] = poly[2]*cos(angle) - poly[3]*sin(angle);
 rpoly[3] = poly[2]*sin(angle) + poly[3]*cos(angle);

 rpoly[4] = poly[4]*cos(angle) - poly[5]*sin(angle);
 rpoly[5] = poly[4]*sin(angle) + poly[5]*cos(angle);

 rpoly[6] = rpoly[0];
 rpoly[7] = rpoly[1];

 setcolor(4);
 drawpoly(4,rpoly);

 getch();
 closegraph();
 return 0;
}

Вывод: введите здесь описание изображения

РЕДАКТИРОВАТЬ 1:

В выходных данных красный треугольник (т.е. треугольник после вращения) выглядит больше, чем исходный.

Новый код

#include<stdio.h>
#include<conio.h>
#include<graphics.h>
#include<math.h>

int main(void)
{
 int poly[8], rpoly[8], angle, centroid_x, centroid_y,i;
 int gd = DETECT, gm;
 initgraph(&gd,&gm,"C:\\TC\\BGI");

 printf("\n Enter co-ordinates for Triangle :  \n\n");

 printf("Vertex 1 (x,y)  : ");
 scanf("%d %d", &poly[0], &poly[1]);
 printf("Vertex 2 (x,y)  : ");
 scanf("%d %d", &poly[2], &poly[3]);
 printf("Vertex 3 (x,y)  : ");
 scanf("%d %d", &poly[4], &poly[5]);
 poly[6] = poly[0];
 poly[7] = poly[1];

 setcolor(2);
 drawpoly(4,poly);

 angle = 45 * 2 * 3.14 / 360;
 centroid_x =  (poly[0] + poly[2] + poly[4]) / 3;
 centroid_y =  (poly[1] + poly[3] + poly[5]) / 3;

 rpoly[0] = (poly[0] - centroid_x) * cos(angle)  -  (poly[1] - centroid_y) * sin(angle)  +  centroid_x;
 rpoly[1] = (poly[0] - centroid_x) * sin(angle)  -  (poly[1] - centroid_y) * cos(angle)  +  centroid_y;

 rpoly[2] = (poly[2] - centroid_x) * cos(angle)  -  (poly[3] - centroid_y) * sin(angle)  +  centroid_x;
 rpoly[3] = (poly[2] - centroid_x) * sin(angle)  -  (poly[3] - centroid_y) * cos(angle)  +  centroid_y;

 rpoly[4] = (poly[4] - centroid_x) * cos(angle)  -  (poly[5] - centroid_y) * sin(angle)  +  centroid_x;
 rpoly[5] = (poly[4] - centroid_x) * sin(angle)  -  (poly[5] - centroid_y) * cos(angle)  +  centroid_y;

 rpoly[6] = rpoly[0];
 rpoly[7] = rpoly[1];

 setcolor(4);
 drawpoly(4,rpoly);

 for(i=0;i<7;i++)
 {printf("\n %d", &rpoly[i]);}

 getch();
 closegraph();
 return 0;
}

OutPut: введите здесь описание изображения

РЕДАКТИРОВАТЬ 2:

Код после исправления Y-членов:

#include<stdio.h>
#include<conio.h>
#include<graphics.h>
#include<math.h>

int main(void)
{
 int poly[8], rpoly[8], angle, centroid_x, centroid_y,i;
 int gd = DETECT, gm;
 initgraph(&gd,&gm,"C:\\TC\\BGI");

 printf("\n Enter co-ordinates for Triangle :  \n\n");

 printf("Vertex 1 (x,y)  : ");
 scanf("%d %d", &poly[0], &poly[1]);
 printf("Vertex 2 (x,y)  : ");
 scanf("%d %d", &poly[2], &poly[3]);
 printf("Vertex 3 (x,y)  : ");
 scanf("%d %d", &poly[4], &poly[5]);
 poly[6] = poly[0];
 poly[7] = poly[1];

 setcolor(2);
 drawpoly(4,poly);

 angle = 45 * 2 * 3.14 / 360;
 centroid_x =  (poly[0] + poly[2] + poly[4]) / 3;
 centroid_y =  (poly[1] + poly[3] + poly[5]) / 3;

 rpoly[0] = (poly[0] - centroid_x) * cos(angle)  -  (poly[1] - centroid_y) * sin(angle)  +  centroid_x;
 rpoly[1] = (poly[0] - centroid_x) * sin(angle)  +  (poly[1] - centroid_y) * cos(angle)  +  centroid_y;

 rpoly[2] = (poly[2] - centroid_x) * cos(angle)  -  (poly[3] - centroid_y) * sin(angle)  +  centroid_x;
 rpoly[3] = (poly[2] - centroid_x) * sin(angle)  +  (poly[3] - centroid_y) * cos(angle)  +  centroid_y;

 rpoly[4] = (poly[4] - centroid_x) * cos(angle)  -  (poly[5] - centroid_y) * sin(angle)  +  centroid_x;
 rpoly[5] = (poly[4] - centroid_x) * sin(angle)  +  (poly[5] - centroid_y) * cos(angle)  +  centroid_y;

 rpoly[6] = rpoly[0];
 rpoly[7] = rpoly[1];

 setcolor(4);
 drawpoly(4,rpoly);

// for(i=0;i<8;i++)
// {printf("\n %d", &rpoly[i]);}

 getch();
 closegraph();
 return 0;
}

Вывод:

введите здесь описание изображения


person Failed_Noob    schedule 18.04.2012    source источник


Ответы (2)


Две проблемы: sin и cos принимают аргументы в радианах, а не в градусах; и вы, вероятно, хотите повернуть свой многоугольник вокруг его центра, а не вокруг (0, 0).

Чтобы решить первую проблему, измените:

angle = 45;

to:

angle = 45.0 * 2.0 * M_PI / 360.0;

Чтобы решить вторую проблему, вам нужно сначала вычислить центроид вашего многоугольника, а затем выполнить перевод координат вершин относительно центроида.

person Paul R    schedule 18.04.2012
comment
Как повернуть его вокруг центра? - person Failed_Noob; 18.04.2012
comment
Что означает M_PI? Это ключевое слово? - person Failed_Noob; 18.04.2012
comment
Failed_Noob, Пол Р уже сказал... вам нужно сначала вычислить центроид вашего многоугольника. В Википедии перечислены несколько алгоритмов. Или для простого треугольника вы можете использовать x = (Ax + Bx + Cx) / 3, y = (Ay + By + Cy) / 3. - person Brendon Cheves; 18.04.2012
comment
M_PI — это просто константа для числа Пи. - person Brendon Cheves; 18.04.2012
comment
Сомневаюсь... будет ли это работать, если я поверну каждую точку, используя формулу, предоставленную Беном здесь ... - person Failed_Noob; 18.04.2012
comment
Да, это должно работать, но обратите внимание, что вам все равно нужно вычислить центр тяжести, так как это даст вам ox, oy, то есть точку, относительно которой вы собираетесь выполнять вращение. - person Paul R; 18.04.2012
comment
Я вставил новый код вместе с его выводом. Пожалуйста, посмотрите. - person Failed_Noob; 18.04.2012
comment
Но в ответе Бена это указано как p'x = cos(theta) * (px-ox) - sin(theta) * (py-oy) + ox - person Failed_Noob; 18.04.2012
comment
Также `rpoly[6] = rpoly[0]; rpoly[7] = rpoly[1]; ` но выходные значения для rpoly[6] и rpoly[7] неверны. Даже после того, как я сделаю for(i=0;i<8;i++) - person Failed_Noob; 18.04.2012
comment
Мое плохое - я быстро вернулся к геометрии конверта и чрезмерно упростил. Используйте формулы Бена. - person Paul R; 18.04.2012
comment
Обратите внимание, что похоже, что у вас есть ошибка в терминах Y — вам нужно + вместо -. - person Paul R; 18.04.2012
comment
Исправил Y-члены, и теперь треугольник выглядит вытянутым o.O. См. вывод - person Failed_Noob; 18.04.2012

 rpoly[0] = (poly[0] - centroid_x) * cos(angle)  -  (poly[1] - centroid_y) * sin(angle)  +  centroid_x;
 rpoly[1] = (poly[0] - centroid_x) * sin(angle)  +  (poly[1] - centroid_y) * cos(angle)  +  centroid_y;

rpoly[1] вычисляется после изменения rpoly[0].

попробуй это;

float newX = .......;
rpoly[0] = newX;
float newY = .......;
rpoly[1] = newY;
person momstouch    schedule 03.11.2012