C ++ Allegro First Display Program - 翻译旋转比例

时间:2014-02-26 21:36:23

标签: c++ rotation allegro

我正在使用C ++,Allegro5和代码块。在写一个非常基本的Asteroids敲门之前,我正在尝试编写一个测试程序。唯一的规则是使用C ++,Allegro,没有精灵或位图(这特别需要使用线条和形状等基元)。

我在quadrant1中绘制形状,在相对原点平移的quadrant2中重绘它,将其重新绘制为旋转一定角度的三个,最后在quadrant4中重新绘制它。

第1部分和第2部分工作正常。我的问题是旋转功能。它没有旋转正确的量,或根本没有旋转。小于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();
}

1 个答案:

答案 0 :(得分:0)

我用纸张和大量的印刷声明完成了所有的回答。我不得不删除rx和ry的xarray和yarray。见下文。

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

内容替换       rx [i] = xarray [i] + radius * cos(phi + theta);       ry [i] = yarray [i] + radius * sin(phi + theta);