2014-02-26 42 views
0

我正在使用C++,Allegro5和代碼塊。我正在寫一個測試程序,然後寫一個非常基本的小行星敲除。唯一的規則是使用C++,Allegro,並且沒有精靈或位圖(這特別需要使用線條和形狀等基元)。C++ Allegro第一個顯示程序 - 轉換旋轉刻度

我正在繪製象限1中的形狀,在相對原點翻譯的象限2中重繪它,重繪三次,旋轉一定的度數,最後繪製它在象限4中重新縮放。

部件1 2和4工作正常。我的問題是旋轉功能。它沒有旋轉正確的數量,或者根本不旋轉。小於90時,它旋轉輸入角度的一半。之後,它不旋轉或不繪製。

我將在下面發佈輪換方法代碼。我知道它很臃腫,需要清理(我剛剛修復了一些修復1,2和4的邏輯),但我真的需要旋轉幫助。 我想我使用ATAN2正確,我已經變成

void rotation (float degrees) 
{ 
    ALLEGRO_COLOR color_black = al_map_rgb(0,0,0); 
    ALLEGRO_COLOR color_blue = al_map_rgb(150,150,150); 
    ALLEGRO_COLOR color_orange = al_map_rgb(255,135,135); 
    ALLEGRO_COLOR color_red = al_map_rgb(255,0,0); 
    al_clear_to_color(al_map_rgb(255,255,255)); //clear screen to white 
//draw black grid 
    al_draw_line(400,0, 400,600, color_black, 4.0); 
    al_draw_line(0,300, 800,300, color_black, 4.0); 
    al_draw_line(200,0, 200,600, color_black, 1.0); 
    al_draw_line(600,0, 600,600, color_black, 1.0); 
    al_draw_line(0,150, 800,150, color_black, 1.0); 
    al_draw_line(0,450, 800,450, color_black, 1.0); 

    float rx[13], ry[13]; 
    float phi, theta, radius; //phi original angle theta added angle of rotation 
    float ycenter = 0, xcenter = 0; //later will be used with varying object position 

    theta = degrees * PI/180.0; 

    for (int i = 0; i < 13; i++) 
    { 
    phi = atan2(yarray[i], xarray[i]); 
    radius = sqrt(pow((xarray[i]-xcenter),2.0) + pow((yarray[i]-ycenter),2.0)); 
    rx[i] = xarray[i] + radius * cos(phi + theta); 
    ry[i] = yarray[i] + radius * sin(phi + theta); 
    } 

    float x = quad[2][0]; 
    float y = quad[2][1]; 

    al_draw_triangle(x+rx[0],y+ry[0], x+rx[1],y+ry[1], x+rx[2],y+ry[2], color_red, 10); 
    al_draw_filled_triangle(x+rx[3],y+ry[3], x+rx[4],y+ry[4], x+rx[5],y+ry[5], color_orange); 
    al_draw_filled_triangle(x+rx[6],y+ry[6], x+rx[7],y+ry[7], x+rx[8],y+ry[8], color_blue); //body 
    al_draw_filled_triangle(x+rx[9],y+ry[9], x+rx[10],y+ry[10], x+rx[11],y+ry[11],color_blue); //wing 
    al_draw_filled_ellipse(x+rx[12],y+ry[12], 4, 8, color_black);  //cockpit 

    al_flip_display(); 
} 

回答

0

我發現德answser用的紙張和打印報表的許多上班族這一切之後。我不得不除去rx和ry的xarray和yarray。見下文。

rx[i] = radius * cos(phi + theta); 
    ry[i] = radius * sin(phi + theta); 

替換 RX [I] = xarray [1] +半徑* COS(PHI + THETA); ry [i] = yarray [i] + radius * sin(phi + theta);