Я использую 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();
}
Я нашел 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);