C ++ Allegro Первая программа отображения - перевести повернуть масштаб

0

Я использую C++, Allegro5 и кодовые блоки. Я пытаюсь написать тестовую программу, прежде чем писать очень простой астероид. Единственными правилами являются использование 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();
}
Теги:
rotation
allegro

1 ответ

0
Лучший ответ

Я нашел teswser после того, как все это закончилось с бумагой и несколькими печатными заявлениями. Мне пришлось удалить дополнение xarray и yarray для rx и ry. Смотри ниже.

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

заменяет rx [i] = xarray [i] + радиус * cos (phi + theta); ry [i] = yarray [i] + радиус * sin (phi + theta);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню