首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C- Graphics,无法旋转多边形

C- Graphics,无法旋转多边形
EN

Stack Overflow用户
提问于 2012-04-19 00:04:25
回答 2查看 3.1K关注 0票数 0

在下面的程序中,我试图将三角形旋转45度。多边形确实旋转到了某个角度,并平移到了其他地方。请让我知道如何解决这个问题。

代码语言:javascript
复制
#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:

在输出中,红色三角形(即旋转后的三角形)看起来比原始的要大。

新代码

代码语言:javascript
复制
#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项后的代码:

代码语言:javascript
复制
#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;
}

输出:

EN

回答 2

Stack Overflow用户

发布于 2012-04-19 00:07:00

有两个问题:sincos以弧度为单位接受参数,而不是以度为单位;您可能希望将多边形围绕其中心旋转,而不是围绕(0,0)旋转。

要解决第一个问题,请更改:

代码语言:javascript
复制
angle = 45;

至:

代码语言:javascript
复制
angle = 45.0 * 2.0 * M_PI / 360.0;

要解决第二个问题,首先需要计算多边形的质心,然后进行顶点坐标相对于质心的平移。

票数 5
EN

Stack Overflow用户

发布于 2012-11-03 18:48:17

代码语言:javascript
复制
 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;

rpoly1是在rpoly改变后计算的。

试试这个;

代码语言:javascript
复制
float newX = .......;
rpoly[0] = newX;
float newY = .......;
rpoly[1] = newY;
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10213374

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档