Agradeceríamos tu apoyo para difundir nuestros tutoriales en referencia a las ciencias de la computación.
Solución:
Este es un ejemplo del algoritmo de círculo de punto medio como se mencionó anteriormente. No requiere una biblioteca matemática y es muy rápido. (Se procesa en unos 500 microsegundos) Esto es lo que Windows usa/usó para rasterizar círculos.
void DrawCircle(SDL_Renderer * renderer, int32_t centreX, int32_t centreY, int32_t radius)
const int32_t diameter = (radius * 2);
int32_t x = (radius - 1);
int32_t y = 0;
int32_t tx = 1;
int32_t ty = 1;
int32_t error = (tx - diameter);
while (x >= y)
// Each of the following renders an octant of the circle
SDL_RenderDrawPoint(renderer, centreX + x, centreY - y);
SDL_RenderDrawPoint(renderer, centreX + x, centreY + y);
SDL_RenderDrawPoint(renderer, centreX - x, centreY - y);
SDL_RenderDrawPoint(renderer, centreX - x, centreY + y);
SDL_RenderDrawPoint(renderer, centreX + y, centreY - x);
SDL_RenderDrawPoint(renderer, centreX + y, centreY + x);
SDL_RenderDrawPoint(renderer, centreX - y, centreY - x);
SDL_RenderDrawPoint(renderer, centreX - y, centreY + x);
if (error <= 0)
++y;
error += ty;
ty += 2;
if (error > 0)
--x;
tx += 2;
error += (tx - diameter);
Si desea escribir su propia función de dibujo de círculos, le sugiero que adapte el algoritmo de punto medio a SDL2 dibujando píxeles.
Las curvas se harían de manera similar, pero usarían más un algoritmo de dibujo de elipses.
Los gráficos vectoriales reales empiezan a ser mucho más complicados, y probablemente tengas que encontrar algo que reproduzca archivos SVG, que no estoy seguro de que haya muchas opciones para SDL2.
Sin embargo, si prefiere simplemente tener funciones con las que pueda trabajar, le sugiero que vaya directamente a SDL2_gfx. Tiene muchas más funciones ya implementadas para que trabajes con ellas.
SDL permite que las bibliotecas de terceros dibujen una textura. Si cairo fuera deseable, podría usarse en una función como esta:
cairo_t*cb(cairo_t*cr)
cairo_set_source_rgb(cr, 1.0, 1.0, 1.0);
cairo_rectangle(cr, 10, 20, 128, 128);
cairo_stroke(cr);
return cr;
entonces cb se puede pasar a esta función:
cairo_t*cai(SDL_Window*w,SDL_Renderer*r,cairo_t*(*f)(cairo_t*))
int width, height, pitch;void *pixels;
SDL_GetWindowSize(w, &width, &height);
SDL_Texture*t=SDL_CreateTexture(r,SDL_PIXELFORMAT_ARGB8888,SDL_TEXTUREACCESS_STREAMING,width,height);
SDL_LockTexture(t, NULL, &pixels, &pitch);
cairo_surface_t *cs=cairo_image_surface_create_for_data(pixels,CAIRO_FORMAT_ARGB32,width,height,pitch);
cairo_t*s=cairo_create(cs);
cairo_t*fr=f(s);SDL_UnlockTexture(t);SDL_RenderCopy(r,t,NULL,NULL);SDL_RenderPresent(r);
return fr;
Eres capaz de añadir valor a nuestra información participando con tu veteranía en los comentarios.