2013-05-20 231 views
0

我已经搜索了stackoverflow并找到了有用的和了解到2D形状旋转的this question旋转2D多边形形状算法

我在这样的格式

int x1=-30, x2=-15, x3=20, x4=30; 
    int my1=-30,y2=-15,y3=0,y4=15,y5=20,y6=30; 

的坐标,并有一些中心和枢转点这样

int xc=320, yc=240;//Center of the figure 
    int xp=0, yp=0;//Pivot point for this figure 

我使用该功能以绘制形状

void draw_chair() 
     {  
     int loc_xc = xc+xp; 
     int loc_yc = yc+yp; 

     line(x2+loc_xc,my1+loc_yc,x2+loc_xc,y5+loc_yc); 
     line(x3+loc_xc,my1+loc_yc,x3+loc_xc,y5+loc_yc); 
     line(x2+loc_xc,my1+loc_yc,x3+loc_xc,my1+loc_yc); 
     line(x2+loc_xc,y2+loc_yc,x3+loc_xc,y2+loc_yc); 
     line(x2+loc_xc,y3+loc_yc,x3+loc_xc,y3+loc_yc); 
     line(x1+loc_xc,y4+loc_yc,x4+loc_xc,y4+loc_yc); 
     line(x2+loc_xc,y3+loc_yc,x1+loc_xc,y4+loc_yc); 
     line(x3+loc_xc,y3+loc_yc,x4+loc_xc,y4+loc_yc); 
     line(x1+loc_xc,y4+loc_yc,x1+loc_xc,y6+loc_yc); 
     line(x4+loc_xc,y4+loc_yc,x4+loc_xc,y6+loc_yc); 
     } 

的问题是,现在我很困惑如何计算旋转后的x和y值

我试图谷歌,发现这段代码旋转

int tempx=x1; 
    x1=tempx*cos(angle)-my1*sin(angle); 
    my1=tempx*sin(angle)+my1*cos(angle); 

    tempx=x2; 
    x2=tempx*cos(angle)-y2*sin(angle); 
    y2=tempx*sin(angle)+y2*cos(angle); 

    tempx=x3; 
    x3=tempx*cos(angle)-y3*sin(angle); 
    y3=tempx*sin(angle)+y3*cos(angle); 

    tempx=x4; 
    x4=tempx*cos(angle)-y4*sin(angle); 
    y4=tempx*sin(angle)+y4*cos(angle); 

我试过,但它没有旋转的形状正常,而是这个代码转换捏成其他一些奇怪的形状。另外我有4个点和6个点,那么如何计算每个点的新值?

任何想法?或提示? 谢谢

+0

而不是从Google复制/粘贴代码,了解旋转矩阵如何工作。 – Blender

回答

4

你不能在技术上旋转坐标,因为它只是一个没有方向概念的点。

您找到的代码用于旋转矢量,这实际上是您需要的,但首先您需要将坐标转换为矢量。你可以将矢量看作是连接图形中心和点的不可见线,所以它由两个点组成,在你的情况下,你可以假设一个点是(0,0),因为你稍后用图的中心,另一个对应于您的线对(如(x2,my1),(x2,y5)...),用于您的线条绘制函数。

您的代码实际上应该成为这样的事情:

PS:除非你只在完美的角度通过,你不能指望这个数字始终与工作整数坐标。你会需要它们是双打)

int point1x, point1y; 
point1x = (int) round(x2*cos(angle)-m1y*sin(angle)); 
point1y = (int) round(x2*sin(angle)+m1y*cos(angle)); 

int point2x, point2y; 
point2x = (int) round(x2*cos(angle)-y5*sin(angle)); 
point2y = (int) round(x2*sin(angle)+y5*cos(angle)); 

... 

line(point1x+loc_xc, point1y+loc_yc, point2x+loc_xc, point2y+loc_yc); 

等。

此外,请确保您的angle值以弧度表示,因为sin()cos()函数都假定为。如果你是传承度,将它们转换为弧度先用下面的公式:

double pi = acos(-1); 
double rotation_angle = (double) angle/180.0 * pi; 

,并在上面的代码中使用rotation_angle,而不是angle

+0

真的解决了我的问题。谢谢 –

+0

嗨,我在HTML5画布中旋转点,但是当我形成一个单一的固体形状,并将其旋转到'90'角时,它看起来很奇怪,并且不能很好地旋转。你可以帮我吗?我将在pastebin中发布我的代码的几个部分:http://pastebin.com/MAD6JPuq发行打印:http://i.imgur.com/RHnzSGL.png – Hydro