C/C++

Работа в SDL c окружностями c++

Программа должна отрисовывать 10 кругов по нажатию клавиши пробеле, именно одно нажатие один круг, у меня это не работает, помогите допилить .
#include "SDL.h"
#include
#include
#include
#include
#include
using namespace std;

void task()
{

SDL_Init(SDL_INIT_EVERYTHING);

SDL_Window* window = SDL_CreateWindow(u8"Лабораторная №22",

100, 100,

1500, 1000, SDL_WINDOW_SHOWN);

SDL_Renderer* render = SDL_CreateRenderer(window, -1, 0);
SDL_SetRenderDrawColor(render, 0, 0, 0, 0);
SDL_RenderClear(render); SDL_RenderPresent(render);

int corx[10];
int cory[10];
int rad[10];
double ras;
bool clik = false;

for (int j = 0; j < 10; j++)
{
corx[j] = rand() % (1000 - 50 + 1) + 50;
cory[j] = rand() % (1000 - 50 + 1) + 50;
rad[j] = rand() % (50 - 5 + 1) + 5;
}
SDL_Point cor[10][360];
SDL_Point point[360];

SDL_Event event;
bool quit = false;
while (!quit) {

SDL_PollEvent(&event);
if (event.type == SDL_QUIT) quit = true;

for (int g = 0; g < 10; g++) {
if ((event.type == SDL_KEYDOWN) && (event.key.keysym.sym == SDLK_SPACE) && (clik == false)) {

for (int i = 0; i < 360; i++)
{
ras = sqrt((corx[g] - corx[g]) * (corx[g] - corx[g]) + (cory[g] - cory[g]) * (cory[g] - cory[g]));

if (rad[g] + rad[g + 1] >= ras) {
double u = 3.14 / 180 * i;
SDL_SetRenderDrawColor(render, 255, 0, 255, 0);

point[i].x = int(corx[g] + rad[g] * cos(u));
cor[g][i].x = point[i].x;
point[i].y = int(cory[g] + rad[g] * sin(u));
cor[g][i].y = point[i].y;

SDL_RenderDrawPoints(render, point, 360);
}
SDL_RenderPresent(render);
} clik = true;
}
// else continue;
if ((event.type == SDL_KEYUP)&&(event.key.keysym.sym == SDLK_SPACE))
clik = false;

}

if (event.button.button == SDL_BUTTON_LEFT) {

for (int i = 0; i < 360; i++)
for (int g = 0; g < 10; g++) {
double u = 3.14 / 180 * i;
if ((event.button.x >= corx[g] - rad[g] - cos(u)) && (event.button.x <= corx[g] + rad[g] + cos(u)) && (event.button.y >= cory[g] - rad[g] - cos(u)) && (event.button.y <= cory[g] + rad[g] + sin(u)))
{
SDL_SetRenderDrawColor(render, 0, 0, 0, 0);
SDL_RenderDrawPoints(render, cor[g], 360);

}
}

}
SDL_RenderPresent(render);
}
SDL_DestroyRenderer(render);
SDL_DestroyWindow(window);
SDL_Quit();
}

int main(int argc, char* argv[])
{

srand(time(0));
task();
return 1;

}
ИМХО Вы как-то переусложнили. + Вынесите отрисовку окружности в отдельную функцию, раз Вы её вызываете несколько раз. + есть более быстрые алгоритмы отрисовки окружности не требующие работы с плав. точкой в т. ч.
( н-р https://ru.wikipedia.org/wiki/Алгоритм_Брезенхэма )

Пример (в C++ лучше < random > чем rand, но не до этого). Чертит линию при нажатии пробела, но не при его удержании (я так понял в этом проблема):

#include < iostream >
#include < cstdlib >
#include < SDL2/SDL.h >

int main(int argc, char *argv[]) {

srand(time(NULL));

SDL_Init( SDL_INIT_EVERYTHING );

SDL_Window* window = SDL_CreateWindow(u8"Лабораторная №22", 100, 100, 1500, 1000, SDL_WINDOW_SHOWN);
if (!window) {
std::cerr << "Could not create window: " << SDL_GetError() << std::endl;
return EXIT_FAILURE;
}

SDL_Renderer* render = SDL_CreateRenderer(window, -1, 0);
if (!render) {
std::cerr << "Could not create render: " << SDL_GetError() << std::endl;
return EXIT_FAILURE;
}

SDL_SetRenderDrawColor(render, 0, 0, 0, 0);
SDL_RenderClear(render); SDL_RenderPresent(render);

for(bool isPressed = false;;) {

SDL_Event windowEvent;

if (SDL_PollEvent(&windowEvent)) {

switch (windowEvent.type) {

case SDL_QUIT:
SDL_DestroyWindow(window);
SDL_Quit();

return EXIT_SUCCESS;

case SDL_KEYDOWN:
if (windowEvent.key.keysym.sym == SDLK_SPACE && !isPressed) {
isPressed = true;
SDL_SetRenderDrawColor(render, 255, 255, 255, SDL_ALPHA_OPAQUE);
SDL_RenderDrawLine(render, 0, 0, 1500, rand()%1000);
SDL_RenderPresent(render);
}
break;

case SDL_KEYUP:
if (windowEvent.key.keysym.sym == SDLK_SPACE) {
isPressed = false;
}
break;
}
}
}
}

ЗЫЖ: У меня по крайней мере работает ;) И гляньте ещё SDL_GetKeyState - может Вам так даже удобнее будет (хотя она более затратная в Вашем случае)
_www.libsdl.org/release/SDL-1.2.15/docs/html/sdlgetkeystate.html
Виктор Харченко
Виктор Харченко
84 764
Лучший ответ
Виктор Харченко Кст. в вики есть ссылка на книгу: Роджерс Д. "Алгоритмические основы машинной графики".
Это офигенная книга. У меня ещё где-то лежит.
Сергей Бешеный Спасибо, очень помогли