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

