2012-04-18 2 views
0

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

#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; 
} 

Выход: enter image description here

EDIT 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; 
} 

Выход: enter image description here

EDIT 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; 
} 

Выход:

enter image description here

ответ

5

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

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

angle = 45; 

к:

angle = 45.0 * 2.0 * M_PI/360.0; 

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

+0

Как повернуть его вокруг своего центра? –

+0

Что означает M_PI? Это ключевое слово? –

+3

Failed_Noob, Пол R уже сказал: «... вам нужно сначала вычислить центроид вашего полигона». [Википедия] (http://en.wikipedia.org/wiki/Centroid) содержит несколько алгоритмов. Или, для простого треугольника, вы можете использовать x = (Ax + Bx + Cx)/3, y = (Ay + By + Cy)/3 –

4
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; 
Смежные вопросы