Simples gráficos en SDL ampliado

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;
   }
  }
 }
}

Etiquetas: ,,. Guarda el enlace permanente.

Deja un comentario ^^