2012-04-18 3 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

편집 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

편집 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

두 가지 문제 : sincos라디안,되지도에서 인수를; (0, 0)이 아닌 중심을 중심으로 폴리곤을 회전하고 싶을 것입니다. 다음 당신의 번역을, 당신이 먼저 다각형의 중심을 계산하는 데 필요한 두 번째 문제를 해결하려면

angle = 45.0 * 2.0 * M_PI/360.0; 

:

angle = 45; 

에 :

는 첫 번째 문제, 변화를 해결하려면 중심에 대한 정점의 좌표.

+0

센터에 대해 어떻게 회전합니까? –

+0

M_PI는 무엇을 의미합니까? 그게 키워드 야? –

+3

Failed_Noob, 폴 R은 이미 "... 먼저 다각형의 중심을 계산해야합니다."라고 말했습니다. [Wikipedia] (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; 
관련 문제