Tras corregir el código de la entrada anterior, he añadido una clase triángulo y modificado el de la recta para permitir rectas oblicuas. El main ahora saca cualquier figura al azar.
triangulo.h: Pulsa para ver/ocultar el código
#ifndef _TRIANGULO_H_ #define _TRIANGULO_H_ void Triangulo(SDL_Surface *superficie, int x, int y, int lado, Uint32 color); #endif
triangulo.c: Pulsa para ver/ocultar el código
#include <SDL/SDL.h> #include "recta.h" #include "triangulo.h" void Triangulo(SDL_Surface *superficie, int x, int y, int lado, Uint32 color) { // Dibujamos las verticales paralelas Recta(superficie, x, y, x, y + lado, color); Recta(superficie, x, y, x + lado, y, color); // Dibujamos las horizontales paralelas Recta(superficie, x, y+lado, x+lado , y, color); }
recta.c: Pulsa para ver/ocultar el código
// Listado: recta.c // // Implementación de las funciones #include <SDL/SDL.h> #include <math.h> #include "pixels.h" #include "recta.h" void Recta(SDL_Surface *superficie, int x0, int y0, int x1, int y1, Uint32 color) { // Calculamos la longitud de la recta int longitud = sqrt(pow((x1 - x0), 2) + pow((y1 - y0), 2)); // La longitud no debe ser negativa if (longitud < 0){ longitud = -1 * longitud; } int i = 0; if(x0!=x1 && y0!=y1){ int x=0; float dy, dx, y, m; dy = y1 - y0; dx = x1 - x0; m = dy/dx; y = y0; for(x = x0; x <= x1; x++){ PutPixel(superficie, x, (int) floor(y+0.5), color); y +=m; } }else{ for (i = 0; i < longitud; i++) { // Si es vertical aumento y if (x0 == x1) { y0++; PutPixel(superficie, x0, y0, color); } // Si es horizontal aumento x if (y0 == y1) { x0++; PutPixel(superficie, x0, y0, color); } } } }
main.c: Pulsa para ver/ocultar el código
// Listado: main.c // Programa de prueba, #include <stdio.h> #include <time.h> #include <SDL/SDL.h> #include "recta.h" #include "triangulo.h" #include "cuadrado.h" #include "circunferencia.h" int main(){ // Vamos a dibujar píxeles en pantalla SDL_Surface *pantalla; // Variables auxiliares Uint32 color, comprobacion; Uint8 *buffer; SDL_Event evento; int i; int pos_x, pos_y, radio; // Llama a SDL_Quit() al salir atexit(SDL_Quit); // Iniciamos SDL if (SDL_Init(SDL_INIT_VIDEO) < 0){ fprintf(stderr, " No se pudo iniciar SDL: %s\n", SDL_GetError()); exit(1); } // Es compatible el modo de video? if (SDL_VideoModeOK(640, 480, 24, SDL_SWSURFACE) == 0) { fprintf(stderr, "Modo no soportado: %s\n", SDL_GetError()); exit(1); } // Una vez comprobado establecemos el modo de video pantalla = SDL_SetVideoMode(640, 480, 24, SDL_SWSURFACE); if (pantalla == NULL) { printf("SDL_SWSURFACE 640 x 480 x 24 no compatible.\n"); printf("Error: %s\n", SDL_GetError()); } // Si hay que bloquear la superficie se bloquea if (SDL_MUSTLOCK(pantalla)){ SDL_LockSurface(pantalla); } // Vamos a dibujar píxeles rosa color = SDL_MapRGB(pantalla->format, 128, 128, 255); // Dibujamos 20 circunferencias aleatorias srand(time(NULL)); // Establecemos la semilla int figura; for (i = 0; i < 20; i++) { // Número aleatorio dentro del rango pos_x = rand() % 640; pos_y = rand() % 480; radio = rand() % 100; //Figura aleatoria figura=rand()%4; switch(figura){ case 0: Recta(pantalla, pos_x, pos_y, pos_x+radio, pos_y+radio, color); break; case 1: Circunferencia(pantalla, pos_x, pos_y, radio, color); break; case 2: Cuadrado(pantalla, pos_x, pos_y, radio, color); break; case 3: Triangulo(pantalla, pos_x, pos_y, radio, color); break; } } // Actualizamos la pantalla parar mostrar el cambio SDL_Flip(pantalla); // Una vez dibujado procedemos a desbloquear la superficie // Siempre y cuando hubiese sido bloqueada if (SDL_MUSTLOCK(pantalla)){ SDL_UnlockSurface(pantalla); } // Ahora mantenemos el resultado en pantalla // Hasta pulsar escape while(1==1) { // Consultamos los eventos while (SDL_PollEvent(&evento)) { if (evento.type == SDL_QUIT){ // Si es de salida return 0; } } } }