2013-05-20 229 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