Práctica (curso 2000-2001): Núcleo de un sistema de gráficos 2D

Introducción

Se trata de realizar un programa que realice la labor de un núcleo de un sistema de gráficos que maneja figuras bidimensionales. El programa deberá considerar tanto figuras simples (cuadrados, rectángulos, etc.) como figuras compuestas por la unión de varias figuras simples (por ejemplo, un “sobre” formado mediante un cuadrado y un triángulo).

Cada figura vendrá identificada por un nombre, que deberá ser único. Es decir, no se admitirán figuras con nombre repetido. Seguidamente se muestran los datos asociados a las distintas figuras que debe manejar el programa:

Los colores admitidos para las figuras son: blanco, negro, rojo, verde y azul.

Tanto la entrada como la salida del programa deberán realizarse mediante fichero. Los comandos que podrá recibir el programa serán los siguientes:

Hay que tener en cuenta que para pintar las figuras compuestas (sobre y casa) será necesario generar comandos para pintar las figuras básicas que las componen en el orden adecuado, según se describe a continuación:

Los comandos del fichero de entrada podrán tener errores, por lo que el programa deberá comprobar la corrección de los comandos y de sus parámetros.

El programa deberá trabajar con un área de dibujo de 640x480 unidades, de forma que deberá controlarse que las figuras siempre estén dentro de esa zona antes de ejecutar cualquiera de los comandos. En cambio, se permite que las figuras se solapen, tapándose unas a otras. El hecho de que las figuras puedan solaparse no afecta al cálculo de los datos de superficie.

Ejecución del programa

El ejecutable generado deberá llamarse “dibujar.exe” y su ejecución se realizará mediante el siguiente comando:

DIBUJAR <entrada> <salida>

Donde:

El programa deberá comprobar la corrección de ambos parámetros.

Formato de la entrada

La entrada es un fichero de texto que tendrá una línea para cada comando, siendo el formato de los comandos el siguiente:

Crear cuadrado “CRE” “CUA” <nombre> <x> <y> <lado> <color>
Crear rectángulo “CRE” “REC” <nombre> <x> <y> <lado h> <lado v> <color>
Crear triángulo “CRE” “TRI” <nombre> <x> <y> <lado> <altura> <color>
Crear sobre “CRE” “SOB” <nombre> <x> <y> <lado> <color c> <color t>
Crear casa “CRE” “CAS” <nombre> <x> <y> <lado> <color c> <color t> <color p>
Mover figura “MOV” <nombre> <dx> <dy>
Eliminar figura “BOR” <nombre>
Superficie “SUP”
Pintar “PIN”

Los campos de los comandos pueden ir separados por cualquier número de blancos. Formato de los campos:

<nombre> Cadena de 20 caracteres como máximo encerrada entre comillas dobles
<x>, <y> Un número entero positivo
<radio>, <radio h>, ... Un número entero positivo
<color>, <c1>, ... Un carácter. Valores: B, N, R, V, A
<lado>, <lado h>, ... Un número entero positivo
<altura> Un número entero (puede ser negativo)
<x>, <y> Un número entero (puede ser negativo)

Ejemplo de fichero de entrada:

CRE CUA "Cuadrado 1" 30 30 50 A
CRE CAS "Casa 1" 200 100 40 B R V
MOV "Cuadrado 1" 100 20
PIN
CRE REC "Rectángulo 1" 300 150 100 200 N
PIN
SUP
BOR "Casa 1"
PIN
CRE TRI "Un triángulo" 300 200 180 60 A
PIN

Formato de la salida

La salida será un fichero de texto que mostrará el resultado de la ejecución de cada uno de los comandos del fichero de entrada o el mensaje de error correspondiente.

Los resultados que deben aparecer son los siguientes (obsérvese que no hay acentos en los textos de salida, excepto en los nombres de las figuras):

Crear cuadrado “Creado cuadrado” <nombre> (<x>,<y>,<lado>,<color>)
Crear rectángulo “Creado rectangulo” <nombre> (<x>,<y>,<lado h>,<lado v>,<color>)
Crear triángulo “Creado triangulo” <nombre> (<x>,<y>,<lado>,<altura>,<color>)
Crear sobre “Creado sobre” <nombre> (<x>,<y>,<lado>,<color c>,<color t>)
Crear casa “Creada casa” <nombre> (<x>,<y>,<lado>,<color c>,<color t>,<color p>)
Mover figura “Figura” <nombre> “movida a” (<x>,<y>)
Eliminar figura “Eliminada ” <nombre>
Superficie “Superficie total:” <sup total> “ | Superficie media:” <sup media>
Pintar Comandos de pintado

El formato de los campos de salida es el mismo que para los campos de entrada, con los siguientes matices:

La especificación de la salida correspondiente al comando "pintar" tiene una estructura de varias líneas que se describe a continuación:

Tabla de comandos de pintado:

Comando Argumentos Dibujo
PintarCuadrado x, y, lado, color Dibujo de comando PintarCuadrado
PintarRectangulo x, y, ancho, alto, color Dibujo de comando PintarRectangulo
PintarTriangulo x1, y1, x2, y2, x3, y3, color Dibujo de comando PintarTriangulo

Seguidamente se muestra un ejemplo de fichero de salida, que se corresponde con el ejemplo de fichero de entrada.

Creado cuadrado "Cuadrado 1" (30,30,50,azul)
Creada casa "Casa 1" (200,100,40,blanco,rojo,verde)
Figura "Cuadrado 1" movida a (130,50)
EmpezarPintar
PintarCuadrado(105,25,50,azul)
PintarCuadrado(180,80,40,blanco)
PintarTriangulo(200,60,180,80,220,80,rojo)
PintarRectangulo(195,100,10,20,verde)
FinPintar
Creado rectangulo "Rectángulo 1" (300,150,100,200,negro)
EmpezarPintar
PintarCuadrado(105,25,50,azul)
PintarCuadrado(180,80,40,blanco)
PintarTriangulo(200,60,180,80,220,80,rojo)
PintarRectangulo(195,100,10,20,verde)
PintarRectangulo(250,50,100,200,negro)
FinPintar
Superficie total: 24500.00 | Superficie media: 8166.67
Eliminada "Casa 1"
EmpezarPintar
PintarCuadrado(105,25,50,azul)
PintarRectangulo(250,50,100,200,negro)
FinPintar
Creado triangulo "Un triángulo" (300,200,180,60,azul)
EmpezarPintar
PintarCuadrado(105,25,50,azul)
PintarRectangulo(250,50,100,200,negro)
PintarTriangulo(300,200,210,260,390,260,azul)
FinPintar

Cuando la ejecución de algún comando produzca un error, la salida correspondiente a ese comando será una línea con el formato siguiente: "ERROR:" . La descripción del error será un texto que explique el significado del error. Seguidamente el programa deberá procesar normalmente el resto de los comandos del fichero de entrada.

Se pide:

Llevar a cabo el desarrollo del programa siguiendo el modelo orientado al flujo de datos y el modelo orientado a objetos.

NORMAS

Enlaces