Sei sulla pagina 1di 127

Manual de usuario

1
Manual de usuario: Indice

1. INTRODUCCIÓN........................................................................................................................................4
1.1. OBJETIVOS DE LA APLICACIÓN:.......................................................................................................................4
1.2. REQUERIMIENTOS HARDWARE Y SOFTWARE......................................................................................................6
1.3. INSTALACIÓN...............................................................................................................................................8
2. MENÚS..........................................................................................................................................................9
2.1. MENÚ ABRIR............................................................................................................................................11
2.1.1. Abrir...............................................................................................................................................11
2.2. GUARDAR IMAGEN......................................................................................................................................12
2.2.1. Impresión:......................................................................................................................................13
2.2.2. Salir................................................................................................................................................13
2.3. MENÚ PARÁMETROS:..................................................................................................................................14
2.3.1. Tamaño de Borrar..........................................................................................................................14
2.3.2. Tamaño das liñas sin unir..............................................................................................................15
2.3.3. Máxima Lonxitude de Unión:........................................................................................................15
2.3.4. Realizar Interpolación...................................................................................................................16
2.4. MENÚ CORES............................................................................................................................................17
2.4.1. Cores..............................................................................................................................................18
2.5. MENÚ DISTANCIA......................................................................................................................................21
2.5.1. Ver Ferramentas.............................................................................................................................21
2.6. MENÚ COMPOSICIÓN..................................................................................................................................27
2.6.1. Crear..............................................................................................................................................28
2.7. MENÚ FIESTRAS........................................................................................................................................33
2.7.1. Cascada..........................................................................................................................................33
2.7.2. Mosaico..........................................................................................................................................33
2.7.3. Organizar iconos............................................................................................................................34
2.8. MENÚ CRÉDITOS.......................................................................................................................................35
3. MENÚS EMERGENTES..........................................................................................................................36

4. PANELES ...................................................................................................................................................37
4.1. PANEL SUPERIOR.......................................................................................................................................37
4.2. PANEL EXTRAER COLOR.............................................................................................................................39
4.2.1. Botón extraer por color.................................................................................................................40
4.2.2. Botón Extracción por colores. .....................................................................................................41
4.2.3. Botón Adelgazar.............................................................................................................................43
4.3. PANEL UNIR.............................................................................................................................................44
4.3.1. Botón unir.......................................................................................................................................44
4.3.2. Botón Trazar Línea........................................................................................................................45
4.3.3. Botón quitar ruido..........................................................................................................................46
4.3.4. Botón Ver Extremos........................................................................................................................46
4.4. PANEL GRÁFICO........................................................................................................................................47
4.4.1. Botón Perfil....................................................................................................................................47
4.4.2. Botón Región..................................................................................................................................48
4.4.3. Botón de Tres dimensiones.............................................................................................................49
4.4.4. Botón estadística............................................................................................................................53
4.4.5. Botón etiquetado............................................................................................................................54
5. CÓDIGO FUENTE....................................................................................................................................57
5.1. RELIEVES.DPR...................................................................................................................................57
5.2. CUATRO.PAS..............................................................................................................................................58
5.3. FILLA2.PAS................................................................................................................................................74
5.4. COMPOSICION.PAS....................................................................................................................................105
2
Manual de usuario: Indice

5.5. DESCONTINUIDADESAUX.PAS.....................................................................................................................107
5.6. DESCONTINUIDADES.PAS............................................................................................................................110
5.7. ZHANGSUES.PAS......................................................................................................................................113
5.8. DIBUJO.PAS.............................................................................................................................................116
5.9. UNIDADFPREGUNTA.PAS............................................................................................................................117
5.10. ZOOM.PAS.............................................................................................................................................118
5.11. TIPOS.PAS..............................................................................................................................................119
6. TABLA DE ILUSTRACIONES..............................................................................................................125

3
Manual de usuario: Introducción

1.INTRODUCCIÓN

1.1.OBJETIVOS DE LA APLICACIÓN:
La introducción de la informática en el proceso de Cartografía mediante programas

específicos, dedicados al proceso de la información Geográfica ha hecho que todas las

expectativas ya conocidas por aquellas que trabajan con esta clase de información

comiencen a parecer como posibles.

Con los programas informáticos se pretende unir la relativa sencillez de

elaboración de mapas y planos con los procesos de análisis, reduciendo así los costes y

aumentando las posibilidades de los técnicos dedicados al manejo de esta información.

Como una demostración práctica del tema de este proyecto, he desarrollado una

aplicación (denominada RELIEVES) que extrae, o lo que es lo mismo, detecta, las curvas

de nivel de un determinado mapa (u hoja) previamente escaneado, gracias a que estas

están representadas en el mismo con un color que las distingue de otro tipo de

información, y con las cuales (tras su etiquetado manual o automático) el programa puede

generar una imagen tridimensional el terreno realista y que puede ser manipulada y

analizada en todo su conjunto, también se podrá extraer de las imágenes otro tipo de

información como ríos, carreteras, que normalmente están representada con un color

distintivo.

4
Manual de usuario: Introducción

El usuario podrá, finalmente, introducir nuevas cotas, calcular áreas o distancias,

trazar perfiles, imprimir y grabar documentos, etc.

Este tomo del proyecto no pretende ser una explicación de los procesos que se

realizan en el programa, sino una ayuda que les sirva a los usuarios que lo utilicen a la

hora de manejarlo. Tampoco están incluidos aquí los algoritmos utilizados, para

examinarlos consultar el Tomo I de la memoria.

5
Manual de usuario:

1.2.REQUERIMIENTOS HARDWARE Y SOFTWARE


El programa RELIEVES está diseñado para ejecutarse en una plataforma PC, con

unidad de CD-ROM, siendo recomendable como mínimo un Pentium con 200 Mhz, y 32

Mg de memoria RAM.

El espacio libre en disco duro necesario para el proceso de instalación es de unos

50 Mg, y en plena ejecución es recomendable tener como mínimo unos 30 Mg.

La aplicación podrá funcionar perfectamente en algunas plataformas que

incumplan estas características, pero cabe reseñar que en sistemas con procesadores

rápidos y con memorias amplias, el funcionamiento será mucho mejor debido a la

complejidad de los algoritmos que se emplean (para una mayor información de estos

algoritmos, consultar el Tomo I de la memoria).

En cuanto al software, el programa ha sido desarrollado en Borland Delphi 3.0

Professional para correr bajo Windows 95. La paleta de colores de Windows debe estar en

la opción de color verdadero, debido al numero de colores que se utilizan en la aplicación.

En “propiedades de pantalla” de Windows 95 es recomendable que la resolución

sea la de 640 por 480 píxeles.

6
Manual de usuario:

Ilustración 1: Propiedades de pantalla.

Propiedades de Pantalla de Windows 95. En “paleta de colores” debe

estar señalada la opción “color verdadero”. En “área de escritorio”

debe estar señalada la opción “640 por 480”.

También es recomendable, para una buena ejecución del programa y para mayor

facilidad de manejo, que la barra de tareas de Windows 95 esté oculta mientras se ejecute

el programa.

7
Manual de usuario:

1.3.INSTALACIÓN
Para que la representación 3D se realice correctamente previamente a la instalación

del propio programa en si, es necesaria la instalación de un componente visual “First

Impression”.

Para instalar “First Impression” hay que ejecutar el archivo “Relieves\First

Impression 2.1\Setup.exe” contenido en el CD-ROM con la aplicación, incluido en la

documentación

Tras este primer paso, simplemente bastará copiar el archivo RELIEVES.EXE a un

directorio en el disco duro denominado RELIVES (este directorio es creado por el

usuario) y ejecutar el archivo para la puesta en funcionamiento del programa.

Ilustración 2: Icono de
RELIEVES

8
Manual de usuario: Menús

2.MENÚS

Ilustración 3: Pantalla de inicio del programa RELIEVES

Tras la ejecución del archivo “RELIEVES.EXE” aparecerá una pantalla de

bienvenida como la mostrada en la figura.

Tras pulsar el botón “ACEPTAR” nos encontramos ante la pantalla principal del

programa:

9
Manual de usuario: Menús

Ilustración 4: Pantalla Principal sin imagen cargada.

En la parte superior encontramos el menú principal del programa, algunas opciones

solo están activas cuando se trabaje con una imagen cargada.

Para abrir una imagen hay que pulsar el menú abrir. Una vez abierta la imagen

podremos aparecerán unos paneles en el lado derecho y superior que nos permitirán

efectuar acciones sobre la imagen.

10
Manual de usuario:

2.1.MENÚ ABRIR
Bajo este menú se encuentran todas las opciones relacionadas con el

almacenamiento, recuperación e impresión de ficheros de imágenes. También está la

opción para salir de la aplicación.

2.1.1.ABRIR
2.1.1.ABRIR

Abre un cuadro de diálogo en el cual se podrá cargar un fichero imagen.

Sólo se podrán cargar imágenes en formato Windows BMP de 256 colores o tonos

de grises, sin comprimir. Para utilizar una imagen en cualquier otro formato esta deberá

ser convertida primero a un formato soportado por el programa. En caso contrario la

aplicación mostrará un mensaje de error.

Aunque se permiten abrir y trabajar con múltiples documentos a la vez es

recomendable que, en la medida de lo posible, se trabaje con los menos posibles, pues

cuanto mayor sea el número de imágenes que se tengan abiertas mayor será el numero de

recursos utilizados y la lentitud en realizar todas las operaciones.

11
Manual de usuario:

Aunque se permiten imágenes mayores, es recomendable para el correcto

funcionamiento de la utilizar imágenes de tamaños menores a 1800 x 1800 pixeles.

Una vez abierta la imagen el aspecto del programa es el siguiente:

Ilustración 5: Pantalla principal.

2.2.GUARDAR IMAGEN
Se guarda la imagen activa. Para ello se abre un diálogo igual al anterior de “Abrir

Imagen”. La imagen se guarda en 256 colores. Este es un dato importante cuando tenemos
12
Manual de usuario:

una imagen donde se ha realizado un etiquetado. En el etiquetado intervienen más de 256

colores, por lo tanto al grabar podrían perderse algunos.

La pantalla para abrir y grabar imágenes es la siguiente:

Ilustración 6: Ventana abrir o grabar imagen.

2.2.1.IMPRESIÓN:
2.2.1.IMPRESIÓN:

Imprime la imagen activa.

2.2.2.SALIR
2.2.2.SALIR

Cierra todas las imágenes abiertas y sale de la aplicación.

13
Manual de usuario:

2.3.MENÚ PARÁMETROS:
Este menú nos permitirá variar algunos parámetros que se utilizan en el programa,

la correcta utilización de los mismos nos permitirá mejorar el proceso de eliminación de

discontinuidad de líneas, representación tridimensional del terreno y cálculo de alturas por

interpolación.

2.3.1.TAMAÑO
2.3.1.TAMAÑO DE BORRAR

Esta opción especifica el tamaño de la goma que se puede utilizar para borrar

partes de la imagen. El valor por defecto es 3 e independiente de la imagen activa.

Este número indica el numero de pixeles que se borran cada vez que se pulsa el

botón derecho del botón (mayor tamaño de borrar, mayor será el número de pixeles que se

borren.

Ilustración 7: Ejemplo de borrado.

14
Manual de usuario:

En la figura pueden verse (en color blanco) borrados con gomas de tamaño 3, 6 y

9. El valor máximo que puede tomar esta variable es 50.

2.3.2.TAMAÑO
2.3.2.TAMAÑO DAS LIÑAS SIN UNIR

Cambia el valor que valor tienen los tramos de las curvas de nivel extraídas donde

se va intentar eliminar una discontinuidad (el programa intentará unir líneas de esa

longitud o de longitud mayor). Si el valor es demasiado pequeño (está expresado en

pixeles), el programa unirá líneas que pueden no corresponderse con curvas de nivel

(ruido). Si es demasiado grande dejará sin unir líneas que son en realidad curvas de nivel.

Tamaño de las líneas sin unir Tamaño de las líneas sin unir

igual a 5 igual a 15
Ilustración 8: Ejemplo de tamaño de las líneas sin unir

El valor por defecto de esta variable es 15. El valor máximo que puede tomar es

1000.

2.3.3.MÁXIMA
2.3.3.MÁXIMA LONXITUDE DE UNIÓN:

Cambia el valor máximo de tramo (expresado en pixeles) que el programa traza

para salvar una discontinuidad presente en la imagen.

15
Manual de usuario:

El valor por defecto es 15. El valor máximo que puede tomar esta variable es 1000.

Imagen Original Imagen con valor máximo Imagen con valor máximo

de unión 1 de unión 15
Ilustración 9: Ejemplo de valor máximo de unión.

2.3.4.REALIZAR
2.3.4.REALIZAR INTERPOLACIÓN

Este menú indica si está activa o no la opción de realizar interpolación.

Es independiente para cada imagen. Por lo tanto cuando tenemos varios

documentos abiertos a la vez, en algunos está opción puede estar activa y en otro no. Si la

interpolación está marcada entonces aparece señalada como se muestra en la figura.

La interpolación realiza una serie de cálculos para aproximar la altura de cada

punto a la realidad, basándose en la región en la que se encuentre.

Si la interpolación está desactivada en el cuadro de Altura el valor mostrado será

aquel que se haya dado a la región donde se encuentre el punto. Si por el contrario la

interpolación está activa se hará una aproximación mediante cálculos matemáticos de la

probable altura del punto teniendo en cuenta su posición en el mapa.

La interpolación también será importante a la hora de representar un mapa de

forma tridimensional.
16
Manual de usuario:

Ilustración 10: Imagen tridimensional sin y con interpolación:

Imagen obtenida sin la interpolación

Imagen obtenida con la interpolación

2.4.MENÚ CORES
Este menú está inicialmente inactivo, para activarlo habrá que tener alguna imagen

abierta.

17
Manual de usuario:

2.4.1.CORES
2.4.1.CORES

Este es el único apartado del “menú Cores” cuando se pulsa, se muestra por

pantalla una leyenda con los colores con los que se ha etiquetado el mapa. Si aún no se ha

realizado el proceso de etiquetado aparece una pantalla vacía como la siguiente:

Ilustración 11: Leyenda vacía.

Si se ha realizado el etiquetado entonces aparece una nueva pantalla con la

leyenda:

18
Manual de usuario:

Ilustración 12: Leyenda.

En esta nueva pantalla , los números de la izquierda indican las alturas con las que

se ha etiquetado cada región y los colores de la derecha como han sido representadas estas

alturas en el mapa.

Es posible cambiar los colores de la leyenda. Basta con pulsar sobre el cuadro que

indica cada color y se abrirá un diálogo que nos permitirá elegir un nuevo color, que

reemplace al viejo.

19
Manual de usuario:

Diálogo que nos permite cambiar de color


Ilustración 13: Diálogo de color.

Para volver a la pantalla principal es necesario cerrar esta nueva pantalla pulsando

el botón de cerrar ventana.

20
Manual de usuario:

2.5.MENÚ DISTANCIA
Ese menú solo contiene la opción de “ver Ferramentas” y es el que nos permite

calcular áreas, distancias y establecer nuevas cotas.

2.5.1.VER
2.5.1.VER FERRAMENTAS

Al pulsar esta opción se mostrará un panel en la parte derecha de la ventana

principal que es el siguiente:

Ilustración 14: Panel Ferramentas.

Lo que hacen estos botones al ser pulsados es:

21
Manual de usuario:

Este botón es de confirmación, sirve para ocultar el panel una vez que hayamos

acabado de utilizar las herramientas de distancia (invalidamos la acción de haber pulsado

en el menú la opción “ver ferramentas”).

Este botón se pulsa cuando queremos establecer una referencia en el mapa que se

utilizará en el cálculo posterior de áreas y distancias.

Establecer una referencia en una imagen de un plano escaneado (por ejemplo un

mapa 1:25000 como el de la imagen) es relativamente fácil porque el mapa aparece divido

en cuadrículas de un kilómetro cuadrado, como en el siguiente ejemplo:

Ilustración 15: Mapa.

22
Manual de usuario:

Una vez pulsado este botón, se hace clic con el botón izquierdo del ratón en la

imagen de la izquierda (imagen original), que va a ser la posición inicial, se mueve el

ratón hasta la posición final (aparece un segmento de referencia) y se vuelve a hacer clic

con el botón izquierdo del ratón. Realizada la operación tendremos que indicar la longitud

real del segmento a escala en el dialogo que surge a continuación.

Este botón sirve para medir distancias entre dos puntos de la imagen.

Una vez pulsado este botón, se hace clic con el botón izquierdo del ratón en la

imagen de la izquierda (imagen original), que va a ser la posición inicial, se mueve el

ratón hasta la posición final (aparece un segmento de referencia sobre la distancia a medir)

y se vuelve a hacer clic con el botón izquierdo del ratón.

Una vez realizada esta operación en la sección de distancia aparecerá la estimación

de la distancia medida (primeramente tiene que haber sido establecida una referencia).

23
Manual de usuario:

El botón “Rexión” es el que se utiliza para establecer una región dentro del mapa.

Una vez pulsado se hace clic con el botón derecho del ratón en la imagen de la izquierda

(imagen original) sobre los vértices de la región que queremos situar, cerrándola

finalmente pulsando a la vez la tecla control (Ctrl) y el botón derecho del ratón.

Sirve para calcular el área de una determinada región generada anteriormente.

El cálculo resultante se muestra en la sección área. Para realizarlo, primeramente

tiene que haber sido establecida una referencia.

La finalidad de este botón es dar una cota a una región que hayamos establecido

con anterioridad.

Para ello pulsamos el botón y a continuación hacemos clic con el botón izquierdo

del ratón sobre cualquier punto de la región.

24
Manual de usuario:

Imagen tridimensional del mapa original

Imagen tridimensional después de haber añadido una nueva región al mapa y haberla etiquetado.

Ilustración 16: Añadir regiones 1.

25
Manual de usuario:

Imagen tridimensional del mapa original Imagen tridimensional después de haber añadido varias

regiones al mapa y haberlas etiquetado


Ilustración 17: Añadir regiones 2.

26
Manual de usuario:

2.6.MENÚ COMPOSICIÓN
En este menú sólo se encuentra la opción de crear que es la que se utiliza cuando se

quiere componer una imagen grande (que abarque mayor territorio) a partir de otras mas

pequeñas (que abarquen menos territorio). Esta opción es muy útil cuando tenemos un

mapa excesivamente grande como para ser escaneado en una sola imagen, y se hace

imprescindible dividir el mapa en secciones con el fin de tratar cada imagen por separado,

o cuando la imagen es demasiado grande y es conveniente subdividirla en varias imágenes

de menor tamaño. Una vez extraídas las curvas de nivel y eliminadas las discontinuidades

se graba la imagen en disco duro de cada imagen (sin realizar el etiquetado que se hará

posteriormente). Cuando tengamos todas los partes en el disco duro estas se unirán en una

sola gracias a esta opción, como se muestra en la figura:

Imagen A Imagen B Composición: Imagen A+ Imagen B

Ilustración 18: Composición de imágenes.

27
Manual de usuario:

2.6.1.CREAR
2.6.1.CREAR

Al elegir esta opción se nos presentará una ventana donde podremos realizar todas

las maniobras que consideremos oportunas para crear la composición. Esta ventana es la

siguiente:

Ilustración 19: Ventana de coordenadas.

La parte central - izquierda de esta nueva ventana, “Fiestra Composición”, está

ocupada por un recuadro en blanco que va a ser la nueva imagen.

En la parte derecha se aprecia un panel con 8 recuadros que el usuario puede

modificar a su antojo y que indican las coordenadas globales, que son las coordenadas de

la nueva imagen, y las coordenadas de inserción, que son las coordenadas entre las cuales

se va a insertar la siguiente imagen desde un archivo.


28
Manual de usuario:

Tras indicar las coordenadas globales y las coordenadas de inserción deberemos

pulsar este botón con la finalidad de cargar una imagen desde archivo. A continuación se

nos muestra un dialogo para cargar la imagen, que es igual al dialogo que aparece tras

pulsar la opción “Abrir Imagen” en el menú “Abrir” La imagen cargada deberá estar en

formato Windows BMP de 256 colores o tonos de grises y aunque admite cualquier

imagen es recomendable que la elegida tenga ya extraídas las curvas de nivel y eliminadas

las discontinuidades.

El usuario podrá indicar coordenadas reales o coordenadas relativas para insertar la

imagen en el lugar indicado, pero siempre teniendo en cuenta que en las coordenadas

superior izquierda ‘X’ e ‘Y’ tienen que tomar valores mas pequeños que los de inferior

derecha.

Ejemplo:

En el siguiente ejemplo se insertan dos imágenes para crear una composición.

29
Manual de usuario:

Ilustración 20: Coordenadas 1.

Se ha insertado la primera imagen .En rojo se indican las coordenadas de inserción

y en negro las coordenadas globales)

30
Manual de usuario:

Ilustración 21: Coordenadas 2.

Se ha insertado la segunda imagen .En rojo se indican las coordenadas de inserción

y en negro las coordenadas globales).

Si una imagen se solapa con otra, la imagen que queda por encima es siempre la

última en insertarse.

Si hacemos clic con el botón derecho del ratón sobre la imagen obtendremos el

siguiente menú emergente:

• “Zoom+ ”: Con esta opción aumentamos el tamaño de la imagen.


31
Manual de usuario:

• “Zoom-”: Sirve para disminuir el tamaño de la imagen.

• “Grabar Imaxen”: Salvamos la imagen en el disco duro.

Para salir de la ventana de composición bastará con pulsar el botón de cerrar

ventana situado en la parte superior de la misma.

32
Manual de usuario:

2.7.MENÚ FIESTRAS

La aplicación RELIEVES permite trabajar con múltiples documentos al mismo

tiempo. A medida que se vayan abriendo ventanas éstas irán tomando una posición dada

por defecto, que el usuario puede modificar según sus necesidades.

Sin embargo, cuando se tienen abiertas múltiples ventanas, este trabajo puede ser

laborioso y por ello disponemos de este menú que puede ayudar en esta tarea. El menú

“Fiestras” es el encargado de organizar los distintos documentos (imágenes) que se tienen

abiertos.

Las opciones disponibles son:

Mediante estas tres opciones podemos modificar la posición y dimensiones de

todas las ventanas hijas que en ese momento se encuentren abiertas.

2.7.1.CASCADA
2.7.1.CASCADA

Si se elige el método cascada las ventanas se dispondrán en forma de cascada, unas

sobre otras con un ligero desplazamiento horizontal y vertical.

2.7.2.MOSAICO
2.7.2.MOSAICO

Si se elige el método mosaico las ventanas se dispondrán de tal forma que se

ajustan los tamaños para que todas las ventanas sean visibles simultáneamente.

33
Manual de usuario:

2.7.3.ORGANIZAR
2.7.3.ORGANIZAR ICONOS

Aquellas ventanas que se encuentren minimizadas en el espacio de la ventana

principal, no se verán afectadas por ninguno de los dos métodos anteriores, podemos

utilizar, no obstante, la opción organizar iconos para ordenar los iconos que representan a

estas ventanas, de tal forma que se alineen todos en la parte inferior de la ventana.

Las opciones se completan con una lista de todas las ventanas existentes en ese

momento, facilitando así la activación de una cierta ventana de forma inmediata.

34
Manual de usuario:

2.8.MENÚ CRÉDITOS
Esta opción del menú principal no tiene opciones, si la pulsamos se mostrará por

pantalla la siguiente figura:

Ilustración 22: Créditos.

35
Manual de usuario: Menús emergentes

3.MENÚS EMERGENTES

Además del menú emergente de la imagen de la ventana de Composición existen

otros dos menús emergentes, uno en la imagen original (imagen de la izquierda) y otro en

la imagen de la derecha (imagen de trabajo) que se accionan al hacer clic con en botón

derecho del ratón sobre cualquiera de las dos imágenes;

Ilustración 23: Menú emergente

• “Zoom+ ”: Con esta opción aumentamos el tamaño de la imagen.

• “Zoom-”: Sirve para disminuir el tamaño de la imagen.

• “Igualar”: Sirve para situarnos en la misma posición que en la otra imagen.

• “Grabar Imaxen”: Salvamos la imagen en el disco duro. (Opción solo disponible en

la imagen de trabajo);

36
Manual de usuario: Paneles

4.PANELES
Cuando la aplicación se ejecuta va apareciendo, en el margen derecho de la

ventana principal, una serie de paneles con sus correspondientes botones que nos permiten

realizar diversos procesos. La descripción detallada de cada panel es la siguiente:

4.1.PANEL SUPERIOR
En este panel se muestran diferentes informaciones sobre la imagen:

Ilustración 24: Panel superior.

“Eixe X ” y “Eixe Y” indican la posición del cursor sobre la imagen

“Cor” muestra el color del punto de la imagen sobre el que está situado el cursor

“Altura” muestra la altura del punto de la imagen sobre el que está situado el

cursor. Si la opción “Interpolación” del menú “Parámetros” está activada la altura indicada

será la calculada por el algoritmo de interpolación, si está desactivada la altura indicada

será la que se haya indicado para etiquetar la zona .

Botón goma:

Borra una porción de la imagen de trabajo (el número de pixeles borrados está en

función de la variable “Tamaño de borrar” inicialmente tres y que se modifica en el menú

“Parámetros”.

37
Manual de usuario: Paneles

Botón volver inicio:

Se utiliza para regresar al estado de partida.

Botón volver antes de unión:

Se utiliza para regresar a la imagen tal y como estaba antes del proceso de

eliminación de discontinuidades.

38
Manual de usuario:

4.2.PANEL EXTRAER COLOR

Ilustración 25: Panel extraer Color.

Est panel es el que se muestra cuando cargamos desde disco duro cualquier

imagen, es el que facilita las tareas de extracción de las curvas de nivel (o cualquier otra

información que se pueda extraer por el color) a partir de un mapa en color que contenga

más información.

En la figura puede verse la imagen original, la imagen con el río extraído, la

imagen con las curvas de nivel extraídas.

Ilustración 26: Extracción de río y curvas.

39
Manual de usuario:

4.2.1. BOTÓN EXTRAER POR COLOR.

Hay dos formas de extraer las curvas de nivel de una imagen, la primera

denominada extracción por color consiste en elegir hasta un máximo de 5 colores y luego

calibrar, mediante una barra, el margen que queremos dar para coger más o menos colores.

Cuando pulsamos esta opción nos sale un segundo panel que es el siguiente:

Ilustración 27: Tabla de Colores

En el margen izquierda de la figura apreciamos cinco recuadros blancos que nos

indican los colores de la imagen elegidos, son los cinco recuadros de selección de color.

En el centro del panel los cinco editores, uno por cada recuadro de color, que

contienen el valor del umbral asociado a cada color. Cuanto menor sea ese número, menor

será el numero de colores seleccionado en la imagen.

Para elegir un color, hay que hacer clic con el ratón en cualquiera recuadro de

selección de color (el recuadro aparece ahora de color rojo) y luego con el botón izquierdo

del ratón se hace clic en la imagen de trabajo o bien en la imagen original. Hecho esto, se

40
Manual de usuario:

escoge un umbral para ese color, bien manualmente (tecleamos un número en el editor

asociado), bien mediante una barra que reflejará de forma automática los cambios tanto en

el editor como en la imagen de trabajo.

En el margen derecho del panel, dos únicos botones, el primero de confirmación y

el segundo para volver a los valores por defecto.

4.2.2. BOTÓN EXTRACCIÓN POR COLORES.

Este botón nos da la posibilidad de extraer las curvas de nivel de una forma

diferente que consiste en elegir los colores que pertenecen a la curva de nivel uno a uno.

El panel que se nos presenta es el siguiente (una vez se haya pulsado el botón y

cualquiera de las dos imágenes, original o de trabajo, para seleccionar algún color):

Ilustración 28: Panel de colores.

41
Manual de usuario:

En la figura distinguimos, en la parte superior dos botones, el primero con forma

de flecha oculta la tabla, el segundo, de confirmación, permite ver los resultados en la

imagen de trabajo. Añadimos colores a esta tabla pulsando en cualquiera de las dos

imágenes (los colores que se añaden son siempre de la imagen original, por tanto podemos

pulsar en cualquier parte de la imagen de trabajo y el color añadido será el que está en esa

misma posición pero en la imagen original, lo cual es muy útil cuando vemos

discontinuidades en los tramos al no haber elegido suficientes colores, en este caso

pulsamos en la imagen de trabajo en la discontinuidad y luego en el botón de confirmación

para ver los cambios).

Para borrar un color de la lista basta con pulsar sobre el recuadro que lo contiene.

Imagen Original Imagen con las curvas de nivel de nivel

equidistantes en 50 metros extraídas


Ilustración 29: Extracción de curvas

Para elegir un método u otro, hay que decir que el primero es más automático (con

las ventaja de que puede ser más rápido pero también más inexacto) y debe ser utilizado

42
Manual de usuario:

cuando queremos extraer curvas de nivel que estén bastante separadas las unas de las otras

y que sean gruesas (por ejemplo las equidistantes en 50 metros en los mapas 1:25000). El

segundo método puede ser más lento pero también se alcanzan mejores resultados y es

muy útil en líneas bastante que tengan un color muy parecido al del fondo (por ejemplo las

curvas de nivel equidistantes en 10 metros en los mapas 1:25000)

4.2.3.BOTÓN
4.2.3.BOTÓN ADELGAZAR

Este botón sirve para adelgazar las líneas extraídas mediante cualquiera de los

métodos anteriores. Obtenemos así líneas de un solo pixel de grosor.

En el siguiente cuadro pueden verse los resultados de aplicar todos los métodos del

panel “Extraer Cor”

Imagen original Imagen tras extracción Imagen tras adelgazamiento


Ilustración 30: Extracción de curvas y adelgazamiento

43
Manual de usuario:

4.3.PANEL UNIR
El panel unir contiene una serie de herramientas para eliminar las discontinuidades

causadas por los procesos de extracción de las curvas de nivel.

Ilustración 31: Panel Unir.

Este panel aparece una vez se hayan adelgazado las curvas de nivel.

4.3.1.BOTÓN
4.3.1.BOTÓN UNIR

El botón “unir” es el encargado de eliminar las discontinuidades. Es recomendable

borrar ruido (líneas de escasa longitud) ante de proceder a su accionamiento.

Cuando se una hay que tener en cuenta dos variables, el tamaño de las líneas sin

unir, y el de la máxima longitud de unión, cuyos valores iniciales son cincuenta, y que se

pueden modificar en el menú “parámetros”.

44
Manual de usuario:

Imagen antes de unir Imagen después de unir

Ilustración 32: Eliminación de discontinuidades.

4.3.2.BOTÓN
4.3.2.BOTÓN TRAZAR LÍNEA

El botón “trazar línea” se elige para trazar un segmento en la imagen de trabajo, o

lo que es lo mismo, para evitar una discontinuidad de forma manual.

Una vez pulsado este botón, se hace clic con el botón izquierdo del ratón en la

imagen de la derecha (imagen de trabajo), que va a ser la posición inicial, se mueve el

ratón hasta la posición final (aparece un segmento) y se vuelve a hacer clic con el botón

izquierdo del ratón.

45
Manual de usuario:

4.3.3.BOTÓN
4.3.3.BOTÓN QUITAR RUIDO

El botón “quitar ruido” sirve para eliminar en la imagen de trabajo, los tramos o

segmentos que tengan una longitud igual o inferior a un umbral. Este umbral lo elige el

usuario (inicialmente es 2) en el editor asociado a la etiqueta “lonxitude”. Si en ese editor

tecleamos el valor 0 entonces simplemente borraremos los pixeles sueltos (que no estén

rodeados por otro pixel de igual color).

4.3.4.BOTÓN
4.3.4.BOTÓN VER EXTREMOS

Este botón es simplemente de información y sirve para ver los extremos que hay en

la imagen. Por ejemplo:

Ilustración 33: Detección de extremos.

46
Manual de usuario:

4.4.PANEL GRÁFICO
Ese panel sirve para calcular perfiles, imágenes tridimensionales, etiquetar, y

realizar estadísticas.

Ilustración 34: Panel Gráfico

En el panel se aprecian varios botones, los botones superiores se detallan a

continuación, el botón de confirmación sólo está visible cuando se hace clic en el botón

3D y sirve para acceder a la pantalla con la representación tridimensional.

Las etiquetas “Altura Base” y “Precisión” y sus correspondientes editores sólo se

muestran cuando está pulsado el botón 3D.

4.4.1.BOTÓN
4.4.1.BOTÓN PERFIL

Este botón sirve para realizar un perfil sobre el mapa.

Una vez pulsado este botón, se hace clic con el botón izquierdo del ratón en la

imagen original (imagen de la izquierda), que va a ser la posición inicial, se mueve el


47
Manual de usuario:

ratón hasta la posición final (aparece un segmento) y se vuelve a hacer clic con el botón

izquierdo del ratón. Entonces se generará una pantalla con el perfil de ese segmento, como

esta:

Ilustración 35: Perfiles.

4.4.2.BOTÓN
4.4.2.BOTÓN REGIÓN

Este botón se pulsa cuando quiere cambiarse el valor de la cota de una determinada

región ya etiquetada.

48
Manual de usuario:

4.4.3.BOTÓN
4.4.3.BOTÓN DE TRES DIMENSIONES

Este botón activa el botón de confirmación y las etiquetas “Altura Base” y

“Precisión” así como sus correspondientes editores.

La “altura base” es un valor introducido por el usuario, y hace que las alturas

menores a ella sean representadas en el mapa como si valiese 0. En la imagen

tridimensional la altura base es siempre etiquetada con valor 0. Esto se ve con el siguiente

ejemplo:

Imagen obtenida con “altura base” con valor 0 (las alturas van de 0 a 80)

49
Manual de usuario:

Imagen obtenida con “altura base” con valor 50 (las alturas van de 0 a

80)
Ilustración 36: Altura base.

La variable “precisión” indica el número de pixeles que se toman de la imagen

para hacer la representación tridimensional. Cuanto mayor sea el número, mayor será el

tiempo de cálculo, pero también la exactitud obtenida.

50
Manual de usuario:

“Precisión” con valor 15

Precisión con valor 30

51
Manual de usuario:

“Precisión” con valor 50


Ilustración 37: Precisión en representación tridimensional

La imagen tridimensional variará conforme esté activa o no la opción

“interpolación” del menú “parámetros”.

Imagen obtenida sin la interpolación Imagen obtenida con la interpolación


Ilustración 38: Imágenes Tridimensionales con y sin interpolación.

52
Manual de usuario:

La imagen se puede rotar, para hacerlo basta con pulsar la tecla control (Ctrl) situar

el cursor del ratón sobre la imagen tridimensional y desplazar el cursor con el botón

izquierdo del ratón pulsado. En el siguiente ejemplo aparecen tres puntos de vista

diferentes de la misma región.

Ilustración 39: Rotación en 3D.

También podemos hacer un zoom de la imagen pulsando los botones que aparecen

en el margen superior izquierdo de la ventana.

Sobre la imagen podemos hacer otro tipo de variaciones (leyendas, luces, colores,

ect.) para ello hay que pulsar con en botón derecho del ratón sobre la imagen y modificar

los parámetros que salen en el menú contextual.

4.4.4.BOTÓN
4.4.4.BOTÓN ESTADÍSTICA

Al pulsar este botón aparece por pantalla una ventana estadística sobre las regiones

presentes en el mapa. Por ejemplo:

53
Manual de usuario:

Ilustración 40: Estadística por regiones.

En la parte superior izquierda de la ventana existen unos botones para

redimensionar el gráfico y para rotarlo. En la margen derecha se sitúa la leyenda del

gráfico.

4.4.5.BOTÓN
4.4.5.BOTÓN ETIQUETADO

Aunque se podría etiquetar todo el mapa con la ayuda del botón “región” (cuya

principal finalidad es modificar la altura de una zona) se dispone de una forma mucho mas

automática para el etiquetado, al pulsarlo aparece el siguiente panel:


54
Manual de usuario:

Ilustración 41: Panel de etiquetado.

En el subpanel 1 se indica la forma en que queremos que se coloreen las regiones.

Si elegimos “Selecionado” entonces se nos irá preguntando el color cada vez que se

etiquete una región. Si elegimos “Gradual” se hará visible el subpanel 2. En el, elegiremos

el primer color con el que se etiquetará la primera región, haciendo clic con el botón

izquierdo del ratón sobre el recuadro etiquetado como “Inicial”. En “Separación” se teclea

el grado en que se diferencian los colores de dos regiones adyacentes. Si elegimos

“Aleatorio” el color de cada región etiquetada se asignará de forma aleatoria.

En el subpanel 3 se indica la forma en que se asignan altura a las regiones. Si

elegimos “Selecionada” se nos preguntará la altura cada vez que se etiquete una región. Si

elegimos “Gradual” se hará visible el subpanel 4. En el recuadro etiquetado con “Inicial”

55
Manual de usuario:

se teclea el la altura de la primera región a etiquetar. En el recuadro etiquetado como

“Equid.” (Equidistancia) se teclea la diferencia en altura de dos regiones adyacentes. Una

vez elegidas las opciones, y antes de pulsar el botón “Aceptar” se pulsa con el botón

izquierdo del ratón sobre la imagen de trabajo que va a ser la posición inicial, se mueve el

ratón hasta la posición final (aparece un segmento) y se vuelve a hacer clic con el botón

izquierdo del ratón, las regiones se irán etiquetando de forma ascendente. Con la

separación indicada en “Equid.”, y con la altura inicial indicada en “Inicial”. Se puede

etiquetar una sola región, basta con ha cer dos veces clic en dos puntos de la misma

región.

Etiquetado con colores aleatorios Etiquetado con colores graduales

Ilustración 42 :Dos imágenes etiquetadas.

56
Manual de usuario: Código Fuente

5.CÓDIGO FUENTE

5.1. RELIEVES.DPR

program Relieves;
{ó compilar no menú de Delphi Tools-Environment Options-Preferences-Debugging
Break on Exception: Desactivar)}
uses
Forms,
cuatro {VPrincipal},
ZhangSuen in 'ZhangSuen.pas',
zoom in 'zoom.pas',
descontinuidades in 'descontinuidades.pas',
ruido in 'ruido.pas',
filla2 in 'filla2.pas' {filla},
dibujo in 'dibujo.pas',
FichaDialo in 'FichaDialo.pas' {FichaDialogo},
unidadChar in 'unidadChar.pas' {VChar},
UnidadVChar2 in 'UnidadVChar2.pas' {VChar2},
composicion in 'composicion.pas',
UnidadPInicio in 'UnidadPInicio.pas' {PantallaInicio},
UnidadCreditos in 'UnidadCreditos.pas' {VCreditos},
UnidadFPregunta in 'UnidadFPregunta.pas' {FPregunta},
UnidadTabla in 'UnidadTabla.pas' {FTabla}
;{Vcomposicion}
//graf3d in 'graf3d.pas' {ven3d},
// tresDim in 'tresDim.pas' {ventana3d};

{$R *.RES}
begin
Application.Initialize;
Application.Title := 'RELIEVES';
Application.CreateForm(TVPrincipal, VPrincipal);
Application.Run;
end.

57
Manual de usuario:

5.2. CUATRO.PAS

procedure TVPrincipal.BCargaClick(Sender: TObject);


var
fichero:file of byte;
auxFor,auxFor2:integer;
filla1:tfilla;
nome:string;
byteNumeroColores:byte;

begin
DialogoAbrir.InitialDir:='c:\relieves';
if DialogoAbrir.Execute then
begin
try
assignFile(fichero,DialogoAbrir.FileName);
reset(fichero);
seek(fichero,28);
read(fichero,byteNumeroColores);
closeFile(fichero);

if byteNumeroColores=8 then
begin
filla1:=tfilla.create(self);
Panel1.Visible:=true;
Panel2.Visible:=true;
//Facemos visibles a opción de grabar no menu:
GardarImaxen1.Enabled:=true;
Impresion1.Enabled:=true;
Distancia1.Enabled:=true;
Colores1.Enabled:=true;
grupoLineas.visible:=false;
Unir.Visible:=true;
ruido.visible:=true;
Bruido.visible:=true;
(ActiveMDIChild as Tfilla).cargarClick(DialogoAbrir.FileName);
end
else
showmessage('A imaxen non é de 256 cores');
except
showmessage('Imposible abrir ese ficheiro');
end;
end;
end;

procedure TVPrincipal.Restaura(Sender: TObject);


var
fichero:file of byte;
auxFor,auxFor2:integer;
rectangulo:TRect;
begin

BNoCo.visible:=false;
restaurar.Down:=false;
Bet.down:=false;
BArea.visible:=true;
Unir.visible:=true;
Grupo1.visible:=true;
PanelEt.visible:=false;
GrupoLineas.visible:=false;
PanelUnir.visible:=false;
BRestaurar2.Visible:=false;
with (ActiveMDIChild as Tfilla)do
begin
if nomeFichero<>''then
begin
Maltura.Destroy;
Maltura:=TMaltura.Create(0);
EstadoImagen:=-1;
58
Manual de usuario:
assignFile(fichero,nomeFichero);
reset(fichero);
seek(fichero,54);
for auxFor:=0 to 255 do
for auxFor2:=1 to 4 do
write(fichero,paleta[auxFor,auxFor2]);
closeFile(fichero);
cargarClick(nomeFichero);
end;
end;
end;

procedure TVPrincipal.CerrarPrograma1Click(Sender: TObject);


begin
Salir(Sender);
Close;;
end;

procedure TVPrincipal.FormCreate(Sender: TObject);


begin
borrado:=3;
PanelEt.parent:=panel2;
PanelUnir.parent:=Panel2;
GrupoLineas.parent:=Panel2;
GDistancia.parent:=Panel2;
PanelCores.parent:=panel2;;
PanelEt.left:=5;
PanelUnir.left:=5;
GrupoLineas.left:=5;
PanelCores.left:=5;
GDistancia.left:=5;
PanelEt.top:=109;
PanelUnir.top:=109;
GrupoLineas.top:=109;
PanelCores.top:=109;
GDistancia.top:=109;
Application.CreateForm(TPantallaInicio,PantallaInicio);
PantallaInicio.showmodal;
PantallaInicio.Free;
end;

procedure TVPrincipal.grabarClick(Sender: TObject);


begin
(ActiveMdichild as TFilla).grabarClick(self);
end;

procedure TVPrincipal.Lineas2Click(Sender: TObject);


var
umbralInt,auxX,auxY,arriba,abajo,ancho,alto:integer;
rectangulo:Trect;
ENTRADArOJA,ENTRADAbLANCA,anchoB,altoB:integer;
P : PByteArray;
cadenita:string;
fichero:file of byte;
begin
screen.cursor:=CrHourGlass;
BProgreso.Visible:=true;
BNoCo.visible:=true;
BArea.visible:=false;
panel4.visible:=false;
panel5.visible:=false;
BPixels.down:=false;
Bestado.Panels.Clear;
with Bestado.Panels.add do Text:='Adelgazando Lineas';
with ActiveMdichild as TFilla do
begin
Bprogreso.Max:=(iMAgen1.Picture.Height-1)*2;
Bprogreso.Step:=1;
ScrollBox1.HorzScrollBar.Position:=0;
ScrollBox1.VertScrollBar.position:=0;

59
Manual de usuario:
ScrollBox2.HorzScrollBar.Position:=0;
ScrollBox2.VertScrollBar.position:=0;
EstadoImagen:=1;
rectangulo.Left:=0;
rectangulo.Top:=0;
rectangulo.Right:=imagen1.picture.width;
rectangulo.Bottom:=Imagen1.picture.Height;
abajo:=imagen1.Left;
arriba:=imagen1.top;
ancho:=imagen1.width; //ojo
alto:=imagen1.height;
anchoB:=imagen1.picture.width;
altoB:=imagen1.picture.height;
imagen1.Picture.SaveToFile(nomeFichero+'temporal.bmp');
Imagen1.Picture.LoadFromFile(nomeFichero+'temporal.bmp');
bitmap.Canvas.CopyRect(rectangulo,imagen1.Picture.Bitmap.Canvas,rectangulo);

for auxX := 0 to imagen1.Picture.Height-1 DO


begin
P := imagen1.picture.bitmap.ScanLine[auxx];
for auxY:=0 to imagen1.Picture.Width-1 DO
if RGB(255,255,255)<>rgb(PALETANueva[p[aUXy],3],PALETANueva[p[aUXy],2],PALETANueva[p[aUXy],1]) then
BEGIN
matrizBy[AUXY,AUXX]:=1;
ENTRADArOJA:=p[AUXY];
END
else
BEGIN
matrizBy[AUXY,AUXX]:=0;
ENTRADAbLANCA:=p[aUXY];
END;
Application.ProcessMessages;
BProgreso.stepIt;
end;
ZhangSuenModificado(matrizBy,Bprogreso,bitmap,imagen1.Picture.Width-1,imagen1.Picture.Height-1);

for auxX := 0 to imagen1.Picture.Height-1 DO


begin
P := imagen1.picture.bitmap.ScanLine[auxx];
for auxY:=0 to imagen1.Picture.Width-1 DO
begin
if matrizBy[AUXY,AUXX]=1 then
p[AUXY]:=ENTRADArOJA
else
P[AUXY]:=eNTRADAbLANCA;
end;
Application.ProcessMessages;
BProgreso.stepIt;
end;
BProgreso.position:=0;

bitmap.Canvas.CopyRect(rectangulo,imagen1.canvas,rectangulo);
imagen1.Destroy;
imagen1:=TImage.create(ActiveMdichild as TFilla);
Imagen1.Left:=abajo;
imagen1.top:=arriba;
imagen1.width:=ancho;
imagen1.height:=alto;
imagen1.visible:=true;
imagen1.enabled:=true;
imagen1.center:=false;
imagen1.stretch:=true;
imagen1.name:='imagen1';
imagen1.parent:=Scrollbox1;
imagen1.PopupMenu:=popupMenu1;
imagen1.onMouseDown:=Imagen1MouseDown;
imagen1.onMouseMove:=Imagen1MouseMove;
imagen1.width:=AnchoB;
imagen1.height:=AltoB;
imagen1.autosize:=false;

60
Manual de usuario:
imagen1.canvas.Draw(0,0,bitmap);
bitmapRoj:=TBitmap.Create;
bitmapRoj.Width:=imagen1.Picture.Width;
bitmapRoj.Height:=Imagen1.Picture.Height;
rectangulo.Left:=0;
rectangulo.Top:=0;
rectangulo.Right:=imagen1.Picture.Width;
rectangulo.Bottom:=Imagen1.Picture.Height;
copiaMatriz(matrizBy,matrizByAux,imagen1.Picture.Width,imagen1.Picture.Height);
bitmapaux.Canvas.CopyRect(rectangulo,bitmap.canvas,rectangulo);
bitmapRoj.Canvas.CopyRect(rectangulo,bitmap.canvas,rectangulo);
copiaMatriz(matrizBy,matrizByRoj,imagen1.Picture.Width,imagen1.Picture.Height);
end;
Bestado.Panels.Clear;
screen.cursor:=CrDefault;
BRestaurar2.visible:=true;
PanelUnir.visible:=true;
Grupo1.visible:=false;
panel4.visible:=false;
end;
procedure TVPrincipal.UnirClick(Sender: TObject);
var
rectangulo:Trect;
begin
unir.visible:=false;
screen.cursor:=CrHourGlass;
Bestado.Panels.Clear;
Application.ProcessMessages;
with BEstado.Panels.add do
Text:='Eliminando Descontinuidades';
with ActiveMdichild as TFilla do
begin
EstadoImagen:=2;
rectangulo.Left:=0;
rectangulo.Top:=0;
rectangulo.Right:=bitmap.Width;
rectangulo.Bottom:=bitmap.Height;
copiaMatriz(matrizByAux,matrizByRoj,bitmap.width,bitmap.Height);
bitmapRoj.Canvas.CopyRect(rectangulo,bitmapaux.canvas,rectangulo);
eliminarDescontinuidades(matrizByAux,bitmapAux,imagen1.Picture.Width-1,imagen1.Picture.height-1,maxUnion);
imagen1.Canvas.Draw(0,0,bitmapAux);
DibujarImagen(contadorZoom,imagen1,imagen1.Picture.Width,imagen1.Picture.Height);
end;
ShowMessage('Fin del Proceso');
Bestado.Panels.Clear;
screen.cursor:=CrDefault;
end;

procedure TVPrincipal.BRuidoClick(Sender: TObject);


var
rectangulo:Trect;
auxforx,auxfory:integer;
begin
screen.cursor:=CrHourGlass;
Bestado.Panels.Clear;
Application.ProcessMessages;
with BEstado.Panels.add do
Text:='Eliminando Ruido';
if unir.visible=true then
begin
rectangulo.Left:=0;
rectangulo.Top:=0;
with ActiveMdichild as TFilla do
begin
EstadoImagen:=1;
rectangulo.Right:=bitmap.Width;
rectangulo.Bottom:=bitmap.Height;
EliminacionDeTramos(bitmapAux,matrizByAux,BProgreso,StrToInt(Ruido.Text),imagen1.Picture.Width-1,imagen1.Picture.height-1);
imagen1.Canvas.Draw(0,0,bitmapaux);
DibujarImagen(contadorZoom,imagen1,imagen1.Picture.Width,imagen1.Picture.Height);

61
Manual de usuario:
end;
end
else
with ActiveMdichild as TFilla do
begin
BRestaurar2Click(self);
Unir.Visible:=false;
ruido.visible:=false;
Bruido.visible:=false;
rectangulo.Left:=0;
rectangulo.Top:=0;
rectangulo.Right:=bitmap.Width;
rectangulo.Bottom:=bitmap.Height;
copiaMatriz(matrizByAux,matrizByRoj,bitmap.width,bitmap.Height);
bitmapRoj.Canvas.CopyRect(rectangulo,bitmapaux.canvas,rectangulo);
bitmapaUX:=TBitmap.Create;
bitmapAUX.Width:=imagen1.Picture.Width;
bitmapAUX.Height:=Imagen1.Picture.Height;

EliminacionDeTramos(bitmapAux,matrizByAux,BProgreso,StrToInt(Ruido.Text),imagen1.Picture.Width-1,imagen1.Picture.height-1);
eliminarDescontinuidades(matrizByAux,bitmapaUX,imagen1.Picture.Width-1,imagen1.Picture.height-1,maxLinea);
EliminacionDeTramos(bitmapAux,matrizByAux,BProgreso,StrToInt(Ruido.Text),imagen1.Picture.Width-1,imagen1.Picture.height-1);

imagen1.Canvas.Draw(0,0,bitmapAux);
DibujarImagen(contadorZoom,imagen1,imagen1.Picture.Width,imagen1.Picture.Height);
end;
ShowMessage('Fin del Proceso');
VPrincipal.Cursor:=CrDefault;
Bestado.Panels.Clear;
screen.cursor:=CrDefault;
end;

procedure TVPrincipal.Salir(Sender: TObject);


var
fichero:file of byte;
auxFor,auxFor2:integer;
auxForFillas:integer;
nome:string;
begin
for auxForFillas:=0 to MDIChildCount-1 do
begin
nome:=(MdiChildren[auxForFillas] as Tfilla).nomeFichero;
with (MdiChildren[auxForFillas] as Tfilla) do
begin
if nome<>''then
begin
assignFile(fichero,nome);
reset(fichero);
seek(fichero,54);
for auxFor:=0 to 255 do
for auxFor2:=1 to 4 do
write(fichero,paleta[auxFor,auxFor2]);
closeFile(fichero);
Imagen1.Picture.LoadFromFile(nomeFichero);
dibujarImagen(contadorZoom,imagen1,imagen1.Picture.Width,imagen1.Picture.Height);
if (DeleteFile(nomeFichero+'temporal.bmp'))then
begin
end
else ;
end;
end; // do with
end;// do for
end; //dor procedimento

procedure TVPrincipal.botonR(Sender: TObject);


begin
panel4.visible:=false;
panel5.visible:=false;
end;

62
Manual de usuario:
procedure TVPrincipal.Cascada1Click(Sender: TObject);
begin
Cascade;
end;

procedure TVPrincipal.Mosaico1Click(Sender: TObject);


begin
Tile;
end;

procedure TVPrincipal.Imprimir1Click(Sender: TObject);


var rectangulo:trect;
punto:tpoint;
begin
punto.x:=0;
punto.y:=0;
if MDIChildCount>0 then
with ActiveMdichild as TFilla do
begin
rectangulo.top:=5;
rectangulo.left:=5;
rectangulo.Right:=(imagen1.picture.Width)*3;
rectangulo.Bottom:=(imagen1.picture.Height)*3;
printer.PrinterIndex:=-1;
printer.Orientation:=poPorTrait;
Printer.BeginDoc;

printer.Canvas.PenPos:=punto;
printer.Canvas.Brush.color:=RGB(250,0,0);
printer.Canvas.Brush.style:=bsSolid;
printer.Canvas.pen.color:=RGB(250,0,0);
printer.Canvas.pen.style:=psSolid ;

printer.canvas.StretchDraw(rectangulo,imagen1.picture.bitmap);
printer.EndDoc;
end// do with active
else showmessage('Non hai nada a imprimir');
end;

procedure TVPrincipal.BLineaClick(Sender: TObject);


begin

BBorrar.down:=false;
with(ActiveMdichild as TFilla)do
begin
primero:=true;
BoolDibuja:=false;
end;
end;

procedure TVPrincipal.BLineaEClick(Sender: TObject);


begin
with(ActiveMdichild as TFilla)do
begin
primero:=true;
BoolDibuja:=false;
end;

end;

procedure TVPrincipal.BRestaurar2Click(Sender: TObject);


var
rectangulo:trect;
begin
BRestaurar2.down:=false;
GrupoLineas.visible:=false;
BEt.down:=false;
PanelEt.Visible:=false;
PanelUnir.visible:=true;
unir.visible:=true;

63
Manual de usuario:
ruido.visible:=true;
Bruido.visible:=true;

with(ActiveMdichild as TFilla)do
begin
Maltura.Destroy;
Maltura:=TMaltura.Create(0);
rectangulo.Left:=0;
rectangulo.Top:=0;
rectangulo.Right:=bitmapRoj.Width;
rectangulo.Bottom:=bitmapRoj.Height;
bitmapAux.Canvas.CopyRect(rectangulo,bitmapRoj.canvas,rectangulo);
copiaMatriz(matrizByRoj,MatrizByAux,imagen1.picture.width,imagen1.Picture.Height);
bitmap.Canvas.CopyRect(rectangulo,bitmapRoj.canvas,rectangulo);
copiaMatriz(matrizByRoj,MatrizBy,imagen1.picture.width,imagen1.Picture.Height);
imagen1.Canvas.StretchDraw(Rectangulo,bitmap);
end;
end;

procedure TVPrincipal.BExtremosClick(Sender: TObject);


begin
with(ActiveMdichild as TFilla)do
begin
Extremos(matrizByAux,bitmapAux,imagen1.picture.Width,imagen1.picture.Height);
end;
end;

procedure TVPrincipal.Colores2Click(Sender: TObject);


var auxFx,auxFy:integer;
begin
with(ActiveMdichild as TFilla)do
begin
Maltura.ensenha;
while Maltura.fcambios=true do
begin
for auxFx:=0 to imagen1.picture.Width-1 do
for auxFy:=0 to imagen1.Picture.Height-1 do
begin
if bitmapaux.Canvas.pixels[AuxFx,auxFy]=Maltura.colorA then
bitmapAux.Canvas.pixels[AuxFx,auxFy]:=Maltura.colorN;
end;
Maltura.PonherCambioFalse;
imagen1.Canvas.Draw(0,0,bitmapaux);
DibujarImagen(contadorZoom,imagen1,imagen1.Picture.Width,imagen1.Picture.Height);
Maltura.ensenha;
end;
end;

end;

procedure TVPrincipal.BPixelsClick(Sender: TObject);


begin
with(ActiveMdichild as TFilla)do
primero:=true;
end;

procedure TVPrincipal.BAfirmaClick(Sender: TObject);


var
auxFor2,auxFor:integer;
fichero:file of byte;
rectangulo:trect;
begin
with ActiveMdichild as TFilla do
begin
assignFile(fichero,nomeFichero);
reset(fichero);
seek(fichero,54);
for auxFor:=0 to 255 do
for auxFor2:=1 to 4 do
write(fichero,paleta[auxFor,auxFor2]);

64
Manual de usuario:
closeFile(fichero);
assignFile(fichero,nomeFichero);
reset(fichero);
for auxFor:=0 to 255 do
begin
if Vcolor.esta((RGB(paleta[auxFor,3],paleta[auxFor,2],paleta[auxFor,1]))) then
begin
paletaNueva[auxFor,1]:=paleta[auxFor,1];
paletaNueva[auxFor,2]:=paleta[auxFor,2];
paletaNueva[auxFor,3]:=paleta[auxFor,3];
end
else
begin
paletaNueva[auxFor,1]:=255;
paletaNueva[auxFor,2]:=255;
paletaNueva[auxFor,3]:=255;
end;
end;

seek(fichero,54);
for auxFor:=0 to 255 do
for auxFor2:=1 to 4 do
write(fichero,paletaNueva[auxFor,auxFor2]);
closeFile(fichero);
Imagen1.Picture.LoadFromFile(nomeFichero);
rectangulo.Left:=0;
rectangulo.Top:=0;
rectangulo.Right:=imagen1.Width;
rectangulo.Bottom:=imagen1.Height ;
imagen1.AutoSize:=false; //un ano
imagen1.canvas.Draw(0,0,imagen1.Picture.bitmap);
dibujarImagen(contadorZoom,imagen1,imagen1.Picture.Width,imagen1.Picture.Height);
end;
end;

procedure TVPrincipal.BBorrarClick(Sender: TObject);


begin
with(ActiveMdichild as TFilla)do
begin
radioBorrar:=Borrado;
BLinea.down:=false;;
end;
end;

procedure TVPrincipal.TamaodeBorrar1Click(Sender: TObject);


begin
Application.CreateForm(TFPregunta,FPregunta);
borrado:=FPregunta.showModal;
if borrado=-1 then borrado:=0;
if borrado>50 then borrado:=50;
Fpregunta.Free;
if MDIChildCount>0 then
with(ActiveMdichild as TFilla)do
radioBorrar:=Borrado;
end;

procedure TVPrincipal.VerHerramientas1Click(Sender: TObject);


begin

with (ActiveMdichild as TFilla) do


begin
imagen2.Canvas.Draw(0,0,bitmapN);
DibujarImagen(contadorZoom2,imagen2,imagen1.Picture.Width,imagen1.Picture.Height);
end;
Bet.down:=false;
BLinea.down:=false;;
GDistancia.visible:=true;
BRuta.down:=false;

end;

65
Manual de usuario:

procedure TVPrincipal.confirmacionClick(Sender: TObject);


begin
with (ActiveMdichild as TFilla) do
begin
imagen2.Canvas.Draw(0,0,bitmapN);
DibujarImagen(contadorZoom2,imagen2,imagen1.Picture.Width,imagen1.Picture.Height);
end;
GDistancia.visible:=false;
BReferencia.Down:=false;
Bregion.down:=false;
BMedir.Down:=false;
BArea.Down:=false;
BNoCo.down:=false;
panel2.Visible:=true;
end;

procedure TVPrincipal.LineaClick(Sender: TObject);


var Respuesta:integer;
begin
Application.CreateForm(TFPregunta,FPregunta);
respuesta:=FPregunta.showModal;
if respuesta=-1 then respuesta:=0;
if respuesta>1000 then respuesta:=1000;
Fpregunta.Free;
if MDIChildCount>0 then
with(ActiveMdichild as TFilla)do
MaxLinea:=Respuesta;
end;

procedure TVPrincipal.OrganizarIconos1Click(Sender: TObject);


begin
ArrangeIcons
end;

procedure TVPrincipal.BEstadisticaClick(Sender: TObject);


var
auxFor,auxForX,auxForY:integer;
begin
with(ActiveMdichild as TFilla)do
begin
Maltura.sumaCero;
for auxForX:=1 to imagen1.picture.Width do
for auxForY:=1 to imagen1.picture.Height do
Maltura.sumaColor(bitmapAux.Canvas.pixels[auxForX,auxForY]);
end;
Application.CreateForm(TVChar2,vChar2);
with(ActiveMdichild as TFilla)do
begin
if fraccion=0 then fraccion:=1;
for auxFor:=1 to MAltura.nElementos do
begin
VChar2.Series1.addPie(Maltura.SumaDeIndice(auxFor)*fraccion*fraccion/1000,
IntToStr(Maltura.alturaDeIndice(auxFor))+' metros',
MAltura.colorDeIndice(auxFor));
end;
end;

VChar2.Show;
end;

procedure TVPrincipal.Crear1Click(Sender: TObject);


var Vcomposicion:TVComposicion;
begin
Application.CreateForm(TVcomposicion,Vcomposicion);
Vcomposicion.Show;
end;

procedure TVPrincipal.MaximaLongitudDeUnion1Click(Sender: TObject);


var

66
Manual de usuario:
Respuesta:integer;
begin
Application.CreateForm(TFPregunta,FPregunta);
respuesta:=FPregunta.showModal;
if respuesta=-1 then respuesta:=0;
if respuesta>1000 then respuesta:=1000;
Fpregunta.Free;
if MDIChildCount>0 then
with(ActiveMdichild as TFilla)do
MaxUnion:=Respuesta;
end;

procedure TVPrincipal.boton3dClick(Sender: TObject);


begin
EditBase.Visible:=true;
EditMalla.visible:=true;
confirmacionLineas.visible:=true;
labelLineas.visible:=true;
label2.visible:=true;

end;

procedure TVPrincipal.ExtraerClick(Sender: TObject);


begin
grupo1.Visible:=false;
panelcores.Visible:=true;
end;

procedure TVPrincipal.Shape1MouseDown(Sender: TObject;


Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
shape1.Pen.color:=clblack;
shape2.Pen.color:=clblack;
shape3.Pen.color:=clblack;
shape4.Pen.color:=clblack;
shape5.Pen.color:=clblack;
(Sender as Tshape).Pen.Color:=clRed;
if (Sender as Tshape).name='Shape1' then
Barra.position:=strToInt(mascara1.text)else
if (Sender as Tshape).name='Shape2' then
Barra.position:=strToInt(mascara2.text)else
if (Sender as Tshape).name='Shape3' then
Barra.position:=strToInt(mascara3.text)else
if (Sender as Tshape).name='Shape4' then
Barra.position:=strToInt(mascara4.text)else
if (Sender as Tshape).name='Shape5' then
Barra.position:=strToInt(mascara5.text);
panel4.Visible:=true;
end;

procedure TVPrincipal.BarraChange(Sender: TObject);


var
iumbral:integer; //iumbral:'i-umbral' de umbral integer
auxFor,auxFor2: Integer;
fichero:file of byte;
rectangulo:tReCt;
colorS1,colorS2,colorS3,colorS4,colorS5:tcolor;
Elegido1,Elegido2,Elegido3,Elegido4,Elegido5:integer;
iumbralTxt:string;
begin
Elegido1:=1;
Elegido2:=1;
Elegido3:=1;
Elegido4:=1;
Elegido5:=1;
ColorS1:=Shape1.brush.color;
ColorS2:=Shape2.brush.color;
ColorS3:=Shape3.brush.color;
ColorS4:=Shape4.brush.color;

67
Manual de usuario:
ColorS5:=Shape5.brush.color;
iumbral:=Barra.Position;
umbral.Text:=IntToStr(iumbral div 10);
iumbraltxt:=IntToStr(Barra.Position);
if Shape1.Pen.color=clRed then mascara1.text:=iumbraltxt
else if Shape2.Pen.color=clRed then mascara2.text:=iumbraltxt
else if Shape3.Pen.color=clRed then mascara3.text:=iumbraltxt
else if Shape4.Pen.color=clRed then mascara4.text:=iumbraltxt
else if Shape5.Pen.color=clRed then mascara5.text:=iumbraltxt;
with(ActiveMDIChild as Tfilla) do
begin
for auxFor:=0 to 255 do
if RGB(paleta[auxfor,3],paleta[auxfor,2],paleta[auxfor,1])=colorS1 then Elegido1:=auxFor
else if RGB(paleta[auxfor,3],paleta[auxfor,2],paleta[auxfor,1])=colorS2 then Elegido2:=auxFor
else if RGB(paleta[auxfor,3],paleta[auxfor,2],paleta[auxfor,1])=colorS3 then Elegido3:=auxFor
else if RGB(paleta[auxfor,3],paleta[auxfor,2],paleta[auxfor,1])=colorS4 then Elegido4:=auxFor
else if RGB(paleta[auxfor,3],paleta[auxfor,2],paleta[auxfor,1])=colorS5 then Elegido5:=auxFor;

assignFile(fichero,nomeFichero);
reset(fichero);
seek(fichero,54);
for auxFor:=0 to 255 do
for auxFor2:=1 to 4 do
write(fichero,paleta[auxFor,auxFor2]);
closeFile(fichero);

assignFile(fichero,nomeFichero);
reset(fichero);
seek(fichero,54);
for auxFor:=0 to 255 do
for auxFor2:=1 to 4 do
begin
read(fichero,paleta[auxFor,auxFor2]);
end;
for auxFor:=0 to 255 do
begin
if (
(abs(Paleta[auxFor,1]-Paleta[elegido1,1])
+abs(Paleta[auxFor,2]-Paleta[elegido1,2])
+ abs(Paleta[auxFor,3]-Paleta[elegido1,3])<strToInt(mascara1.text)
)
or
(abs(Paleta[auxFor,1]-Paleta[elegido2,1])
+abs(Paleta[auxFor,2]-Paleta[elegido2,2])
+ abs(Paleta[auxFor,3]-Paleta[elegido2,3])<strToInt(mascara2.text)
)
or
(abs(Paleta[auxFor,1]-Paleta[elegido3,1])
+abs(Paleta[auxFor,2]-Paleta[elegido3,2])
+ abs(Paleta[auxFor,3]-Paleta[elegido3,3])<strToInt(mascara3.text)
)
or
(abs(paleta[auxFor,1]-Paleta[elegido4,1])
+abs(Paleta[auxFor,2]-Paleta[elegido4,2])
+ abs(Paleta[auxFor,3]-Paleta[elegido4,3])<strToInt(mascara4.text)
)
or
(abs(Paleta[auxFor,1]-Paleta[elegido5,1])
+abs(paleta[auxFor,2]-Paleta[elegido5,2])
+ abs(paleta[auxFor,3]-Paleta[elegido5,3])<strToInt(mascara5.text)
)
)
then

begin
paletaNueva[auxFor,1]:=paleta[auxFor,1];
paletaNueva[auxFor,2]:=Paleta[auxFor,2];
paletaNueva[auxFor,3]:=Paleta[auxFor,3];
end

68
Manual de usuario:
else
begin
paletaNueva[auxFor,1]:=255;
paletaNueva[auxFor,2]:=255;
paletaNueva[auxFor,3]:=255;
end;
end;

seek(fichero,54);
for auxFor:=0 to 255 do
for auxFor2:=1 to 4 do
write(fichero,paletaNueva[auxFor,auxFor2]);

closeFile(fichero);
Imagen1.Picture.LoadFromFile(NomeFichero);
rectangulo.Left:=0;
rectangulo.Top:=0;
rectangulo.Right:=imagen1.Width;
rectangulo.Bottom:=imagen1.Height ;
imagen1.AutoSize:=false; //un ano
imagen1.canvas.Draw(0,0,imagen1.Picture.bitmap);//?

dibujarImagen(contadorZoom,imagen1,imagen1.Picture.Width,imagen1.Picture.Height);
end;
end;

procedure TVPrincipal.mascara1KeyPress(Sender: TObject; var Key: Char);


var
iumbral:integer; //iumbral:'i-umbral' de umbral integer
auxFor,auxFor2: Integer;
fichero:file of byte;
rectangulo:tReCt;
colorS1,colorS2,colorS3,colorS4,colorS5:tcolor;
Elegido1,Elegido2,Elegido3,Elegido4,Elegido5:integer;
iumbralTxt:string;
begin
if ((Key<'0')Or(Key>'9') and (Key<>#8))and(Key<>#13)then
KEY:=#0;
if (Key=#13)then
begin

Elegido1:=1;
Elegido2:=1;
Elegido3:=1;
Elegido4:=1;
Elegido5:=1;
ColorS1:=Shape1.brush.color;
ColorS2:=Shape2.brush.color;
ColorS3:=Shape3.brush.color;
ColorS4:=Shape4.brush.color;
ColorS5:=Shape5.brush.color;

iumbral:=Barra.Position;
umbral.Text:=IntToStr(iumbral div 10);
iumbraltxt:=IntToStr(Barra.Position);

if Shape1.Pen.color=clRed then barra.position:=StrToInt(mascara1.text)


else if Shape2.Pen.color=clRed then barra.position:=StrToInt(mascara2.text)
else if Shape3.Pen.color=clRed then barra.position:=StrToInt(mascara3.text)
else if Shape4.Pen.color=clRed then barra.position:=StrToInt(mascara4.text)
else if Shape5.Pen.color=clRed then barra.position:=StrToInt(mascara5.text);

with(ActiveMDIChild as Tfilla) do
begin
for auxFor:=0 to 255 do
if RGB(paleta[auxfor,3],paleta[auxfor,2],paleta[auxfor,1])=colorS1 then Elegido1:=auxFor
else if RGB(paleta[auxfor,3],paleta[auxfor,2],paleta[auxfor,1])=colorS2 then Elegido2:=auxFor
else if RGB(paleta[auxfor,3],paleta[auxfor,2],paleta[auxfor,1])=colorS3 then Elegido3:=auxFor

69
Manual de usuario:
else if RGB(paleta[auxfor,3],paleta[auxfor,2],paleta[auxfor,1])=colorS4 then Elegido4:=auxFor
else if RGB(paleta[auxfor,3],paleta[auxfor,2],paleta[auxfor,1])=colorS5 then Elegido5:=auxFor;

assignFile(fichero,nomeFichero);
reset(fichero);
seek(fichero,54);
for auxFor:=0 to 255 do
for auxFor2:=1 to 4 do
write(fichero,paleta[auxFor,auxFor2]);
closeFile(fichero);

assignFile(fichero,nomeFichero);
reset(fichero);
seek(fichero,54);
for auxFor:=0 to 255 do
for auxFor2:=1 to 4 do
read(fichero,paleta[auxFor,auxFor2]);

for auxFor:=0 to 255 do


begin
if (
(abs(paleta[auxFor,1]-paleta[elegido1,1])
+abs(paleta[auxFor,2]-paleta[elegido1,2])
+ abs(paleta[auxFor,3]-paleta[elegido1,3])<strToInt(mascara1.text)
)
or
(abs(paleta[auxFor,1]-paleta[elegido2,1])
+abs(paleta[auxFor,2]-paleta[elegido2,2])
+ abs(paleta[auxFor,3]-paleta[elegido2,3])<strToInt(mascara2.text)
)
or
(abs(paleta[auxFor,1]-paleta[elegido3,1])
+abs(paleta[auxFor,2]-paleta[elegido3,2])
+ abs(paleta[auxFor,3]-paleta[elegido3,3])<strToInt(mascara3.text)
)
or
(abs(paleta[auxFor,1]-paleta[elegido4,1])
+abs(paleta[auxFor,2]-paleta[elegido4,2])
+ abs(paleta[auxFor,3]-paleta[elegido4,3])<strToInt(mascara4.text)
)
or
(abs(paleta[auxFor,1]-paleta[elegido5,1])
+abs(paleta[auxFor,2]-paleta[elegido5,2])
+ abs(paleta[auxFor,3]-paleta[elegido5,3])<strToInt(mascara5.text)
)
)
then

begin
paletaNueva[auxFor,1]:=paleta[auxFor,1];
paletaNueva[auxFor,2]:=Paleta[auxFor,2];
paletaNueva[auxFor,3]:=Paleta[auxFor,3];
end
else
begin
paletaNueva[auxFor,1]:=255;
paletaNueva[auxFor,2]:=255;
paletaNueva[auxFor,3]:=255;
end;
end;

seek(fichero,54);
for auxFor:=0 to 255 do
for auxFor2:=1 to 4 do
write(fichero,paletaNueva[auxFor,auxFor2]);

closeFile(fichero);
Imagen1.Picture.LoadFromFile(NomeFichero);
rectangulo.Left:=0;
rectangulo.Top:=0;

70
Manual de usuario:
rectangulo.Right:=imagen1.Width;
rectangulo.Bottom:=imagen1.Height ;
imagen1.AutoSize:=false; //un ano
imagen1.canvas.Draw(0,0,imagen1.Picture.bitmap);

dibujarImagen(contadorZoom,imagen1,imagen1.Picture.Width,imagen1.Picture.Height);
end;
end;
end;

procedure TVPrincipal.BAfirmaCClick(Sender: TObject);


begin
panelCores.Visible:=false;
grupo1.Visible:=true;
panel4.visible:=false;
shape1.Pen.color:=clblack;
shape2.Pen.color:=clblack;
shape3.Pen.color:=clblack;
shape4.Pen.color:=clblack;
shape5.Pen.color:=clblack;
(ActiveMdichild as TFilla).EstadoImagen:=0;
end;

procedure TVPrincipal.SpeedButton1Click(Sender: TObject);


begin
mascara1.Text:='000';
mascara2.Text:='000';
mascara3.Text:='000';
mascara4.Text:='000';
mascara5.Text:='000';
shape1.Brush.Color:=clWhite;
shape2.Brush.Color:=clWhite;
shape3.Brush.Color:=clWhite;
shape4.Brush.Color:=clWhite;
shape5.Brush.Color:=clWhite;
end;

procedure TVPrincipal.Creditos1Click(Sender: TObject);


begin
Application.CreateForm(TVcreditos,Vcreditos);
VCreditos.showmodal;
VCreditos.Free;

end;

procedure TVPrincipal.BEtClick(Sender: TObject);


begin
GrupoLineas.visible:=false;
PanelEt.Visible:=true;
BLinea.down:=false;
BBorrar.down:=false;
with(ActiveMdichild as TFilla)do
begin
primero:=true;
BoolDibuja:=false;
EstadoImagen:=4;
end;
end;

procedure TVPrincipal.SpeedButton2Click(Sender: TObject);


begin
PanelUnir.visible:=false;
panelEt.visible:=false;
GrupoLineas.visible:=true;
with ActiveMdichild as TFilla do
EstadoImagen:=3;
end;

71
Manual de usuario:
procedure TVPrincipal.CorEt1MouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if DiaCor.Execute then
corEt1.Brush.color:=DiaCor.Color;
end;

procedure TVPrincipal.RadioAlturaClick(Sender: TObject);


begin
if RadioAltura.ItemIndex=1 then
panelEdits.visible:=true
else
panelEdits.visible:=false;
end;

procedure TVPrincipal.RadioColorClick(Sender: TObject);


begin
if RadioColor.ItemIndex=1 then
begin
PanelCorGra.visible:=true;
CorEt1.Brush.Color:=RGB(random(255),random(255),random(255));
end
else
PanelCorGra.visible:=false;
end;

procedure TVPrincipal.SpeedButton3Click(Sender: TObject);


begin
PanelUnir.visible:=false;
GrupoLineas.visible:=true;
with ActiveMdichild as TFilla do
EstadoImagen:=3;
end;

procedure TVPrincipal.EditBaseKeyPress(Sender: TObject; var Key: Char);


begin
if ((Key<'0')or(Key>'9')and(key<>#8)) Then
Key:=#0;
end;

procedure TVPrincipal.ConfirmacionLineasClick(Sender: TObject);


begin
with(ActiveMdichild as TFilla)do
tresD;
label2.visible:=false;
EditBase.Visible:=false;
EditMalla.visible:=false;
confirmacionLineas.visible:=false;
labelLineas.visible:=false;
boton3d.Down:=false;
end;

procedure TVPrincipal.SpeedButton4Click(Sender: TObject);


begin
with(ActiveMdichild as TFilla)do
Tabla;
end;

procedure TVPrincipal.Interpolacin1Click(Sender: TObject);


begin
if MDIChildCount<>0 then
begin
with(ActiveMdichild as TFilla)do
begin
interpolacion:=not(interpolacion);
if interpolacion then
Interpolacin1.checked:=true
else

72
Manual de usuario:
Interpolacin1.checked:=false
end;
end;
end;

procedure TVPrincipal.Parametros1Click(Sender: TObject);


begin
if MDIChildCount<>0 then
begin
interpolacin1.enabled:=true;
with(ActiveMdichild as TFilla)do
begin
if interpolacion then
Interpolacin1.checked:=true
else
Interpolacin1.checked:=false
end;
end else interpolacin1.enabled:=false;

73
Manual de usuario:

5.3. FILLA2.PAS

procedure Tfilla.tabla;
var
iX1,iy1,auxForX,auxForY:integer;
fila,columna:integer;
altura:string;

begin
Application.CreateForm(TFTabla,FTabla);
Ftabla.show;

while (imagen1.width>30) do
procedimientoZoomMenos(contadorZoom,imagen1,imagen1.picture.width,imagen1.picture.height);;
auxforX:=0;
auxforY:=0;
fila:=0;columna:=0;
for auxforx:=0 to imagen1.Width-1 do
for auxfory:=0 to imagen1.Height-1 do
begin
if ContadorZoom>0 then
begin
iX1:=auxforX div ContadorZoom;
iY1:=auxforY div ContadorZoom;
end
else
begin
iX1:=auxforX*(abs(ContadorZoom));
iy1:=auxforY* (abs(ContadorZoom));
end;
altura:=IntToStr(Maltura.AlturaDeColor
(imagen1.Canvas.pixels[ix1,iY1]));
try
FTabla.{(Owner as TVPrincipal)}F1.entryRC[auxForX+1,auxForY+1]:=altura;
except
showmessage('Error de Gráficos, Falta Instalar First Impression...');
end;
end; //do for
contadorZoom:=contadorZoom2;
dibujarImagen(contadorZoom,imagen1,imagen1.picture.Width,imagen1.picture.height);
ScrollBox1.HorzScrollBar.position:=ScrollBox2.HorzScrollBar.position;
ScrollBox1.VertScrollBar.Position:=ScrollBox2.VertScrollBar.Position;
end;

procedure Tfilla.colorea1Region(x1,y1:integer;ColorCambiado:tcolor);
var
dx,dy,altura,auxFx,auxFy,ancho,alto:integer;
cambio:boolean;
color:tcolor;
begin
screen.cursor:=crHourGlass;
If (Owner as TVPrincipal).DiaCor.execute then
begin
color:=(Owner as TVPrincipal).Diacor.color;
Application.CreateForm(TFPregunta,FPregunta);
altura:=FPregunta.showModal;
if altura=-1 then altura:=0;
Fpregunta.Free;
ancho:=imagen1.picture.Width;
alto:=imagen1.picture.Height;
for dx:=0 to ancho do
for dy:=0 to alto do
if imagen1.picture.bitmap.canvas.pixels[dx,dy]=ColorCambiado
then matrizByAuxC[dx,dy]:=1
else matrizByAuxC[dx,dy]:=0;

MAltura.Anhadir(color,altura);
matrizByAuxC[x1,y1]:=2;
cambio:=true;
74
Manual de usuario:
while cambio do
begin
cambio:=false;
for auxFx:=1 to ancho-2 do
for auxFy:=1 to alto-2 do
if matrizByAuxC[auxFx,auxFy]=2 then
begin
if (matrizByAuxC[auxFx-1,auxFy]=1)then //18->linea de zona
begin
dx:=auxFx-1;
dy:=auxFy;
matrizByAuxC[dx,dy]:=2;
cambio:=true;
dx:=dx-1;
dy:=dy;
while (matrizByAuxC[dx,dy]=1)
and(dx>1)and(dx<ancho-2)and(dy>1)and(dy<alto-2) do
begin
matrizByAuxC[dx,dy]:=2;
dx:=dx-1;
dy:=dy;
end; //do while
end;//do if
if (matrizByAuxC[auxFx+1,auxFy]=1)then //18->linea de zona
begin
dx:=auxFx+1;
dy:=auxFy;
matrizByAuxC[dx,dy]:=2;
cambio:=true;
dx:=dx+1;
dy:=dy;
while (matrizByAuxC[dx,dy]=1)and
(dx>1)and(dx<ancho-2)and(dy>1)and(dy<alto-2) do
begin
matrizByAuxC[dx,dy]:=2;
dx:=dx+1;
dy:=dy;
end; //do while
end; //do if

if (matrizByAuxC[auxFx,auxFy+1]=1) then //18->linea de zona


begin
dx:=auxFx;
dy:=auxFy+1;
matrizByAuxC[dx,dy]:=2;
cambio:=true;
dx:=dx;
dy:=dy+1;
while (matrizByAuxC[dx,dy]=1)
and(dx>1)and(dx<ancho-2)and(dy>1)and(dy<alto-2)do
begin
matrizByAuxC[dx,dy]:=2;
dx:=dx;
dy:=dy+1;
end; //do while
end; //do if}
if (matrizByAuxC[auxFx,auxFy-1]=1) then //18->linea de zona
begin
dx:=auxFx;
dy:=auxFy-1;
matrizByAuxC[dx,dy]:=2;
cambio:=true;
dx:=dx;
dy:=dy-1;
while (matrizByAuxC[dx,dy]=1)
and(dx>1)and(dx<ancho-2)and(dy>1)and(dy<alto-2)do
begin
matrizByAuxC[dx,dy]:=2;
dx:=dx;
dy:=dy-1;

75
Manual de usuario:
end; //del while
end //del if
end;//do if matriz[auxFx,auxFy]=25
end;//do while cambio
end;
screen.cursor:=crDefault;
for dx:=0 to ancho do
for dy:=0 to alto do
if matrizByAuxC[dx,dy]=2 then
begin
imagen1.picture.bitmap.canvas.pixels[dx,dy]:=Color;
bitmapAux.Canvas.pixels[dx,dy]:=Color;
end;
end;
procedure Tfilla.coloreaN(x1,y1:integer;color:tcolor;ancho,alto:integer);
var
AuxFx,auxFy,dx,dy:integer;
cambio:boolean;
altura:integer;
alturaString:string;
preparado:boolean;
begin
bitmapAUX.Canvas.Pen.Mode:=pmCopy;
Application.CreateForm(TFPregunta,FPregunta);
altura:=FPregunta.showModal;
if altura=-1 then altura:=0;
Fpregunta.Free;
Preparado:=true;
for dx:=0 to ancho do
for dy:=0 to alto do
if matrizByAux[dx,dy]=18 then matrizByAuxC[dx,dy]:=18
else matrizByAuxC[dx,dy]:=0;
preparado:=true;
if preparado then
begin
screen.cursor:=crHourGlass;
bitmapAux.canvas.pixels[x1,y1]:=Color;
matrizByAuxC[x1,y1]:=25;
MAltura.Anhadir(color,altura);
cambio:=true;
while cambio do
begin
cambio:=false;
for auxFx:=1 to ancho-2 do
for auxFy:=1 to alto-2 do
if matrizByAuxC[auxFx,auxFy]=25 then
begin
if (matrizByAuxC[auxFx-1,auxFy]=0)then //18->linea de zona
begin
dx:=auxFx-1;
dy:=auxFy;
matrizByAuxC[dx,dy]:=25;
bitmapAux.canvas.pixels[dx,dy]:=color;
cambio:=true;
dx:=dx-1;
dy:=dy;
while (matrizByAuxC[dx,dy]<>18)and(dx>1)and(dx<ancho-2)and(dy>1)
and(dy<alto-2) do
begin
bitmapAux.canvas.pixels[dx,dy]:=color;
matrizByAuxC[dx,dy]:=25;
dx:=dx-1;
dy:=dy;
end; //do while
end;//do if

if (matrizByAuxC[auxFx+1,auxFy]=0)then //18->linea de zona


begin
dx:=auxFx+1;
dy:=auxFy;

76
Manual de usuario:
matrizByAuxC[dx,dy]:=25;
bitmapAux.canvas.pixels[dx,dy]:=color;
cambio:=true;
dx:=dx+1;
dy:=dy;
while (matrizByAuxC[dx,dy]<>18)and(dx>1)and(dx<ancho-2)and(dy>1)
and(dy<alto-2) do
begin
matrizByAuxC[dx,dy]:=25;
bitmapAux.canvas.pixels[dx,dy]:=color;
dx:=dx+1;
dy:=dy;
end; //do while
end; //do if
if (matrizByAuxC[auxFx,auxFy+1]=0) then //18->linea de zona
begin
dx:=auxFx;
dy:=auxFy+1;
matrizByAuxC[dx,dy]:=25;
bitmapAux.canvas.pixels[dx,dy]:=color;
cambio:=true;
dx:=dx;
dy:=dy+1;
while (matrizByAuxC[dx,dy]<>18)and(dx>1)and(dx<ancho-2)and(dy>1)
and(dy<alto-2)do
begin
matrizByAuxC[dx,dy]:=25;
bitmapAux.canvas.pixels[dx,dy]:=color;
dx:=dx;
dy:=dy+1;
end; //do while
end; //do if
if (matrizByAuxC[auxFx,auxFy-1]=0) then //18->linea de zona
begin
dx:=auxFx;
dy:=auxFy-1;
matrizByAuxC[dx,dy]:=25;
bitmapAux.canvas.pixels[dx,dy]:=color;
cambio:=true;
dx:=dx;
dy:=dy-1;
while (matrizByAuxC[dx,dy]<>18)and(dx>1)and(dx<ancho-2)and(dy>1)
and(dy<alto-2)do
begin
matrizByAuxC[dx,dy]:=25;
bitmapAux.canvas.pixels[dx,dy]:=color;
dx:=dx;
dy:=dy-1;
end; //del while
end //del if}
end;//do if matriz[auxFx,auxFy]=25}
end;//do while cambio
screen.cursor:=crDefault;
for dx:=0 to ancho do
for dy:=0 to alto do
if matrizByAuxC[dx,dy]=25 then
begin
if (matrizByAuxC[dx-1,dy]=18) then
begin
matrizByAuxC[dx-1,dy]:=10;
bitmapAux.canvas.pixels[dx-1,dy]:=color;
end;
if (matrizByAuxC[dx+1,dy]=18)then
begin
matrizByAuxC[dx+1,dy]:=10;
bitmapAux.canvas.pixels[dx+1,dy]:=color;
end;

if (matrizByAuxC[dx,dy+1]=18) then
begin

77
Manual de usuario:
matrizByAuxC[dx,dy+1]:=10;
bitmapAux.canvas.pixels[dx,dy+1]:=color;
end;

if (matrizByAuxC[dx,dy-1]=18) then
begin
matrizByAuxC[dx,dy-1]:=10;
bitmapAux.canvas.pixels[dx,dy-1]:=color;
end;
end;
end;
for dx:=0 to ancho do
for dy:=0 to alto do
if matrizByAux[dx,dy]=18 then matrizByAux[dx,dy]:=0;

end;

procedure TFilla.DEAux(var DistanciaPrincipio,DistanciaCr,DistanciaCV,DistanciaCA,rojo,azul,verde,largo:longint;var


CorPintar:TColor);
begin
DistanciaCr:=DistanciaCr+DistanciaPrincipio;
DistanciaCv:=DistanciaCv+DistanciaPrincipio;
DistanciaCA:=DistanciaCA+DistanciaPrincipio;
if ((rojo+DistanciaCr)>254)then
begin
rojo:=254;
DistanciaCr:=0
end;
if ((verde+DistanciaCv)>254)then
begin
verde:=254;
DistanciaCv:=0;
end;
if ((azul+DistanciaCa)>254)then
begin
azul:=254;
DistanciaCa:=0;
end;
if (rojo=254)and(verde=254)and(azul=254)then
begin
while (rojo+DistanciaCR>=254)OR(verde+DistanciaCv>=254)OR(azul+DistanciaCa>=254)do
begin
rojo:=(largo mod 256);
verde:=(largo div 256);
verde:=verde mod 256;
azul:=(largo div (256*256));
azul:=azul mod 256;
DistanciaPrincipio:=DistanciaPrincipio-1;
if DistanciaPrincipio=0 then DistanciaPrincipio:=-1;
DistanciaCr:=DistanciaPrincipio;
DistanciaCv:=DistanciaPrincipio;
DistanciaCa:=DistanciaPrincipio;
end;
end;
CorPintar :=RGB(rojo+DistanciaCR,verde+DistanciaCV,azul+DistanciaCa);
End;

Procedure Tfilla.EncontrarEtiqueta(puntoCentral:TPoint;colorElegido:Tcolor;var Faltura:real);


var
anchoI,AltoI:integer;
xi,yi:integer;
FAltura2:real;
FAltura1:real;
distanciaMetros:integer;
distanciaPixelICentro,distanciaPixelDCentro,factorMetrosPixel:real;
xprimero,yprimero,xsegundo,ysegundo:integer;
distanciaPixels:real;
encontradoA1,encontradoA2:boolean;
xprimeroA,yprimeroA,xsegundoA,ysegundoA:integer;
distanciaPixelsA:real;

78
Manual de usuario:
encontradoB1,encontradoB2:boolean;
xprimeroB,yprimeroB,xsegundoB,ysegundoB:integer;
distanciaPixelsB:real;
encontradoC1,encontradoC2:boolean;
xprimeroC,yprimeroC,xsegundoC,ysegundoC:integer;
distanciaPixelsC:real;
encontradoD1,encontradoD2:boolean;
xprimeroD,yprimeroD,xsegundoD,ysegundoD:integer;
distanciaPixelsD:real;
begin
AnchoI:=imagen1.Picture.Bitmap.Width-1;
AltoI:=imagen1.Picture.Bitmap.height-1;

xi:=puntoCentral.x;
yi:=PuntoCentral.y;
encontradoA1:=false;
encontradoA2:=false;
while ((encontradoA1=false)and(xi>0)and(xi<Anchoi)
and(yi>0)and(yi<AltoI))do
begin
if bitmapaux.Canvas.Pixels[xi,yi]<>colorElegido then
begin
encontradoA1:=true;
xprimeroA:=xi;
yprimeroA:=yi;
end;
xi:=xi+1
end;
xi:=puntoCentral.x;
yi:=PuntoCentral.y;
if encontradoA1=true then
begin
while ((encontradoA2=false)and(xi>0)and(xi<Anchoi)
and(yi>0)and(yi<AltoI))do
begin
if bitmapaux.Canvas.Pixels[xi,yi]<>colorElegido then
begin
encontradoA2:=true;
xsegundoA:=xi;
ysegundoA:=yi;
distanciaPixelsA:=distancia(xprimeroA,yprimeroA,xsegundoA,ysegundoA,matrizBy);
end;
xi:=xi-1
end;
end;
if(Maltura.AlturaDeColor(bitmapaux.canvas.Pixels[xprimeroA,yprimeroA])-
Maltura.AlturaDeColor(bitmapaux.canvas.Pixels[xsegundoA,ysegundoA]))=0
then
if
(Maltura.AlturaDeColor(bitmapaux.canvas.Pixels[PuntoCentral.x,PuntoCentral.y]))>
(Maltura.AlturaDeColor(bitmapaux.canvas.Pixels[xsegundoA,ysegundoA]))
then encontradoA2:=false;
if encontradoA2=true then
begin
distanciaPixels:=distanciaPixelsA;
xprimero:=xprimeroA;
xsegundo:=xsegundoA;
yprimero:=yprimeroA;
ysegundo:=ysegundoA;
end;

/// ***************y*************
xi:=puntoCentral.x;
yi:=PuntoCentral.y;

encontradoB1:=false;
encontradoB2:=false;
while ((encontradoB1=false)and(xi>0)and(xi<Anchoi)
and(yi>0)and(yi<AltoI))do
begin

79
Manual de usuario:
if bitmapaux.Canvas.Pixels[xi,yi]<>colorElegido then
begin
encontradoB1:=true;
xprimeroB:=xi;
yprimeroB:=yi;
end;
yi:=yi+1
end;

xi:=puntoCentral.x;
yi:=PuntoCentral.y;
if encontradoB1=true then
begin
while ((encontradoB2=false)and(xi>0)and(xi<Anchoi)
and(yi>0)and(yi<AltoI))do
begin
if bitmapaux.Canvas.Pixels[xi,yi]<>colorElegido then
begin
encontradoB2:=true;
xsegundoB:=xi;
ysegundoB:=yi;
distanciaPixelsB:=distancia(xprimeroB,yprimeroB,xsegundoB,ysegundoB,matrizBy);
end;
yi:=yi-1;
end;
end;
if(Maltura.AlturaDeColor(bitmapaux.canvas.Pixels[xprimeroB,yprimeroB])-
Maltura.AlturaDeColor(bitmapaux.canvas.Pixels[xsegundoB,ysegundoB]))=0
then
if
(Maltura.AlturaDeColor(bitmapaux.canvas.Pixels[PuntoCentral.x,PuntoCentral.y]))>
(Maltura.AlturaDeColor(bitmapaux.canvas.Pixels[xsegundoB,ysegundoB]))
then encontradoB2:=false;
if (encontradoB2=true) then
begin
if((encontradoA2=false)or(distanciaPixelsB<distanciaPixels))then
begin
distanciaPixels:=distanciaPixelsB;
xprimero:=xprimeroB;
xsegundo:=xsegundoB;
yprimero:=yprimeroB;
ysegundo:=ysegundoB;
end;
end;

/// ***************xy*************
xi:=puntoCentral.x;
yi:=PuntoCentral.y;
encontradoC1:=false;
encontradoC2:=false;
while ((encontradoC1=false)and(xi>0)and(xi<Anchoi)
and(yi>0)and(yi<AltoI))do
begin
if bitmapaux.Canvas.Pixels[xi,yi]<>colorElegido then
begin
encontradoC1:=true;
xprimeroC:=xi;
yprimeroC:=yi;
end;
yi:=yi+1;
xi:=xi+1;
end;
xi:=puntoCentral.x;
yi:=PuntoCentral.y;
if encontradoC1=true then
begin
while ((encontradoC2=false)and(xi>0)and(xi<Anchoi)
and(yi>0)and(yi<AltoI))do
begin
if bitmapaux.Canvas.Pixels[xi,yi]<>colorElegido then

80
Manual de usuario:
begin
encontradoC2:=true;
xsegundoC:=xi;
ysegundoC:=yi;
distanciaPixelsC:=distancia(xprimeroC,yprimeroC,xsegundoC,ysegundoC,matrizBy);
end;
yi:=yi-1;
xi:=xi-1;
end;
end;
if(Maltura.AlturaDeColor(bitmapaux.canvas.Pixels[xprimeroC,yprimeroC])-
Maltura.AlturaDeColor(bitmapaux.canvas.Pixels[xsegundoC,ysegundoC]))=0
then
if
(Maltura.AlturaDeColor(bitmapaux.canvas.Pixels[PuntoCentral.x,PuntoCentral.y]))>
(Maltura.AlturaDeColor(bitmapaux.canvas.Pixels[xsegundoC,ysegundoC]))
then encontradoC2:=false;
if (encontradoC2=true) then
begin
if(((encontradoA2=false)and(encontradoB2=false))or(distanciaPixelsC<distanciaPixels))then
begin
distanciaPixels:=distanciaPixelsC;
xprimero:=xprimeroC;
xsegundo:=xsegundoC;
yprimero:=yprimeroC;
ysegundo:=ysegundoC;
end;
end;
/// ***************xy-1*************
xi:=puntoCentral.x;
yi:=PuntoCentral.y;
encontradoD1:=false;
encontradoD2:=false;
while ((encontradoD1=false)and(xi>0)and(xi<Anchoi)
and(yi>0)and(yi<AltoI))do
begin
if bitmapaux.Canvas.Pixels[xi,yi]<>colorElegido then
begin
encontradoD1:=true;
xprimeroD:=xi;
yprimeroD:=yi;
end;
yi:=yi-1;
xi:=xi+1;
end;
xi:=puntoCentral.x;
yi:=PuntoCentral.y;
if encontradoD1=true then
begin
while ((encontradoD2=false)and(xi>0)and(xi<Anchoi)
and(yi>0)and(yi<AltoI))do
begin
if bitmapaux.Canvas.Pixels[xi,yi]<>colorElegido then
begin
encontradoD2:=true;
xsegundoD:=xi;
ysegundoD:=yi;
distanciaPixelsD:=distancia(xprimeroD,yprimeroD,xsegundoD,ysegundoD,matrizBy);
end;
yi:=yi+1;
xi:=xi-1;
end;
end;
if(Maltura.AlturaDeColor(bitmapaux.canvas.Pixels[xprimeroD,yprimeroD])-
Maltura.AlturaDeColor(bitmapaux.canvas.Pixels[xsegundoD,ysegundoD]))=0
then
if
(Maltura.AlturaDeColor(bitmapaux.canvas.Pixels[PuntoCentral.x,PuntoCentral.y]))>
(Maltura.AlturaDeColor(bitmapaux.canvas.Pixels[xsegundoD,ysegundoD]))
then encontradoD2:=false;

81
Manual de usuario:

if (encontradoD2=true) then
begin
if(((encontradoA2=false)and(encontradoB2=false)and(encontradoC2=false))
or(distanciaPixelsD<distanciaPixels))then
begin
distanciaPixels:=distanciaPixelsD;
xprimero:=xprimeroD;
xsegundo:=xsegundoD;
yprimero:=yprimeroD;
ysegundo:=ysegundoD;
end;
end;
///**************OPERACION:***********
if ((encontradoA2=true)or(encontradoB2=true)or(encontradoC2=true)or(encontradoD2=true))then
begin
if ((Maltura.AlturaDeColor(bitmapaux.canvas.Pixels[xprimero,yprimero]))>
(Maltura.AlturaDeColor(bitmapaux.canvas.Pixels[PuntoCentral.x,PuntoCentral.y])))and
((Maltura.AlturaDeColor(bitmapaux.canvas.Pixels[xsegundo,ysegundo]))<
(Maltura.AlturaDeColor(bitmapaux.canvas.Pixels[PuntoCentral.x,PuntoCentral.y])))
then
begin
distanciaMetros:=abs(Maltura.AlturaDeColor(bitmapaux.canvas.Pixels
[xprimero,yprimero])-
Maltura.AlturaDeColor(bitmapaux.canvas.Pixels
[PuntoCentral.x,PuntoCentral.y]));
distanciaPixels:=distancia(xprimero,yprimero,xsegundo,ysegundo,matrizBy);
factorMetrosPixel:=distanciaMetros/distanciaPixels;
distanciaPixelICentro:=distancia(xsegundo,ysegundo,PuntoCentral.x,PuntoCentral.y,matrizBy);
Faltura1:=(Maltura.AlturaDeColor(bitmapaux.canvas.Pixels[PuntoCentral.x,PuntoCentral.y]))+
distanciaPixelICentro*factorMetrosPixel;
end
else
if ((Maltura.AlturaDeColor(bitmapaux.canvas.Pixels[xsegundo,ysegundo]))>
(Maltura.AlturaDeColor(bitmapaux.canvas.Pixels[PuntoCentral.x,PuntoCentral.y])))and
((Maltura.AlturaDeColor(bitmapaux.canvas.Pixels[xprimero,yprimero]))<
(Maltura.AlturaDeColor(bitmapaux.canvas.Pixels[PuntoCentral.x,PuntoCentral.y])))then

begin
distanciaMetros:=abs(Maltura.AlturaDeColor(bitmapaux.canvas.Pixels[xsegundo,ysegundo])-
Maltura.AlturaDeColor(bitmapaux.canvas.Pixels[PuntoCentral.x,PuntoCentral.y]));
distanciaPixels:=distancia(xprimero,yprimero,xsegundo,ysegundo,matrizBy);
factorMetrosPixel:=distanciaMetros/distanciaPixels;
distanciaPixelDCentro:=distancia(xprimero,yprimero,PuntoCentral.x,PuntoCentral.y,matrizBy);
Faltura1:=Maltura.AlturaDeColor(bitmapaux.canvas.Pixels[PuntoCentral.x,PuntoCentral.y])+
distanciaPixelDCentro*factorMetrosPixel;
end
else
if ((Maltura.AlturaDeColor(bitmapaux.canvas.Pixels[xprimero,yprimero]))>
(Maltura.AlturaDeColor(bitmapaux.canvas.Pixels[PuntoCentral.x,PuntoCentral.y])))and
((Maltura.AlturaDeColor(bitmapaux.canvas.Pixels[xsegundo,ysegundo]))>
(Maltura.AlturaDeColor(bitmapaux.canvas.Pixels[PuntoCentral.x,PuntoCentral.y])))then
begin
distanciaPixelDCentro:=distancia(xprimero,yprimero,PuntoCentral.x,PuntoCentral.y,matrizBy);
distanciaPixelICentro:=distancia(xsegundo,ysegundo,PuntoCentral.x,PuntoCentral.y,matrizBy);
if distanciaPixelDcentro<DistanciaPixelIcentro then
begin
distanciaMetros:=abs(Maltura.AlturaDeColor(bitmapaux.canvas.Pixels
[xprimero,yprimero])-
Maltura.AlturaDeColor(bitmapaux.canvas.Pixels
[PuntoCentral.x,PuntoCentral.y]));

distanciaPixels:=distancia(xprimero,yprimero,xsegundo,ysegundo,matrizBy);
factorMetrosPixel:=distanciaMetros/distanciaPixels;
distanciaPixelICentro:=distancia(xsegundo,ysegundo,PuntoCentral.x,PuntoCentral.y,matrizBy);
Faltura1:=(Maltura.AlturaDeColor(bitmapaux.canvas.Pixels[PuntoCentral.x,PuntoCentral.y]))+
distanciaPixelICentro*factorMetrosPixel;

end //del if distanciaD<DistanciaI

82
Manual de usuario:
else
begin
distanciaMetros:=abs(Maltura.AlturaDeColor(bitmapaux.canvas.Pixels
[xsegundo,ysegundo])-
Maltura.AlturaDeColor(bitmapaux.canvas.Pixels
[PuntoCentral.x,PuntoCentral.y]));

distanciaPixels:=distancia(xprimero,yprimero,xsegundo,ysegundo,matrizBy);

factorMetrosPixel:=distanciaMetros/distanciaPixels;
distanciaPixelDCentro:=distancia(xprimero,yprimero,PuntoCentral.x,PuntoCentral.y,matrizBy);
Faltura1:=(Maltura.AlturaDeColor(bitmapaux.canvas.Pixels[PuntoCentral.x,PuntoCentral.y]))+
distanciaPixelDCentro*factorMetrosPixel;
end; //del else if distanciaS<DistanciaI
end // del > and >
else Faltura1:=Maltura.AlturaDeColor(bitmapaux.canvas.Pixels[PuntoCentral.x,PuntoCentral.y])
end
else Faltura1:=Maltura.AlturaDeColor(bitmapaux.canvas.Pixels[PuntoCentral.x,PuntoCentral.y]);
Faltura:=Faltura1;
end;
procedure Tfilla.dibujarEtiqueta(var bitmap:tbitmap;var matrizby:matrizByte;x2,y2,x1,y1:integer;colorBitmap:Tcolor;colorByte:byte);
var
AlturaInicial:string;
ROJO,verde,azul,DistanciaCR,DistanciaCV,DistanciaCA,DistanciaPrincipio,x,y:integer;
corPintar:Tcolor;
aux:real;
largo:Longint;
auxfx:integer;
//COMEZO PRINCIPAL
begin
if (Owner as TVPrincipal).RadioAltura.ItemIndex=1 then
AlturaInicial:=(Owner as TVPrincipal).Altura1.text;

if (bitmap.canvas.Pixels[y1,x1]=RGB(255,255,255))then
BEGIN
if (Owner as TVPrincipal).RadioColor.ItemIndex=1 then
begin
corPintar:=(Owner as TVPrincipal).corEt1.brush.color;

DistanciaPrincipio:=StrToInt((Owner as TVPrincipal).EDisCor.text);
DistanciaCV:=0;
DistanciaCA:=0;
DistanciaCR:=0;
largo:=ColorToRGB(corPintar);
rojo:=(largo mod 256);
verde:=(largo div 256);
verde:=verde mod 256;
azul:=(largo div (256*256));
azul:=azul mod 256;
CorPintar :=RGB(rojo,verde,azul);
end
END;
//COMEZO
if (abs(y2-y1)>abs(x2-x1)) then
begin
if y2<y1 then
begin
for y:=y1 downto y2 do
begin
aux:=x1+(x2-x1)*(y-y1)/(y2-y1);
x:=round(aux);
if (aux-x)>0.5 then inc(x);
if (bitmap.canvas.Pixels[y,x]=RGB(255,255,255))then
if (Owner as TVPrincipal).RadioColor.ItemIndex=1 then
begin
colorea(y,x,corPintar,imagen1.picture.Width,imagen1.Picture.height);
DEAux(DistanciaPrincipio,DistanciaCr,DistanciaCV,DistanciaCA,rojo,azul,verde,largo,
CorPintar);

end else

83
Manual de usuario:
if(Owner as TVPrincipal).RadioColor.ItemIndex=0 then
begin
if DialogoColor.Execute then
begin
colorea(y,x,DialogoColor.Color,imagen1.picture.Width,imagen1.Picture.height);
DEAux(DistanciaPrincipio,DistanciaCr,DistanciaCV,DistanciaCA,rojo,azul,verde,largo,
CorPintar);

end;
end
else //botón selecionado o 2
colorea(y,x,RGB(random(255),random(255),random(255)),imagen1.picture.Width,imagen1.Picture.height)
end; //do for y

end else
for y:=y1 to y2 do
begin
aux:=x1+(x2-x1)*(y-y1)/(y2-y1);
x:=round(aux);
if (aux-x)>0.5 then inc(x);

if (bitmap.canvas.Pixels[y,x]=RGB(255,255,255))then
if (Owner as TVPrincipal).RadioColor.ItemIndex=1 then
begin
colorea(y,x,corPintar,imagen1.picture.Width,imagen1.Picture.height);
DEAux(DistanciaPrincipio,DistanciaCr,DistanciaCV,DistanciaCA,rojo,azul,verde,largo,
CorPintar);

end else
if(Owner as TVPrincipal).RadioColor.ItemIndex=0 then
begin
if DialogoColor.Execute then
begin
colorea(y,x,DialogoColor.Color,imagen1.picture.Width,imagen1.Picture.height);
DEAux(DistanciaPrincipio,DistanciaCr,DistanciaCV,DistanciaCA,rojo,azul,verde,largo,
CorPintar);
end;
end
else //botón selecionado o 2
colorea(y,x,RGB(random(255),random(255),random(255)),imagen1.picture.Width,imagen1.Picture.height)

end; //do for y


end // do if (abs(y2-y1)>abs(x2-x1))
else
begin
if x2<x1 then
begin
for x:=x1 downto x2 do
begin
aux:=y1+(y2-y1)*(x-x1)/(x2-x1);
y:=round(aux);
if (aux-y)>0.5 then inc(y);
if (bitmap.canvas.Pixels[y,x]=RGB(255,255,255))then
if (Owner as TVPrincipal).RadioColor.ItemIndex=1 then
begin
colorea(y,x,corPintar,imagen1.picture.Width,imagen1.Picture.height);
DEAux(DistanciaPrincipio,DistanciaCr,DistanciaCV,DistanciaCA,rojo,azul,verde,largo,
CorPintar);
end else
if(Owner as TVPrincipal).RadioColor.ItemIndex=0 then
begin
if DialogoColor.Execute then
begin
colorea(y,x,DialogoColor.Color,imagen1.picture.Width,imagen1.Picture.height);
DEAux(DistanciaPrincipio,DistanciaCr,DistanciaCV,DistanciaCA,rojo,azul,verde,largo,
CorPintar);
end;
end
else //botón selecionado o 2
colorea(y,x,RGB(random(255),random(255),random(255)),imagen1.picture.Width,imagen1.Picture.height)

84
Manual de usuario:
end; //do for x
end else
for x:=x1 to x2 do
begin
aux:=y1+(y2-y1)*(x-x1)/(x2-x1);
y:=round(aux);
if (aux-y)>0.5 then inc(y);
if (bitmap.canvas.Pixels[y,x]=RGB(255,255,255))then
if (Owner as TVPrincipal).RadioColor.ItemIndex=1 then
begin
colorea(y,x,corPintar,imagen1.picture.Width,imagen1.Picture.height);
DEAux(DistanciaPrincipio,DistanciaCr,DistanciaCV,DistanciaCA,rojo,azul,verde,largo,
CorPintar);
end else
if(Owner as TVPrincipal).RadioColor.ItemIndex=0 then
begin
if DialogoColor.Execute then
begin
colorea(y,x,DialogoColor.Color,imagen1.picture.Width,imagen1.Picture.height);
DEAux(DistanciaPrincipio,DistanciaCr,DistanciaCV,DistanciaCA,rojo,azul,verde,largo,
CorPintar);

end;
end
else //botón selecionado o 2
colorea(y,x,RGB(random(255),random(255),random(255)),imagen1.picture.Width,imagen1.Picture.height)
end;//do for x
// end; //do else begin
//FINAL:
end;
if (Owner as TVPrincipal).RadioAltura.ItemIndex=1 then
(Owner as TVPrincipal).Altura1.text:=AlturaInicial;

end;

procedure matrizCero(var matriz:matrizByte;ancho,alto:integer);


var auxFx,auxFy:integer;
begin
for auxFx:=0 to ancho do
for auxFy:=0 to alto do
begin
matriz[auxFx,auxFy]:=0;
end;
end;

procedure Tfilla.tresD;
var
fila,columna,auxFs,auxforx,auxfory:integer;
altura,ancho,alto:string;
letra,retorno,retorno2,espacio:char;
recta1,recta2:trect;
ventana3d:Tventana3d;
//contador,
ix1,iy1:integer;
divisor:real;
malla,base,base0:integer;
puntoCentral:TPoint;
Faltura:real;
begin
if Maltura.NElementos=0 then Base0:=10
else Base0:=0;
if ((Owner as TVPrincipal).EditBase.text)<>'' then
begin
base:=StrToInt((Owner as TVPrincipal).EditBase.text);
end
else base:=0;
if ((Owner as TVPrincipal).EditMalla.text)<>'' then
malla:=StrToInt((Owner as TVPrincipal).EditMalla.text)
else malla:=0;
Application.CreateForm(TVentana3d,ventana3d);

85
Manual de usuario:
ventana3d.Show;
while (imagen1.width>malla) do
procedimientoZoomMenos(contadorZoom,imagen1,imagen1.picture.width,imagen1.picture.height);;

ventana3d.figura.ColumnCount:=imagen1.Width-1;
ventana3d.figura.RowCount:=imagen1.Height-1;

auxforX:=0;
auxforY:=0;
fila:=0;columna:=0;

for auxforx:=0 to imagen1.Width-1 do


for auxfory:=0 to imagen1.Height-1 do
begin
if ContadorZoom>0 then
begin
iX1:=auxforX div ContadorZoom;
iY1:=auxforY div ContadorZoom;
end
else
begin
iX1:=auxforX*(abs(ContadorZoom));
iy1:=auxforY* (abs(ContadorZoom));
end;
ventana3d.figura.Column:=auxforX;
ventana3d.figura.Row:=auxforY;

if interpolacion then
begin
puntoCentral.x:=ix1;
puntoCentral.y:=iy1;
encontrarEtiqueta(puntoCentral,imagen1.Canvas.pixels[ix1,iY1],Faltura);
if (Faltura-base)<0
then Faltura:=0
else Faltura:=Faltura-base+base0;
ventana3d.figura.data:=floatToStr(Faltura);
end
else
begin
if (Maltura.AlturaDeColor(imagen1.Canvas.pixels[ix1,iY1])-base)<0
then altura:='0'
else altura:=IntToStr(Maltura.AlturaDeColor(imagen1.Canvas.pixels[ix1,iY1])-base+Base0);
ventana3d.figura.data:=altura;
end;
end; //do for
contadorZoom:=contadorZoom2;
dibujarImagen(contadorZoom,imagen1,imagen1.picture.Width,imagen1.picture.height);
ScrollBox1.HorzScrollBar.position:=ScrollBox2.HorzScrollBar.position;
ScrollBox1.VertScrollBar.Position:=ScrollBox2.VertScrollBar.Position;
recta1.Left:=0;
recta1.Top:=0;
recta1.Right:=imagen1.Picture.bitmap.Width;
recta1.Bottom:=Imagen1.Picture.bitmap.Height;
recta2.left:=0;
recta2.top:=0;
recta2.right:=ventana3d.imaxep.width;
recta2.bottom:=ventana3d.imaxep.height;
ventana3d.imaxep.Canvas.CopyRect(recta2,imagen1.Picture.bitmap.canvas,recta1);
end;
procedure Tfilla.mostrarFicha;
begin
ficha.Showmodal;
end;
procedure Tfilla.anhadirSerie(origen,destino:Tpoint;var matriz:matrizByte;var bitmap:tbitmap;var fraccion:real;var dis:integer);
var
x1,y1,x2,y2,x,y:integer;
distanciaPixels,distanciaMetros:real;
aux:real;
begin
if fraccion=0 then fraccion:=1;

86
Manual de usuario:
x1:=origen.y;
y1:=origen.x;
x2:=destino.y;
y2:=destino.x;

if (abs(y2-y1)>abs(x2-x1)) then
begin
if y2<y1 then
begin
for y:=y1 downto y2 do
begin
distanciaAcumulada:=distanciaAcumulada+1;
aux:=x1+(x2-x1)*(y-y1)/(y2-y1);
x:=round(aux);
if (aux-x)>0.5 then inc(x);
if ultimoColor<>(bitmap.canvas.pixels[y,x])then
begin
//distanciaPixels:=distancia(origen.x,origen.y,puntoM.x,puntoM.y,matrizBy);
//distanciaMetros:=distanciaPixels*fraccion;

if Maltura.AlturaDeColor(penultimo)=Maltura.AlturaDeColor(antepenultimo)//igual (caso raro)


then

ficha.Series1.AddXY(distanciaAcumulada*fraccion,Maltura.AlturaDeColor(bitmap.canvas.pixels[y,x]),'',RGB(250,0,0));

if Maltura.AlturaDeColor(penultimo)>Maltura.AlturaDeColor(antepenultimo)//ascendente
then
if Maltura.AlturaDeColor(ultimoColor)>Maltura.AlturaDeColor(bitmap.canvas.pixels[y,x])
then
ficha.Series1.AddXY(distanciaAcumulada*fraccion,Maltura.AlturaDeColor(ultimoColor),'',RGB(250,0,0))
else

ficha.Series1.AddXY(distanciaAcumulada*fraccion,Maltura.AlturaDeColor(bitmap.canvas.pixels[y,x]),'',RGB(250,0,0));

if Maltura.AlturaDeColor(penultimo)<Maltura.AlturaDeColor(antepenultimo)//descendente
then
if Maltura.AlturaDeColor(ultimoColor)>Maltura.AlturaDeColor(bitmap.canvas.pixels[y,x])
then

ficha.Series1.AddXY(distanciaAcumulada*fraccion,Maltura.AlturaDeColor(bitmap.canvas.pixels[y,x]),'',RGB(250,0,0))
else
ficha.Series1.AddXY(distanciaAcumulada*fraccion,Maltura.AlturaDeColor(ultimoColor),'',RGB(250,0,0));

ultimoColor:=(bitmap.canvas.Pixels[y,x]);
Antepenultimo:=Penultimo;
Penultimo:=ultimoColor;

end;
end;
end else
for y:=y1 to y2 do
begin
DistanciaAcumulada:=distanciaAcumulada+1;
aux:=x1+(x2-x1)*(y-y1)/(y2-y1);
x:=round(aux);
if (aux-x)>0.5 then inc(x);
if ultimoColor<>(bitmap.canvas.pixels[y,x])then
begin

if Maltura.AlturaDeColor(penultimo)=Maltura.AlturaDeColor(antepenultimo)//igual (caso raro)


then

ficha.Series1.AddXY(distanciaAcumulada*fraccion,Maltura.AlturaDeColor(bitmap.canvas.pixels[y,x]),'',RGB(250,0,0));

if Maltura.AlturaDeColor(penultimo)>Maltura.AlturaDeColor(antepenultimo)//ascendente
then
if Maltura.AlturaDeColor(ultimoColor)>Maltura.AlturaDeColor(bitmap.canvas.pixels[y,x])
then
ficha.Series1.AddXY(distanciaAcumulada*fraccion,Maltura.AlturaDeColor(ultimoColor),'',RGB(250,0,0))
else

87
Manual de usuario:

ficha.Series1.AddXY(distanciaAcumulada*fraccion,Maltura.AlturaDeColor(bitmap.canvas.pixels[y,x]),'',RGB(250,0,0));

if Maltura.AlturaDeColor(penultimo)<Maltura.AlturaDeColor(antepenultimo)//descendente
then
if Maltura.AlturaDeColor(ultimoColor)>Maltura.AlturaDeColor(bitmap.canvas.pixels[y,x])
then

ficha.Series1.AddXY(distanciaAcumulada*fraccion,Maltura.AlturaDeColor(bitmap.canvas.pixels[y,x]),'',RGB(250,0,0))
else
ficha.Series1.AddXY(distanciaAcumulada*fraccion,Maltura.AlturaDeColor(ultimoColor),'',RGB(250,0,0));

ultimoColor:=(bitmap.canvas.Pixels[y,x]);
Antepenultimo:=Penultimo;
Penultimo:=ultimoColor;

end;
end;
end
else
begin
if x2<x1 then
begin
for x:=x1 downto x2 do
begin
aux:=y1+(y2-y1)*(x-x1)/(x2-x1);
y:=round(aux);
if (aux-y)>0.5 then inc(y);

distanciaAcumulada:=distanciaAcumulada+1;
if ultimoColor<>(bitmap.canvas.pixels[y,x])then
begin
if Maltura.AlturaDeColor(penultimo)=Maltura.AlturaDeColor(antepenultimo)//igual (caso raro)
then

ficha.Series1.AddXY(distanciaAcumulada*fraccion,Maltura.AlturaDeColor(bitmap.canvas.pixels[y,x]),'',RGB(250,0,0));

if Maltura.AlturaDeColor(penultimo)>Maltura.AlturaDeColor(antepenultimo)//ascendente
then
if Maltura.AlturaDeColor(ultimoColor)>Maltura.AlturaDeColor(bitmap.canvas.pixels[y,x])
then
ficha.Series1.AddXY(distanciaAcumulada*fraccion,Maltura.AlturaDeColor(ultimoColor),'',RGB(250,0,0))
else

ficha.Series1.AddXY(distanciaAcumulada*fraccion,Maltura.AlturaDeColor(bitmap.canvas.pixels[y,x]),'',RGB(250,0,0));

if Maltura.AlturaDeColor(penultimo)<Maltura.AlturaDeColor(antepenultimo)//descendente
then
if Maltura.AlturaDeColor(ultimoColor)>Maltura.AlturaDeColor(bitmap.canvas.pixels[y,x])
then

ficha.Series1.AddXY(distanciaAcumulada*fraccion,Maltura.AlturaDeColor(bitmap.canvas.pixels[y,x]),'',RGB(250,0,0))
else
ficha.Series1.AddXY(distanciaAcumulada*fraccion,Maltura.AlturaDeColor(ultimoColor),'',RGB(250,0,0));

ultimoColor:=(bitmap.canvas.Pixels[y,x]);
Antepenultimo:=Penultimo;
Penultimo:=ultimoColor;

end;
end;
end else
for x:=x1 to x2 do
begin
aux:=y1+(y2-y1)*(x-x1)/(x2-x1);
y:=round(aux);
if (aux-y)>0.5 then inc(y);
distanciaAcumulada:=distanciaAcumulada+1;
if ultimoColor<>(bitmap.canvas.pixels[y,x])then
begin

88
Manual de usuario:
if Maltura.AlturaDeColor(penultimo)=Maltura.AlturaDeColor(antepenultimo)//igual (caso raro)
then

ficha.Series1.AddXY(distanciaAcumulada*fraccion,Maltura.AlturaDeColor(bitmap.canvas.pixels[y,x]),'',RGB(250,0,0));

if Maltura.AlturaDeColor(penultimo)>Maltura.AlturaDeColor(antepenultimo)//ascendente
then
if Maltura.AlturaDeColor(ultimoColor)>Maltura.AlturaDeColor(bitmap.canvas.pixels[y,x])
then
ficha.Series1.AddXY(distanciaAcumulada*fraccion,Maltura.AlturaDeColor(ultimoColor),'',RGB(250,0,0))
else

ficha.Series1.AddXY(distanciaAcumulada*fraccion,Maltura.AlturaDeColor(bitmap.canvas.pixels[y,x]),'',RGB(250,0,0));

if Maltura.AlturaDeColor(penultimo)<Maltura.AlturaDeColor(antepenultimo)//descendente
then
if Maltura.AlturaDeColor(ultimoColor)>Maltura.AlturaDeColor(bitmap.canvas.pixels[y,x])
then

ficha.Series1.AddXY(distanciaAcumulada*fraccion,Maltura.AlturaDeColor(bitmap.canvas.pixels[y,x]),'',RGB(250,0,0))
else
ficha.Series1.AddXY(distanciaAcumulada*fraccion,Maltura.AlturaDeColor(ultimoColor),'',RGB(250,0,0));

ultimoColor:=(bitmap.canvas.Pixels[y,x]);
Antepenultimo:=Penultimo;
Penultimo:=ultimoColor;

end;
end;
end;
end;

procedure Tfilla.colorea(x1,y1:integer;color:Tcolor;ancho,alto:integer);
var
AuxFx,auxFy,dx,dy:integer;
cambio:boolean;
altura:integer;
alturaString:string;
preparado:boolean;
begin

bitmapAUX.Canvas.Pen.Mode:=pmCopy;
alturaString:='0';
if (Owner as TVPrincipal).RadioAltura.ItemIndex=0 then
begin
Application.CreateForm(TFPregunta,FPregunta);
altura:=FPregunta.showModal;
if altura=-1 then altura:=0;
Fpregunta.Free;
end
else
begin
altura:=StrToInt((Owner as TVPrincipal).altura1.Text);
(Owner as TVPrincipal).altura1.Text:=IntToSTR(altura+STrToInt((Owner as TVPrincipal).EDistancia.text));
end;
preparado:=true;
if preparado then
begin
screen.cursor:=crHourGlass;
MAltura.Anhadir(color,altura);
bitmapAux.canvas.pixels[x1,y1]:=Color;
matrizByAux[x1,y1]:=25;

cambio:=true;
while cambio do
begin
cambio:=false;
for auxFx:=1 to ancho-2 do
for auxFy:=1 to alto-2 do
if matrizByAux[auxFx,auxFy]=25 then

89
Manual de usuario:
begin
if matrizByAux[auxFx-1,auxFy]=0 then
begin
dx:=auxFx-1;
dy:=auxFy;
matrizByAux[dx,dy]:=25;
bitmapAux.canvas.pixels[dx,dy]:=color;
cambio:=true;
dx:=dx-1;
dy:=dy;
while (matrizByAux[dx,dy]=0)and(dx>1)and(dx<ancho-2)and(dy>1)
and(dy<alto-2) do
begin
bitmapAux.canvas.pixels[dx,dy]:=color;
matrizByAux[dx,dy]:=25;
dx:=dx-1;
dy:=dy;

end; //do while


end;//do if

if matrizByAux[auxFx+1,auxFy]=0 then
begin
dx:=auxFx+1;
dy:=auxFy;
matrizByAux[dx,dy]:=25;
bitmapAux.canvas.pixels[dx,dy]:=color;
cambio:=true;
dx:=dx+1;
dy:=dy;
while (matrizByAux[dx,dy]=0)and(dx>1)and(dx<ancho-2)and(dy>1)and
(dy<alto-2) do
begin
matrizByAux[dx,dy]:=25;
bitmapAux.canvas.pixels[dx,dy]:=color;
dx:=dx+1;
dy:=dy;
end; //do while
end; //do if

if matrizByAux[auxFx,auxFy+1]=0 then
begin
dx:=auxFx;
dy:=auxFy+1;
matrizByAux[dx,dy]:=25;
bitmapAux.canvas.pixels[dx,dy]:=color;
cambio:=true;
dx:=dx;
dy:=dy+1;
while (matrizByAux[dx,dy]=0)and(dx>1)and(dx<ancho-2)and(dy>1)and(dy<ancho-2)do
begin
matrizByAux[dx,dy]:=25;
bitmapAux.canvas.pixels[dx,dy]:=color;
dx:=dx;
dy:=dy+1;
end; //do while
end; //do if

if matrizByAux[auxFx,auxFy-1]=0 then
begin

dx:=auxFx;
dy:=auxFy-1;
matrizByAux[dx,dy]:=25;
bitmapAux.canvas.pixels[dx,dy]:=color;
cambio:=true;
dx:=dx;
dy:=dy-1;
while (matrizByAux[dx,dy]=0)and(dx>1)and(dx<ancho-2)and(dy>1)and
(dy<alto-2)do

90
Manual de usuario:
begin
matrizByAux[dx,dy]:=25;
bitmapAux.canvas.pixels[dx,dy]:=color;
dx:=dx;
dy:=dy-1;
end; //del while
end //del if
end;//do if matriz[auxFx,auxFy]=25
end;//do while cambio
screen.cursor:=crDefault;

for dx:=1 to ancho-2 do


for dy:=1 to alto-2 do
if matrizByAux[dx,dy]=25 then
begin
if (matrizByAux[dx-1,dy]=150)or(matrizByAux[dx-1,dy]=1) then
begin
matrizByAux[dx-1,dy]:=10;
bitmapAux.canvas.pixels[dx-1,dy]:=color;
end;
if (matrizByAux[dx+1,dy]=150)or(matrizByAux[dx+1,dy]=1) then
begin
matrizByAux[dx+1,dy]:=10;
bitmapAux.canvas.pixels[dx+1,dy]:=color;
end;

if (matrizByAux[dx,dy+1]=150)or(matrizByAux[dx,dy+1]=1) then
begin
matrizByAux[dx,dy+1]:=10;
bitmapAux.canvas.pixels[dx,dy+1]:=color;
end;

if (matrizByAux[dx,dy-1]=150)or(matrizByAux[dx,dy-1]=1) then
begin
matrizByAux[dx,dy-1]:=10;
bitmapAux.canvas.pixels[dx,dy-1]:=color;
end;
end;
end;
end;//do procedure
function Tfilla.contarPixels(x1,y1:integer;color:Tcolor;ancho,alto:integer):integer;
var
AuxFx,auxFy,dx,dy:integer;
cambio:boolean;
altura:integer;
alturaString:string;
contaPixels:integer;
begin
contaPixels:=0;
bitmapAUX.Canvas.Pen.Mode:=pmCopy;
for AuxFx:=1 to ancho-1 do
for AuxFy:=1 to alto-1 do
matrizByAuxR[AuxFx,auxFy]:=matrizByAux[AuxFx,AuxFy];

screen.cursor:=crHourGlass;
matrizByAux[x1,y1]:=25;
cambio:=true;

while cambio do
begin
cambio:=false;
for auxFx:=1 to ancho-2 do
for auxFy:=1 to alto-2 do
if matrizByAux[auxFx,auxFy]=25 then
begin
if matrizByAux[auxFx-1,auxFy]=0 then
begin
dx:=auxFx-1;
dy:=auxFy;
matrizByAux[dx,dy]:=25;

91
Manual de usuario:
inc(ContaPixels);
cambio:=true;
dx:=dx-1;
dy:=dy;
while (matrizByAux[dx,dy]<>18)and(dx>1)and(dx<ancho-2)and(dy>1)and(dy<ancho-2) do
begin
inc(ContaPixels);
matrizByAux[dx,dy]:=25;
dx:=dx-1;
dy:=dy;
end; //do while
end;//do if
if matrizByAux[auxFx+1,auxFy]=0 then
begin
dx:=auxFx+1;
dy:=auxFy;
matrizByAux[dx,dy]:=25;
inc(ContaPixels);
cambio:=true;
dx:=dx+1;
dy:=dy;
while (matrizByAux[dx,dy]<>18)and(dx>1)and(dx<ancho-2)and(dy>1)and(dy<ancho-2) do
begin
matrizByAux[dx,dy]:=25;
inc(ContaPixels);
dx:=dx+1;
dy:=dy;
end; //do while
end; //do if
if matrizByAux[auxFx,auxFy+1]=0 then
begin
dx:=auxFx;
dy:=auxFy+1;
matrizByAux[dx,dy]:=25;
inc(ContaPixels);
cambio:=true;
dx:=dx;
dy:=dy+1;
while (matrizByAux[dx,dy]<>18)and(dx>1)and(dx<ancho-2)and(dy>1)and(dy<ancho-2)do
begin
matrizByAux[dx,dy]:=25;
inc(ContaPixels);
dx:=dx;
dy:=dy+1;
end; //do while
end; //do if
if matrizByAux[auxFx,auxFy-1]=0 then
begin

dx:=auxFx;
dy:=auxFy-1;
matrizByAux[dx,dy]:=25;
inc(ContaPixels);
cambio:=true;
dx:=dx;
dy:=dy-1;
while (matrizByAux[dx,dy]<>18)and(dx>1)and(dx<ancho-2)and(dy>1)and(dy<ancho-2)do
begin
matrizByAux[dx,dy]:=25;
inc(ContaPixels);
dx:=dx;
dy:=dy-1;
end; //del while
end //del if
end;//do if matriz[auxFx,auxFy]=25
end;//do while cambio
screen.cursor:=crDefault;
for dx:=1 to ancho-2 do
for dy:=1 to alto-2 do
if matrizByAux[dx,dy]=25 then

92
Manual de usuario:
begin
if (matrizByAux[dx-1,dy]=150)or(matrizByAux[dx-1,dy]=1) then
begin
matrizByAux[dx-1,dy]:=10;
inc(ContaPixels);
end;
if (matrizByAux[dx+1,dy]=150)or(matrizByAux[dx+1,dy]=1) then
begin
matrizByAux[dx+1,dy]:=10;
inc(ContaPixels);
end;
if (matrizByAux[dx,dy+1]=150)or(matrizByAux[dx,dy+1]=1) then
begin
matrizByAux[dx,dy+1]:=10;
inc(ContaPixels);
end;

if (matrizByAux[dx,dy-1]=150)or(matrizByAux[dx,dy-1]=1) then
begin
matrizByAux[dx,dy-1]:=10;
inc(ContaPixels);
end;
end;
contarPixels:=contaPixels;
for AuxFx:=1 to ancho-1 do
for AuxFy:=1 to alto-1 do
matrizByAux[AuxFx,auxFy]:=matrizByAuxR[AuxFx,AuxFy];
end;//do procedure

procedure Tfilla.extremos(var matrizBy:matrizByte;var bitmap:tbitmap;ancho,alto:integer);


var
AuxFx,auxFy:integer;
begin
bitmap.canvas.Pen.Mode :=pmNotXor ;
bitmap.canvas.pen.color:=clgreen;
for AuxFx:=1 to ancho-1 do
for AuxFy:=1 to alto-1 do
if esExtremo(AuxFx,AuxFy,matrizBy) then
bitmap.Canvas.Ellipse(auxFx-2,auxFy-2,auxFX+2,auxFY+2);
bitmap.canvas.Pen.Mode :=pmCopy ;
imagen1.Canvas.Draw(0,0,bitmapaux);
DibujarImagen(contadorZoom,imagen1,imagen1.Picture.Width,imagen1.Picture.Height);
end;

procedure Tfilla.copiaMatriz(var matrizBy,matrizByAux:MatrizByte; ancho,alto:integer);


var
AuxFx,auxFy:integer;
begin
for AuxFx:=0 to ancho do
for AuxFy:=0 to alto do
matrizByAux[AuxFx,AuxFy]:=matrizBy[AuxFx,AuxFy]
end;
procedure Tfilla.dibujaCirculo(punto:Tpoint);
var rectangulo:trect;
begin
rectangulo.Left:=0;
rectangulo.Top:=0;
rectangulo.Right:=bitmapAux.Width;
rectangulo.Bottom:=bitmapAux.Height ;
imagen1.AutoSize:=false; //un ano

with bitmapAux.Canvas do
begin
pen.Color:=RGB(255,3,3);
Pen.Mode :=pmNotXor ;
Ellipse(punto.x-2,punto.y-2,punto.x+3,punto.y+3);
end;
imagen1.canvas.StretchDraw(rectangulo,bitmapAux);
end;

93
Manual de usuario:
procedure Tfilla.dibuja(TopLeft,BottomRight:Tpoint;Amode:TPenMode;ancho:integer);
var rectangulo:trect;
begin
rectangulo.Left:=0;
rectangulo.Top:=0;
rectangulo.Right:=bitmapAux.Width;
rectangulo.Bottom:=bitmapAux.Height ;
imagen1.AutoSize:=false; //un ano
with imagen1.Canvas do
begin
pen.Color:=clGreen;
Pen.Mode := AMode;
pen.Width:=ancho;
MoveTo(TopLeft.X, TopLeft.Y);
LineTo(BottomRight.X, BottomRight.Y);
end;
imagen1.Canvas.pen.mode:=pmCopy;
end;

procedure Tfilla.dibuja2(TopLeft,BottomRight:Tpoint;Amode:TPenMode;ancho:integer);
var rectangulo:trect;
begin
rectangulo.Left:=0;
rectangulo.Top:=0;
rectangulo.Right:=bitmapAux.Width;
rectangulo.Bottom:=bitmapAux.Height ;
imagen2.AutoSize:=false; //un ano
with imagen2.Canvas do
begin
pen.Color:=clGreen;
Pen.Mode := AMode;
pen.Width:=ancho;
MoveTo(TopLeft.X, TopLeft.Y);
LineTo(BottomRight.X, BottomRight.Y);
end;
imagen2.Canvas.pen.mode:=pmCopy;
end;

procedure Tfilla.Imagen1MouseMove(Sender: TObject; Shift: TShiftState; X,


Y: Integer);
var
imax:timage;
x1,y1:integer;
rectangulo:tRECT;
dx,dy:integer;
largo:longint;
rojo,verde,azul:integer;
Faltura:real;

begin
if ContadorZoom>0 then
begin
(Owner as TVPrincipal).EditX.text:=IntToStr(X div ContadorZoom);
(Owner as TVPrincipal).EditY.text:=IntToStr(Y div ContadorZoom);
end
else
begin
(Owner as TVPrincipal).EditX.text:=IntToStr(X* (abs(ContadorZoom)));
(Owner as TVPrincipal).EditY.text:=IntToStr(Y* (abs(ContadorZoom)));
end;

x1:=StrToInt((Owner as TVPrincipal).EditX.text);
y1:=StrToInt((Owner as TVPrincipal).EditY.text);
(Owner as TVPrincipal).CuadradoColor.Brush.Color:=Imagen1.Canvas.Pixels[x1,y1];
if MAltura.NElementos=0 then (Owner as TVPrincipal).EditA.text:=''
else
begin
if interpolacion then
begin
EncontrarEtiqueta(point(x1,y1),(Owner as TVPrincipal).CuadradoColor.Brush.Color,Faltura);

94
Manual de usuario:
(Owner as TVPrincipal).EditA.text:=FloatToStr(FAltura)
end
else
(Owner as
TVPrincipal).EditA.text:=(IntToStr(Maltura.AlturaDeColor(bitmapaux.canvas.Pixels[x1,y1])));
end;
if ((BoolDibuja)and(((Owner as TVPrincipal).BLinea.down=true) or((Owner as TVPrincipal).Bet.down=true))) then
begin
Dibuja(Origen,puntoM,pmNotXor,1);
PuntoM:=Point(x1,y1);;
dibuja(origen,puntoM,pmNotXor,1);
end;
if ((Owner as TVPrincipal).BRuta.down=true)and(primero=false) then
begin
Dibuja(Origen,puntoM,pmNotXor,2);
PuntoM:=Point(x1,y1);;
dibuja(origen,puntoM,pmNotXor,2);
end;

if ((Owner as TVPrincipal).BRegion.down=true)and(primero=false) then


begin
Dibuja(Origen,puntoM,pmNotXor,1);
PuntoM:=Point(x1,y1);;
dibuja(origen,puntoM,pmNotXor,1);
end;
if ((Owner as TVPrincipal).BBorrar.down=true)and(Shift=[ssLeft]) then
begin
for dx:=-radioBorrar to radioBorrar do
for dy:=-radioBorrar to radioBorrar do
begin
if (x1+dx>=0)and(x1+dx<=imagen1.picture.Width-1)and(y1+dy>=0)and(y1+dy<=imagen1.picture.Height-1)then
begin
imagen1.AutoSize:=false; //un ano
imagen1.canvas.pixels[x1+dx,y1+dy]:=RGB(255,255,255);
matrizByAux[x1+dx,y1+dy]:=0;
matrizBy[x1+dx,y1+dy]:=0;
bitmapAux.canvas.pixels[x1+dx,y1+dy]:=RGB(255,255,255);
end;
end;
end;
end;

procedure Tfilla.Imagen1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);


var
auxFor,AnchoI,AltoI,dx,dy:integer;
ColorElegido:Tcolor;
colorBy:byte;
rectangulo:trect;
distanciaMetros,DistanciaPixels:real;
encontrado1,encontrado2:boolean;
xprimero,yprimero,xsegundo,ysegundo:integer;
pIni1,pFin1,pIni2,pFin2,pIni3,pFin3,pIni4,pFin4:TPoint;
begin
x1:=StrToInt((Owner as TVPrincipal).EditX.text);
y1:=StrToInt((Owner as TVPrincipal).EditY.text);
colorElegido:=(Owner as TVPrincipal).cuadradoColor.Brush.color;

if ((Owner as TVPrincipal).BNoCo.down=true)and(Shift=[ssLeft]) then


begin
if (Owner as TVPrincipal).DiaCor.execute then
begin
coloreaN(x1,y1,(Owner as TVPrincipal).DiaCor.color,imagen1.picture.Width,imagen1.Picture.height);
imagen1.Canvas.Draw(0,0,bitmapaux);
DibujarImagen(contadorZoom,imagen1,imagen1.Picture.Width,imagen1.Picture.Height);
end;
end;
if ((Owner as TVPrincipal).BCota1.down=true)and(Shift=[ssLeft]) then
begin
colorea1Region(x1,y1,imagen1.picture.bitmap.Canvas.Pixels[x1,y1]);

95
Manual de usuario:
end;
if (Shift=[ssLeft]) then
begin
if (Owner as TVPrincipal).shape1.Pen.color=clRed then
begin
(Owner as TVPrincipal).shape1.brush.color:=colorElegido;
end else
if (Owner as TVPrincipal).shape2.Pen.color=clRed then
begin
(Owner as TVPrincipal).shape2.brush.color:=colorElegido;
end else
if (Owner as TVPrincipal).shape3.Pen.color=clRed then
begin
(Owner as TVPrincipal).shape3.brush.color:=colorElegido;
end else
if (Owner as TVPrincipal).shape4.Pen.color=clRed then
begin
(Owner as TVPrincipal).shape4.brush.color:=colorElegido;
end else
if (Owner as TVPrincipal).shape5.Pen.color=clRed then
begin
(Owner as TVPrincipal).shape5.brush.color:=colorElegido;
end;
end;

if((Owner as TVPrincipal).bEt.Down=true)and(primero=true)and(Shift=[ssLeft])then
begin
BoolDibuja:=true;
imagen1.canvas.moveTo(x1,y1);
Origen:=Point (x1,y1);
puntoM:=Origen;
primero:=false;
end
else

if((Owner as TVPrincipal).bet.Down=true)and(primero=false)and(Shift=[ssLeft]) then


begin
dibuja(origen,Point(x1,y1),pmNotXor,1); //borramos a linea
dibujarEtiqueta(bitmapAux,matrizbyAux,y1,x1,origen.y,origen.x,RGB(250,0,0),1);
imagen1.Canvas.Draw(0,0,bitmapaux);
DibujarImagen(contadorZoom,imagen1,imagen1.Picture.Width,imagen1.Picture.Height);
BoolDibuja:=false;
(Owner as TVPrincipal).Bet.down:=true;
primero:=true;
end;

if((Owner as TVPrincipal).bLinea.Down=true)and(primero=true)and(Shift=[ssLeft])then
begin
BoolDibuja:=true;
imagen1.canvas.moveTo(x1,y1);
Origen:=Point (x1,y1);
puntoM:=Origen;
primero:=false;
end
else

if((Owner as TVPrincipal).bLinea.Down=true)and(primero=false)and(Shift=[ssLeft]) then


begin
dibuja(origen,Point(x1,y1),pmNotXor,1); //borramos a linea
DibujarLinea(bitmapAux,matrizByAux,y1,x1,origen.y,origen.x,RGB(250,0,0),1);
imagen1.Canvas.Draw(0,0,bitmapaux);
DibujarImagen(contadorZoom,imagen1,imagen1.Picture.Width,imagen1.Picture.Height);
BoolDibuja:=false;
(Owner as TVPrincipal).BLinea.down:=true;
primero:=true;
end;
if ((Owner as TVPrincipal).BBorrar.down=true)and(Shift=[ssLeft]) then
begin
for dx:=-radioBorrar to radioBorrar do
for dy:=-radioBorrar to radioBorrar do

96
Manual de usuario:
begin
if (x1+dx>=0)and(x1+dx<=imagen1.picture.Width-1)and(y1+dy>=0)and(y1+dy<=imagen1.picture.Height-1)then
begin
imagen1.AutoSize:=false; //un ano
imagen1.Canvas.pixels[x1+dx,y1+dy]:=RGB(255,255,255);
matrizByAux[x1+dx,y1+dy]:=0;
matrizBy[x1+dx,y1+dy]:=0;
bitmapAux.canvas.pixels[x1+dx,y1+dy]:=RGB(255,255,255);
end;
end;
end;

if ((Owner as TVPrincipal).Bpixels.down=true)and(Shift=[ssLeft])and(primero=true) then


begin
VColor:=TVColor.Create(0);
Vcolor.anhadir(Imagen2.Canvas.Pixels[x1,y1]);
Vcolor.muestra((owner as TVprincipal).panel5);
primero:=false;
end
else
if ((Owner as TVPrincipal).Bpixels.down=true)and(Shift=[ssLeft])
and(primero=false) then
begin
Vcolor.anhadir(Imagen2.Canvas.Pixels[x1,y1]);
Vcolor.muestra((owner as TVprincipal).Panel5);;
end;
if ((Owner as TVPrincipal).BMedir.down=true)and(Shift=[ssLeft])
and(primero=true) then
begin
Origen:=Point(x1,y1);
puntoM:=Origen;
primero:=false;
end else
if ((Owner as TVPrincipal).BMedir.down=true)and(Shift=[ssLeft])
and(primero=false) then
begin
puntoM:=point(x1,y1);
distanciaPixels:=distancia(origen.x,origen.y,puntoM.x,puntoM.y,matrizBy);
distanciaMetros:=distanciaPixels*fraccion;
(Owner as TVPrincipal).LDistancia.caption:=(IntToStr(Round(distanciaMetros))+' m.');
primero:=true;
end;
end;

procedure Tfilla.ZoomMasClick(Sender: TObject);


begin
ProcedimientoZoomMais(contadorZoom,imagen1,imagen1.picture.Width,imagen1.Picture.Height);
end;

procedure Tfilla.ZoomMenosClick(Sender: TObject);


begin
ProcedimientoZoomMenos(contadorZoom,imagen1,imagen1.picture.Width,imagen1.Picture.Height);
end;

procedure Tfilla.FormClose(Sender: TObject; var Action: TCloseAction);


var
fichero:file of byte;
auxFor,auxFor2:integer;
begin
if nomeFichero<>''then
begin
assignFile(fichero,nomeFichero);
reset(fichero);
seek(fichero,54);
for auxFor:=0 to 255 do
for auxFor2:=1 to 4 do
write(fichero,paleta[auxFor,auxFor2]);
closeFile(fichero);
end;
Action := caFree;

97
Manual de usuario:
if (Owner as TVPrincipal).MDIChildCount=1 then
begin
(Owner as TVPrincipal).impresion1.Enabled:=false;
(Owner as TVPrincipal).gardarImaxen1.Enabled:=false;
(Owner as TVPrincipal).distancia1.Enabled:=false;
(Owner as TVPrincipal).colores1.Enabled:=false;
(Owner as TVPrincipal).Panel1.Visible:=false;
(Owner as TVPrincipal).Panel2.Visible:=false;
(Owner as TVPrincipal).GDistancia.visible:=false;
(Owner as TVPrincipal).panel4.visible:=false;
(Owner as TVPrincipal).panel5.visible:=false;
(Owner as TVPrincipal).Blinea.down:=false;
if (DeleteFile(nomeFichero+'temporal.bmp'))then
begin
end
else
end;
end;

procedure Tfilla.FormActivate(Sender: TObject);


begin
if nomeFichero<>'' then
(Owner As TVPrincipal).Ventanita.Picture.LoadFromFile(nomeFichero);
// si a imaxen está en estado 0 (cargada dun ficheiro e sin ningun tratamento)
// ou a imaen está en estado 1 (extraido o cor, en ningun tratamento mais), entonces
// os botóns do grupo 2 ainda non estan activos:

if (EstadoImagen=-1) then
begin
(Owner As TVPrincipal).PanelCores.visible:=false;
(Owner As TVPrincipal).PanelUnir.visible:=false;
(Owner As TVPrincipal).GrupoLineas.visible:=false;
(Owner As TVPrincipal).PanelET.visible:=false;
(Owner As TVPrincipal).grupo1.visible:=true;
(Owner As TVPrincipal).unir.visible:=true
end;

if (EstadoImagen=0) then
begin
(Owner As TVPrincipal).PanelCores.visible:=true;
(Owner As TVPrincipal).PanelUnir.visible:=false;
(Owner As TVPrincipal).GrupoLineas.visible:=false;
(Owner As TVPrincipal).PanelET.visible:=false;
(Owner As TVPrincipal).grupo1.visible:=false;
(Owner As TVPrincipal).unir.visible:=true
end;

if (EstadoImagen=1) then
begin
(Owner As TVPrincipal).PanelCores.visible:=false;
(Owner As TVPrincipal).PanelUnir.visible:=true;
(Owner As TVPrincipal).GrupoLineas.visible:=false;
(Owner As TVPrincipal).PanelET.visible:=false;
(Owner As TVPrincipal).grupo1.visible:=false;
(Owner As TVPrincipal).unir.visible:=true

end;

if (EstadoImagen=2) then
begin
(Owner As TVPrincipal).PanelCores.visible:=false;
(Owner As TVPrincipal).PanelUnir.visible:=true;
(Owner As TVPrincipal).GrupoLineas.visible:=false;
(Owner As TVPrincipal).PanelET.visible:=false;
(Owner As TVPrincipal).grupo1.visible:=false;
(Owner As TVPrincipal).unir.visible:=false;
end;
if (EstadoImagen=3) then
begin

98
Manual de usuario:
(Owner As TVPrincipal).PanelCores.visible:=false;
(Owner As TVPrincipal).PanelUnir.visible:=false;
(Owner As TVPrincipal).GrupoLineas.visible:=true;
(Owner As TVPrincipal).PanelET.visible:=false;
(Owner As TVPrincipal).grupo1.visible:=false;
(Owner As TVPrincipal).unir.visible:=false;
end;

if (EstadoImagen=4) then
begin
(Owner As TVPrincipal).PanelCores.visible:=false;
(Owner As TVPrincipal).PanelUnir.visible:=false;
(Owner As TVPrincipal).GrupoLineas.visible:=false;
(Owner As TVPrincipal).PanelET.visible:=true;
(Owner As TVPrincipal).grupo1.visible:=false;
(Owner As TVPrincipal).unir.visible:=false;
end;
end;

procedure Tfilla.cargarClick(nome:string);
var
fichero:file of byte;
auxFor,auxFor2:integer;
rectangulo:Trect;
numeroColores:byte;
begin
nomeFichero:=nome;
(Owner As TVPrincipal).Ventanita.Picture.LoadFromFile(nomeFichero); ;
(Owner As TVPrincipal).Grupo1.visible:=true;
(Owner As TVPrincipal).GrupoLineas.visible:=false;
(Owner As TVPrincipal).PanelCores.visible:=false;
EstadoImagen:=-1;
contadorZoom:=1;
contadorZoom2:=1;
caption:=nomeFichero;
Imagen1.Picture.LoadFromFile(nomeFichero);
Imagen1.Width:=Imagen1.Picture.Width;
Imagen1.Height:=Imagen1.Picture.Height;
Imagen2.Picture.LoadFromFile(nomeFichero);
Imagen2.Width:=Imagen2.Picture.Width;
Imagen2.Height:=Imagen2.Picture.Height;
assignFile(fichero,nomeFichero);
reset(fichero);
seek(fichero,54);
for auxFor:=0 to 255 do
for auxFor2:=1 to 4 do
read(fichero,paleta[auxFor,auxFor2]);
closeFile(fichero);
bitmap:=TBitmap.Create;
bitmap.Width:=imagen1.Picture.Width;
bitmap.Height:=Imagen1.Picture.Height;
bitmapAux:=TBitmap.Create;
bitmapaux.Width:=imagen1.Picture.Width;
bitmapaux.Height:=Imagen1.Picture.Height;
rectangulo.Left:=0;
rectangulo.Top:=0;
rectangulo.Right:=imagen1.Picture.Width;
rectangulo.Bottom:=Imagen1.Picture.Height;
bitmapAux.Canvas.CopyRect(rectangulo,imagen1.canvas,rectangulo);
matrizCero(matrizByAux,imagen1.Picture.Width,imagen1.Picture.Height);
imagen1.picture.bitmap.PixelFormat:=pf24bit;
imagen2.picture.bitmap.PixelFormat:=pf24bit;
bitmapN:=TBitmap.Create;
bitmapN.Width:=imagen1.Picture.Width;
bitmapN.Height:=Imagen1.Picture.Height;
bitmapN.Canvas.CopyRect(rectangulo,imagen2.canvas,rectangulo);
end;

procedure
Tfilla.grabarClick(Sender: TObject);

99
Manual de usuario:
var
nomeFicheiroGrabar:string;
fichero,ficheroOriginal:file of byte;
elemento,blanco,negro:byte;
auxForx,auxForY:integer;

begin

if FillaDialogoGrabar.Execute then
begin
screen.cursor:=CrHourGlass;
nomeFicheiroGrabar:=FillaDialogoGrabar.FileName;
Imagen1.Picture.Bitmap.PixelFormat:=pf8bit; //256 cores
Imagen1.Picture.SaveToFile(nomeFicheiroGrabar);
end;
screen.cursor:=CrDefault;
end;

procedure Tfilla.Imagen1MouseUp(Sender: TObject; Button: TMouseButton;


Shift: TShiftState; X, Y: Integer);
begin
if BoolDibuja then
begin
dibuja(origen,Point(StrToInt((Owner as TVPrincipal).EditX.text),StrToInt((Owner as TVPrincipal).EditY.text)),pmCopy,1);
BoolDibuja:=false;
end;
end;

procedure Tfilla.FormCreate(Sender: TObject);


begin
Maltura:=TMaltura.Create(0);
MaxLinea:=15;
maxUnion:=15;
primero:=true;
primero2:=true;
interpolacion:=false;
estadoimagen:=-1;
end;
procedure Tfilla.ZoomMais2(Sender: TObject);
begin
ProcedimientoZoomMais(contadorZoom2,imagen2,imagen1.picture.Width,imagen1.Picture.Height);
end;

procedure Tfilla.Zoom2Click(Sender: TObject);


begin
ProcedimientoZoomMenos(contadorZoom2,imagen2,imagen1.picture.Width,imagen1.Picture.Height);
end;

procedure Tfilla.Imagen2MouseMove(Sender: TObject; Shift: TShiftState; X,


Y: Integer);
var Faltura:real;
begin
if ContadorZoom2>0 then
begin
(Owner as TVPrincipal).EditX.text:=IntToStr(X div ContadorZoom2);
(Owner as TVPrincipal).EditY.text:=IntToStr(Y div ContadorZoom2);
end
else
begin
(Owner as TVPrincipal).EditX.text:=IntToStr(X* (abs(ContadorZoom2)));
(Owner as TVPrincipal).EditY.text:=IntToStr(Y* (abs(ContadorZoom2)));
end;

x1:=StrToInt((Owner as TVPrincipal).EditX.text);
y1:=StrToInt((Owner as TVPrincipal).EditY.text);

if MAltura.NElementos=0 then (Owner as TVPrincipal).EditA.text:=''


else
if MAltura.NElementos=0 then (Owner as TVPrincipal).EditA.text:=''
else

100
Manual de usuario:
begin
if interpolacion then
begin
EncontrarEtiqueta(point(x1,y1),(Owner as TVPrincipal).CuadradoColor.Brush.Color,Faltura);
(Owner as TVPrincipal).EditA.text:=FloatToStr(FAltura)
end
else
(Owner as
TVPrincipal).EditA.text:=(IntToStr(Maltura.AlturaDeColor(bitmapaux.canvas.Pixels[x1,y1])));
end;
(Owner as TVPrincipal).CuadradoColor.Brush.Color:=Imagen2.Canvas.Pixels[x1,y1];
if ((Owner as TVPrincipal).BRegion.down=true)and(primero2=false) then
begin
Dibuja2(Origen,puntoM,pmNotXor,1);
PuntoM:=Point(x1,y1);;
dibuja2(origen,puntoM,pmNotXor,1);
end;
if ((Owner as TVPrincipal).BRuta.down=true)and(primero2=false) then
begin
Dibuja2(Origen,puntoM,pmNotXor,2);
PuntoM:=Point(x1,y1);;
dibuja2(origen,puntoM,pmNotXor,2);
end;

if ((Owner as TVPrincipal).BREFERENCIA.down=true)and(primero2=false) then


begin
Dibuja2(Origen,puntoM,pmNotXor,2);
PuntoM:=Point(x1,y1);;
dibuja2(origen,puntoM,pmNotXor,2);
end;

if ((Owner as TVPrincipal).BMEDIR.down=true)and(primero2=false) then


begin
Dibuja2(Origen,puntoM,pmNotXor,2);
PuntoM:=Point(x1,y1);;
dibuja2(origen,puntoM,pmNotXor,2);
end;

end;

procedure Tfilla.Igualar1Click(Sender: TObject);


begin
contadorZoom:=contadorZoom2;
dibujarImagen(contadorZoom,imagen1,imagen1.picture.Width,imagen1.picture.height);
ScrollBox1.HorzScrollBar.position:=ScrollBox2.HorzScrollBar.position;
ScrollBox1.VertScrollBar.Position:=ScrollBox2.VertScrollBar.Position;

end;

procedure Tfilla.Igualar2Click(Sender: TObject);


begin
contadorZoom2:=contadorZoom;
dibujarImagen(contadorZoom2,imagen2,imagen2.picture.Width,imagen2.picture.height);
ScrollBox2.HorzScrollBar.position:=ScrollBox1.HorzScrollBar.position;
ScrollBox2.VertScrollBar.Position:=ScrollBox1.VertScrollBar.Position;

end;
// IM2 Down
procedure Tfilla.Imagen2MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
distanciaMetros,DistanciaPixels:real;
ColorElegido:Tcolor;
begin
x1:=StrToInt((Owner as TVPrincipal).EditX.text);
y1:=StrToInt((Owner as TVPrincipal).EditY.text);

colorElegido:=(Owner as TVPrincipal).cuadradoColor.Brush.color;
if (Shift=[ssLeft]) then
begin

101
Manual de usuario:
if (Owner as TVPrincipal).shape1.Pen.color=clRed then
begin
(Owner as TVPrincipal).shape1.brush.color:=colorElegido;
end else
if (Owner as TVPrincipal).shape2.Pen.color=clRed then
begin
(Owner as TVPrincipal).shape2.brush.color:=colorElegido;
end else
if (Owner as TVPrincipal).shape3.Pen.color=clRed then
begin
(Owner as TVPrincipal).shape3.brush.color:=colorElegido;
end else
if (Owner as TVPrincipal).shape4.Pen.color=clRed then
begin
(Owner as TVPrincipal).shape4.brush.color:=colorElegido;
end else
if (Owner as TVPrincipal).shape5.Pen.color=clRed then
begin
(Owner as TVPrincipal).shape5.brush.color:=colorElegido;
end;
end;

// NOVA COTA 2

if ((Owner as TVPrincipal).BNoCo.down=true)and(Shift=[ssLeft]) then


begin
if (Owner as TVPrincipal).DiaCor.execute then
begin
coloreaN(x1,y1,(Owner as TVPrincipal).DiaCor.color,imagen1.picture.Width,imagen1.Picture.height);
imagen1.Canvas.Draw(0,0,bitmapaux);
DibujarImagen(contadorZoom,imagen1,imagen1.Picture.Width,imagen1.Picture.Height);
end;
end;

// SEGUNDO MÉTODO 2
if ((Owner as TVPrincipal).Bpixels.down=true)and(Shift=[ssLeft])and(primero=true) then
begin
VColor:=TVColor.Create(0);
Vcolor.anhadir(Imagen2.Canvas.Pixels[x1,y1]);
Vcolor.muestra((owner as TVprincipal).panel5);
primero:=false;
end
else
if ((Owner as TVPrincipal).Bpixels.down=true)and(Shift=[ssLeft])
and(primero=false) then
begin
Vcolor.anhadir(Imagen2.Canvas.Pixels[x1,y1]);
Vcolor.muestra((owner as TVprincipal).Panel5);;
end;

//MEDIR 2

if ((Owner as TVPrincipal).BMedir.down=true)and(Shift=[ssLeft])
and(primero2=true) then
begin
Origen:=Point(x1,y1);
puntoM:=Origen;
primero2:=false;
end else
if ((Owner as TVPrincipal).BMedir.down=true)and(Shift=[ssLeft])
and(primero2=false) then
begin
imagen2.Canvas.Draw(0,0,bitmapN);
DibujarImagen(contadorZoom2,imagen2,imagen1.Picture.Width,imagen1.Picture.Height);
puntoM:=point(x1,y1);
distanciaPixels:=distancia(origen.x,origen.y,puntoM.x,puntoM.y,matrizBy);
distanciaMetros:=distanciaPixels*fraccion;
(Owner as TVPrincipal).LDistancia.caption:=(IntToStr(Round(distanciaMetros))+' m.');
primero2:=true;
end;

102
Manual de usuario:

// RUTA 2

if ((Owner as TVPrincipal).BRuta.down=true)and(Shift=[ssLeft])
and(primero2=true) then
begin
Origen:=Point(x1,y1);
puntoM:=Origen;
primero2:=false;
distanciaAcumulada:=0;
ULTIMOcOLOR:=bitmapAux.Canvas.Pixels[x1,y1];
Penultimo:=ultimoColor;
Antepenultimo:=UltimoColor;
Application.CreateForm(TVChar,Ficha);
Ficha.Series1.AddXY(0,Maltura.AlturaDeColor(bitmapaux.canvas.pixels[x1,y1])
,'',bitmapaux.canvas.Pixels[x1,y1]);

end
else
if ((Owner as TVPrincipal).BRuta.down=true)and(Shift=[ssLeft])
and(primero2=false) then
begin
dibuja2(origen,Point(x1,y1),pmNotXor,2);
puntoM:=point(x1,y1);
anhadirSerie(oRIGEN,pUNTOm,matrizByAux,bitmapAux,fraccion,distanciaAcumulada);
ultimoColor:=(bitmapaux.canvas.pixels[X1,Y1]); //?
dibuja2(origen,Point(x1,y1),pmNotXor,2);
origen:=puntoM;
primero2:=true;
Ficha.Series1.AddXY(distanciaAcumulada*fraccion,Maltura.AlturaDeColor(bitmapaux.canvas.pixels[x1,y1])
,'',bitmapaux.canvas.Pixels[x1,y1]);

mostrarFicha;
imagen2.Canvas.Draw(0,0,bitmapN);
DibujarImagen(contadorZoom2,imagen2,imagen1.Picture.Width,imagen1.Picture.Height);

end
else if ((Owner as TVPrincipal).BRuta.down=true)and(Shift=[ssLeft,SSCtrl])
and(primero2=false) then
begin
end;

//REGION 2

if ((Owner as TVPrincipal).BRegion.down=true)and(Shift=[ssLeft])
and(primero2=true) then
begin
Origen:=Point(x1,y1);
OrigenRegion:=Origen;
puntoM:=Origen;
primero2:=false;
end
else
if ((Owner as TVPrincipal).BRegion.down=true)and(Shift=[ssLeft])
and(primero2=false) then
begin
puntoM:=point(x1,y1);
DibujarLinea(bitmap,matrizByAux,y1,x1,origen.y,origen.x,clGreen,18);
Dibuja2(Origen,puntoM,pmcOPY,1);
origen:=puntoM;
end
else if ((Owner as TVPrincipal).BRegion.down=true)and
(Shift=[ssLeft,SSCtrl])and(primero2=false) then
begin
DibujarLinea(bitmap,matrizByAux,y1,x1,origen.y,origen.x,clGreen,18);
DibujarLinea(bitmap,matrizByAux,y1,x1,origenRegion.y,origenRegion.x,ClGreen,18);

Dibuja2(Origen,puntoM,pmcOPY,1);
puntoM:=point(x1,y1);
Dibuja2(OrigenRegion,puntoM,pmcOPY,1);

103
Manual de usuario:
primero2:=true;
end;
// AREA 2
if ((Owner as TVPrincipal).BArea.down=true)and(Shift=[ssLeft])
and(primero2=true) then
begin
(Owner as TVPrincipal).BArea.down:=false;
(Owner as TVPrincipal).LArea.caption:=(IntToStr(
Round(
contarPixels(x1,y1,RGB(250,200,30),imagen1.picture.Width,imagen1.Picture.height)*fraccion*fraccion
)
)
+' m2.' );
end;
// Referencia 2
if ((Owner as TVPrincipal).BReferencia.down=true)and(Shift=[ssLeft])
and(primero2=true) then
begin
Origen:=Point (x1,y1);
puntoM:=Origen;
primero2:=false;
end else
if ((Owner as TVPrincipal).BReferencia.down=true)and(Shift=[ssLeft])and(primero2=false) then
begin
imagen2.Canvas.Draw(0,0,bitmapN);
DibujarImagen(contadorZoom2,imagen2,imagen1.Picture.Width,imagen1.Picture.Height);
puntoM:=Point(x1,y1);
distanciaPixels:=distancia(origen.x,origen.y,puntoM.x,puntoM.y,matrizBy);
//distanciaMetros:=StrToInt(InputBox('Introduce Distancia','Introduce Distancia en Metros:','1000'));
Application.CreateForm(TFPregunta,FPregunta);
DistanciaMetros:=FPregunta.showModal;
if DistanciaMetros=-1 then DistanciaMetros:=0;
Fpregunta.Free;
fraccion:=distanciaMetros/distanciaPixels;
primero2:=true;
end;
end;
end.

104
Manual de usuario:

5.4. COMPOSICION.PAS

procedure TVcomposicion.SpeedButton1Click(Sender: TObject);


var recta2,recta:TRect;
factorX,factorY:real;
x1,x2,y1,y2:integer;
nx1,nx2,ny1,ny2:integer;
recipiente:Tpicture;
begin
DialogoAbrir.InitialDir:='c:\Relieves';
image1.Canvas.CopyMode:=cmSrcCopy;;
if (DialogoAbrir.Execute)then
begin
recipiente:=tpicture.Create;
recipiente.LoadFromFile(DialogoAbrir.FileName);

x1:=strToInt(editX1.text);
x2:=strToInt(editX2.text);
y1:=strToInt(editY1.text);
y2:=strToInt(editY2.text);
nx1:=strToInt(eX1.text);
nx2:=strToInt(eX2.text);
ny1:=strToInt(eY1.text);
ny2:=strToInt(eY2.text);
factorX:=image1.Width/(X2-X1);
factorY:=image1.Height/(Y2-Y1);
recta.left:=round(nx1*factorx);
recta.top:=round(ny1*factorY);
recta.Right:=round(nx2*factorX);
recta.bottom:=round(ny2*factorY);
recta2.left:=0;
recta2.top:=0;
recta2.Right:=recipiente.Width;
recta2.bottom:=recipiente.Height;
image1.Canvas.CopyRect(recta,recipiente.Bitmap.canvas,recta2)
end;
end;

procedure TVcomposicion.ey2KeyPress(Sender: TObject; var Key: Char);


begin
if ((key<'0')or(Key>'9'))and(Key<>#8)then key:=#0
else key:=key;
end;

procedure TVcomposicion.Button1Click(Sender: TObject);


begin
if DialogoGrabar.Execute then
Image1.Picture.SaveToFile(DialogoGrabar.FileName);
end;

procedure TVcomposicion.ZoomMasClick(Sender: TObject);


begin
ProcedimientoZoomMais(contadorZoom,image1,image1.picture.Width,image1.Picture.Height);
end;

procedure TVcomposicion.FormCreate(Sender: TObject);


var
auxforx,auxfory:integer;
BlBitmap:TBitmap;
begin
BLBitmap:=Tbitmap.Create;
BlBitmap.Width:=image1.Width;
BlBitmap.Height:=image1.height;
image1.Canvas.Draw(0,0,BlBitmap);
contadorZoom:=1;
end;

procedure TVcomposicion.ZoomMenosClick(Sender: TObject);


begin
105
Manual de usuario:
ProcedimientoZoomMenos(contadorZoom,image1,image1.picture.Width,image1.Picture.Height);
end;

procedure TVcomposicion.grabarClick(Sender: TObject);


begin
if DialogoGrabar.Execute then
begin
Image1.Picture.Bitmap.PixelFormat:=pf8bit;
image1.Picture.Bitmap.SaveToFile(DialogoGrabar.FILEname);
end;
screen.cursor:=CrDefault;
end;
end.

106
Manual de usuario:

5.5. DESCONTINUIDADESAUX.PAS

procedure buscarExtremo(var x1,y1:integer;var matrizBy:matrizByte;radioBusqueda:integer;ancho,alto:integer);


var
dx,dy,radio:integer;
encontrado:boolean;
begin
encontrado:=false;
dx:=-1;
dx:=-1;
radio:=1;
while((radio<radioBusqueda)and(encontrado=false))do
begin
for dx:=-radio to radio do
begin
for dy:=-radio to radio do
begin
if (EsExtremo(x1+dx,y1+dy,matrizBy)or(x1+dx=0)or(y1+dy=0)or(x1+dx=ancho)or(x1+dy=alto)) then
begin
encontrado:=true;
x1:=x1+dx;
y1:=y1+dy;
end //do if
end; //do for dy
end; //do for dx
inc(radio);
end; //do while
end; //do procedemento

function distancia(x1,y1,x2,y2:integer;var matrizBy:matrizByte):real;


var distancA:real;
begin
x1:=abs(x1-x2){+1};
y1:=abs(y1-y2){+1};
distancA:=sqrt((x1*x1)+(y1*y1));//+1-> contamos tamen o propio pixel
distancia:=distancA;//+1-> contamos tamen o propio pixel

end;
function LongitudLinea(x:integer;y:integer;var matrizBy:matrizByte;var borde:boolean;ancho:integer;alto:integer):integer;
var
vecinosNoCero,dx,dy,auxFx,auxFy,longitud:integer;
antiguoX,antiguoY,nx,ny:integer;
begin
longitud:=0;
antiguoX:=x;
antiguoY:=y;
repeat
vecinosNoCero:=0;
if (matrizBy[x-1,y-1]=1)and((x-1<>antiguox)or(y-1<>antiguoY))
then
begin
vecinosNoCero:=1;
antiguoX:=x;
antiguoY:=y;
x:=x-1;
y:=y-1;
end;
if (matrizBy[x-1,y]=1)and((x-1<>antiguox)or(y<>antiguoY)) then
begin
vecinosNoCero:=1;
antiguoX:=x;
antiguoY:=y;
x:=x-1;
y:=y;
end;

if (matrizBy[x-1,y+1]=1)and((x-1<>antiguox)or(y+1<>antiguoY)) then
begin
vecinosNoCero:=1;
107
Manual de usuario:
antiguoX:=x;
antiguoY:=y;
x:=x-1;
y:=y+1;
end;
if (matrizBy[x,y-1]=1)and((x<>antiguox)or(y-1<>antiguoY)) then
begin
vecinosNoCero:=1;
antiguoX:=x;
antiguoY:=y;
x:=x;
y:=y-1;
end;
if (matrizBy[x,y+1]=1)and((x<>antiguox)or(y+1<>antiguoY)) then
begin
antiguoX:=x;
antiguoY:=y;

vecinosNoCero:=1;
x:=x;
y:=y+1;
end;
if (matrizBy[x+1,y-1]=1)and((x+1<>antiguox)or(y-1<>antiguoY)) then
begin
antiguoX:=x;
antiguoY:=y;
vecinosNoCero:=1;
x:=x+1;
y:=y-1;
end;
if (matrizBy[x+1,y]=1)and((x+1<>antiguox)or(y<>antiguoY)) then
begin
antiguoX:=x;
antiguoY:=y;
vecinosNoCero:=1;
x:=x+1;
y:=y;
end;
if(matrizBy[x+1,y+1]=1)and((x+1<>antiguox)or(y+1<>antiguoY)) then
begin
antiguoX:=x;
antiguoY:=y;
vecinosNoCero:=1;
x:=x+1;
y:=y+1;
end;
if vecinosNoCero=1 then inc(longitud);
until (vecinosNoCero=0) or (longitud>2000);
if (x=ancho-1) or (y=alto-1) or (y=1)or (x=1) then
borde:=true
else borde:=false;
LongitudLinea:=longitud;

end;

Function EsExtremo(PosX:integer;posY:integer;var matrizBy:MatrizByte):boolean;


var
dx,dy:integer;
es:boolean;
VecinosNoCero:integer;
begin
es:=false;
VecinosNoCero:=-1;
if matrizBy[posX,posY]<>0 then
for dx:=-1 to 1 do
for dy:=-1 to 1 do
begin
if matrizBy[PosX+dx,PosY+dy]<>0 then
inc(VecinosNoCero);
end;

108
Manual de usuario:
if (VecinosNoCero=1)or(VecinosNoCero=0) then es:=true;
esExtremo:=es;
end;
end.

109
Manual de usuario:

5.6. DESCONTINUIDADES.PAS

procedure UnirLinea(var matrizBy:matrizByte;var bitmap:TBitmap;posX:integer;posY:integer;maximaDistancia,ancho,alto:integer);


var
primero,encontrado,PrimeraUnion,encontradoOtroExtremo:boolean;
PosiblePuntox,posiblePuntoY,radio,posIX,PosIY,nX,nY,dx,dy:integer; //posIX:posicion inicial de X
colorBy:byte;
colorBitmap:Tcolor;
borde:boolean;
begin
radio:=1;
posIX:=posX;
posIY:=posY;
encontradoOtroExtremo:=false;
primeraUnion:=true;
maximaDistancia:=maximaDistancia*10;
While encontradoOtroExtremo<>true do
begin
encontrado:=false;
primero:=true;
for dx:=-radio to radio do
begin
for dy:=-radio to radio do
begin
if (PosX+dx>=0)and(posX+dx<=ancho)and(posY+dy<=alto)and(posY+dy>=0)
then
begin
if (matrizBy[PosX+dx,PosY+dy]=1) and((dx<>0)or(dy<>0))
and
((radio=1)or((EsExtremo(PosX+dx,posY+dy,matrizBy)){and(NoObstaculos(PosY,PosX,PosY+dy,PosX+dx,matrizBy))}))
then
begin
encontrado:=true;
posiblePuntoX:=posX+dx;
posiblePuntoY:=posY+dy;
end; //end de si é encontrado
end//end do si a posición a examinar é válida
else
begin
encontrado:=true;
posiblePuntoX:=PosX+dx;
posiblePuntoY:=PosY+dy;
if posiblePuntox<=-1 then posiblePuntoX:=0;
if posiblePuntox>=ancho+1 then posiblePuntoX:=ancho;
if posiblePuntoy>=alto+1 then posiblePuntoY:=alto;
if posiblePuntoY<=-1 then posiblePuntoY:=0;
end;
if encontrado=true then
if primero=true then
begin
nX:=PosiblePuntoX;
nY:=PosiblePuntoY;
primero:=false;
end //end de si é o primeiro extremo encontrado con ese radio
else
begin
if (distancia(PosiblePuntoX,PosiblePuntoY,posx,posy,matrizBy)<distancia(nx,ny,posx,posy,matrizBy)) then
begin
nx:=posiblePuntoX;
ny:=posiblePuntoY;
end //end de si a distancia o novo extremo é menor que a distancia o extremo atopado antes
end; //end de si non si é o primeiro extremo encontrado con ese radio
end; //end dó 2º for
end;// end dó 1erº for
if encontrado=false then
begin
inc(radio);
if radio>maximaDistancia then encontradoOtroExtremo:=true;
end
110
Manual de usuario:
else
begin
if radio>1 then
begin
colorBy:=150;
colorBitmap:=clRed;
matrizBy[PosIX,posIY]:=1;
bitmap.canvas.pixels[posIX,PoSIY]:=colorBitmap;
end
else
begin
colorBy:=150;
colorBitmap:=ClBlue;
matrizBy[PosIX,posIY]:=1;
bitmap.canvas.pixels[posIX,PoSIY]:=colorBitmap;
end;
dibujarLinea(bitmap,matrizBy,PosY,PosX,ny,nX,colorBitmap,colorBy);
PosX:=nX;
PosY:=nY;
radio:=1;
end; //end dó else (cando non é encontrado)
if (encontrado=true)and(((PosX=0)or(posY=0)or(posX=ancho)or(posY=alto))or((posX=posIX)and(posY=posIY)))
then
begin
encontradoOtroextremo:=true;
matrizBy[PosX,PosY]:=0;
end;
end; //end dó while encontradoOtroextremo
end; //

//***************************EliminarDescontinuidades***************************
procedure EliminarDescontinuidades(var matrizBy:matrizByte;var bitmap:Tbitmap;ancho:integer;alto,maxLinea:integer);
var
auxFX,auxFY:integer;
rectangulo:Trect;
VecinosNoCero,dx,dy:integer;
borde:boolean;
begin
//borrado dos bordes da matrizBy:
for auxFX:=0 to ancho do
matrizBy[auxFX,0]:=0;
for auxFX:=0 to ancho do
matrizBy[auxFX,alto]:=0;
for auxFy:=0 to alto do
matrizBy[0,auxFy]:=0;
for auxFy:=0 to alto do
matrizBy[ancho,auxFy]:=0;
// Parte alta da imaxen::
for auxFX:=0 to ancho do
if matrizBy[auxFX,1]=1 then UnirLinea(matrizBy,bitmap,auxFx,1,maxLinea,ancho,alto);
//Lado izquierdo da imaxen:
for auxFY:=0 to alto do
if matrizBy[1,auxFY]=1 then UnirLinea(matrizBy,bitmap,1,auxFy,maxLinea,ancho,alto);
//Parte baixa da imaxen:
for auxFX:=0 to ancho do
if matrizBy[auxFx,alto-1]=1 then UnirLinea(matrizBy,bitmap,auxFx,alto-1,maxLinea,ancho,alto);

//Lado dereito da imaxen:


for auxFY:=0 to alto do
if matrizBy[ancho-1,auxFY]=1 then UnirLinea(matrizBy,bitmap,ancho-1,auxFy,maxLinea,ancho,alto);
for auxFx:=1 to ancho-1 do
for auxFy:=1 to alto-1 do
if esExtremo(auxFx,auxFy,matrizBy)then
if LongitudLinea(AuxFx,auxFy,matrizBy,borde,ancho,alto)>maxLinea then
begin
UnirLinea(matrizBy,bitmap,AuxFx,auxFy,maxLinea,ancho,alto);
matrizBy[auxFx,auxFy]:=1;
if esExtremo(auxFx,auxFy,matrizBy)then
UnirLinea(matrizBy,bitmap,AuxFx,auxFy,maxLinea,ancho,alto);

111
Manual de usuario:
end;
for auxFX:=1 to ancho do
for auxFy:=1 to alto do
begin
if matrizby[auxFx,auxFy]<>0 then
begin
if ((matrizby[auxFx,auxFy-1]<>0) and (matrizby[auxFx-1,auxFy]<>0) and (matrizby[auxFx+1,auxFy+1]=0))
or ((matrizby[auxFx-1,auxFy]<>0) and (matrizby[auxFx,auxFy+1]<>0) and (matrizby[auxFx+1,auxFy-1]=0))
or ((matrizby[auxFx,auxFy+1]<>0) and (matrizby[auxFx+1,auxFy]<>0) and (matrizby[auxFx-1,auxFy-1]=0))
or ((matrizby[auxFx+1,auxFy]<>0) and (matrizby[auxFx,auxFy-1]<>0) and (matrizby[auxFx-1,auxFy+1]=0)) then
begin
matrizby[auxFx,auxFy]:=0;
bitmap.Canvas.Pixels[auxFx,auxFy]:=RGB(255,255,255);
end;
end;
end;
end;

112
Manual de usuario:

5.7. ZHANGSUES.PAS

Procedure ZhangSuenModificado(var matrizBy:matrizByte;var Bprogreso:TprogressBar;var matrizN:tbitmap; ancho,alto:integer);


var
filas,X:integer;Y:integer;
VecinosNoCero,dy,TransicionesCeroUno,dx:Shortint ;
Ccero:TColor;
cambio:boolean;
rectangulo:TRect;
cadena:string;
cero:byte;
P : PByteArray;
cadenita:string;
begin
CCero:=RGB(255,255,255);
cero:=0;

//recordar: matriz[columna grafica,fila grafica]


//Comezo do algoritmo:
//X-> recorre as columnas (Width)
//Y->recorre as filas (Height)
cambio:=true;
while cambio do
begin
cambio:=false;

// 1ª parte do algoritmo
for X:=1 to ancho-1 do
begin
for Y:=1 to alto-1 do
begin
if matrizBy[x,y]<>Cero then
begin
VecinosNoCero:=-1;
for dx:=-1 to 1 do
for dy:=-1 to 1 do
if matrizBy[x+dx,y+dy]<>Cero then
Inc(VecinosNoCero);
TransicionesCeroUno:=0;

if(matrizBy[x-1,y-1]=Cero)and(matrizBy[x,y-1]<>Cero)
then inc(transicionesCeroUno);

if(matrizBy[x,y-1]=Cero)and(matrizBy[x+1,y-1]<>cero)
then inc(transicionesCeroUno);

if(matrizBy[x+1,y-1]=Cero)and(matrizBy[x+1,y]<>cero)
then inc(transicionesCeroUno);

if(matrizBy[x+1,y]=Cero)and(matrizBy[x+1,y+1]<>cero)
then inc(transicionesCeroUno);

if(matrizBy[x+1,y+1]=Cero)and(matrizBy[x,y+1]<>cero)
then inc(transicionesCeroUno);

if(matrizBy[x,y+1]=Cero)and(matrizBy[x-1,y+1]<>cero)
then inc(transicionesCeroUno);

if(matrizBy[x-1,y+1]=Cero)and(matrizBy[x-1,y]<>cero)
then inc(transicionesCeroUno);

if(matrizBy[x-1,y]=Cero)and(matrizBy[x-1,y-1]<>cero)
then inc(transicionesCeroUno);

if( ((VecinosNoCero>=2) and (VecinosNoCero<=6))and


(TransicionesCeroUno=1) and
((matrizBy[x+1,y]=Cero)or (matrizBy[x,y+1]=Cero)
or ((matrizBy[x,y-1]=Cero) and
(matrizBy[x-1,y]=Cero))) )
113
Manual de usuario:
then matrizBy[x,y]:=128

end //end del if

end; //end del for


end; //end del for

// Borrado (1ª parte do algoritmo):


for X:=1 to ancho-1 do
begin
for Y:=1 to alto-1 do
begin
if matrizBy[x,y]=128 then
begin
matrizBy[x,y]:=Cero;
cambio:=true;
end
end;
end;

//2ª parte do algoritmo


for X:=1 to ancho-1 do
begin
for Y:=1 to alto-1 do
begin
if matrizBy[x,y]<>Cero then
begin
VecinosNoCero:=-1;
for dx:=-1 to 1 do
for dy:=-1 to 1 do
if matrizBy[x+dx,y+dy]<>Cero then
Inc(VecinosNoCero);
TransicionesCeroUno:=0;

if(matrizBy[x-1,y-1]=Cero)and(matrizBy[x,y-1]<>Cero)
then inc(transicionesCeroUno);

if(matrizBy[x,y-1]=Cero)and(matrizBy[x+1,y-1]<>cero)
then inc(transicionesCeroUno);

if(matrizBy[x+1,y-1]=Cero)and(matrizBy[x+1,y]<>cero)
then inc(transicionesCeroUno);

if(matrizBy[x+1,y]=Cero)and(matrizBy[x+1,y+1]<>cero)
then inc(transicionesCeroUno);

if(matrizBy[x+1,y+1]=Cero)and(matrizBy[x,y+1]<>cero)
then inc(transicionesCeroUno);

if(matrizBy[x,y+1]=Cero)and(matrizBy[x-1,y+1]<>cero)
then inc(transicionesCeroUno);

if(matrizBy[x-1,y+1]=Cero)and(matrizBy[x-1,y]<>cero)
then inc(transicionesCeroUno);

if(matrizBy[x-1,y]=Cero)and(matrizBy[x-1,y-1]<>cero)
then inc(transicionesCeroUno);

if( ((VecinosNoCero>=2) and (VecinosNoCero<=6))and


(TransicionesCeroUno=1) and
((matrizBy[x,y-1]=Cero)or (matrizBy[x-1,y]=Cero)
or ((matrizBy[x+1,y]=Cero) and
(matrizBy[x,y+1]=Cero))) )
then matrizBy[x,y]:=128

end //end del if


end; //end del for
end; //end del for
// Borrado (2ª parte do algoritmo)

114
Manual de usuario:
for X:=1 to ancho-1 do
begin
for Y:=1 to alto-1 do
begin
if matrizBy[x,y]=128 then
begin
matrizBy[x,y]:=Cero;
cambio:=true;
end
end;
end;
end; //del while
for X:=1 to ancho do
for y:=1 to alto do
begin
if matrizby[x,y]=1 then
begin
if ((matrizby[x,y-1]=1) and (matrizby[x-1,y]=1) and (matrizby[x+1,y+1]=0))
or ((matrizby[x-1,y]=1) and (matrizby[x,y+1]=1) and (matrizby[x+1,y-1]=0))
or ((matrizby[x,y+1]=1) and (matrizby[x+1,y]=1) and (matrizby[x-1,y-1]=0))
or ((matrizby[x+1,y]=1) and (matrizby[x,y-1]=1) and (matrizby[x-1,y+1]=0))
then matrizby[x,y]:=0;
end; //do if
end; //do for

for X:=2 to ancho-2 do


for y:=2 to alto-2 do
if matrizby[x,y]=1 then
begin
vecinosNoCero:=-1;
for dx:=-1 to 1 do
for dy:=-1 to 1 do
if matrizBy[x+dx,y+dy]<>Cero then
Inc(VecinosNoCero);
if VecinosNoCero>2 then
matrizBy[x,y]:=0;
end;
end;

115
Manual de usuario:

5.8. DIBUJO.PAS

procedure dibujarLinea(var bitmap:tbitmap;var matrizby:matrizByte;x1,y1,x2,y2:integer;colorBitmap:Tcolor;colorByte:byte);


var
x,y:integer;
aux:real;
begin
bitmap.Canvas.Pen.Mode:=pmCopy;
if y1=y2 then
begin
if x2<x1 then
begin
x:=x2;
x2:=x1;
x1:=x;
end;
for x:=x1 to x2 do
begin
matrizby[y1,x]:=ColorByte;
bitmap.canvas.Pixels[y1,x]:=colorBitmap;
end;
end
else
if x1=x2 then
begin
if y2<y1 then
begin
y:=y2;
y2:=y1;
y1:=y;
end;
for y:=y1 to y2 do
begin
matrizby[y,x1]:=ColorByte;
bitmap.canvas.Pixels[y,x1]:=colorBitmap;
end;
end
else
begin
if (abs(y2-y1)>abs(x2-x1)) then
begin
if y2<y1 then
begin
y:=y2;
y2:=y1;
y1:=y;
x:=x2;
x2:=x1;
x1:=x;
end;
for y:=y1 to y2 do
begin
aux:=x1+(x2-x1)*(y-y1)/(y2-y1);
x:=round(aux);
if (aux-x)>0.5 then inc(x);
matrizBy[y,x]:=ColorByte;
bitmap.canvas.Pixels[y,x]:=colorBitmap;
end;
end
else
begin
if x2<x1 then
begin
y:=y2;
y2:=y1;
y1:=y;
x:=x2;
x2:=x1;
x1:=x;
116
Manual de usuario:
end;

for x:=x1 to x2 do
begin
aux:=y1+(y2-y1)*(x-x1)/(x2-x1);
y:=round(aux);
if (aux-y)>0.5 then inc(y);
matrizby[y,x]:=ColorByte;
bitmap.canvas.Pixels[y,x]:=colorBitmap;
end;
end;
end;
end;

5.9. UNIDADFPREGUNTA.PAS

procedure TFPregunta.MaskEditFPreguntaKeyPress(Sender: TObject; var Key: Char);


begin
if ((Key<'0')or(Key>'9')) Then
Key:=#0;
end;

procedure TFPregunta.EditAlturKeyPress(Sender: TObject; var Key: Char);


begin
if ((Key<'0')or(Key>'9')and(key<>#8)and(key<>#13)) Then
Key:=#0;
end;

procedure TFPregunta.BitBtn1Click(Sender: TObject);


begin
if (StrToInt(EditAltur.text))=0 then
ModalResult:=-1
else
ModalResult:=StrToInt(EditAltur.text)
end;

117
Manual de usuario:

5.10. ZOOM.PAS

Procedure dibujarImagen(contadorZoom:integer;var imagen1:TImage;WidthOriginal,HeightOriginal:integer);


begin
if contadorZoom=0 then contadorZoom:=1;
if contadorZoom>0 then
begin
Imagen1.Width:=WidthOriginal*contadorZoom;
Imagen1.Height:=HeightOriginal*contadorZoom;
end
else
begin
Imagen1.Width:=WidthOriginal div abs(contadorZoom);
Imagen1.Height:=HeightOriginal div abs(contadorZoom);

end;
end;

procedure ProcedimientoZoomMais(var contadorZoom:integer;var imagen:Timage; anchoOriginal,altoOriginal:integer);


BEGIN
Inc(contadorZoom);
if contadorZoom=-1 then contadorZoom:=1;
// contadorZoom toma valores ...-3,-2,1,2,3...
//contadorZoom nunca é igual a 0 nin a -1
if contadorZoom<0 then
{So miramos os casos onde vamos a dividir,
estos son cando contadorZoom é un número negativo}
begin
while(anchoOriginal mod contadorZoom<>0)and
(altoOriginal mod contadorZoom<>0)do
contadorZoom:=contadorZoom+1;
{Hai que mirar por un valor de contador
non de problemas para dividir}
dibujarImagen(contadorZoom,imagen,anchoOriginal,altoOriginal);

{ si contadorZoom é negativo dividimos a imaxe,


p.e. un contadorZoom de -2 significa que reducimos o tamaño
da imaxe orixinal entre dous}
end
else
//cando o contadorZoom e positivo, so temos que multiplicar a imaxe
begin
dibujarImagen(contadorZoom,imagen,anchoOriginal,altoOriginal);

end;
end;

procedure ProcedimientoZoomMenos(var contadorZoom:integer;var imagen1:Timage; widthOriginal,HeightOriginal:integer);


begin
contadorZoom:=contadorZoom-1;
// contadorZoom toma valores ...-3,-2,1,2,3...
//contadorZoom nunca é igual a 0 nin a -1:
if contadorZoom=0 then contadorZoom:=-2;
if contadorZoom<0 then
{So miramos os casos onde vamos a dividir,
estos son cando contadorZoom é un número negativo:}
begin
{Hai que mirar por un valor de contador
non de problemas para dividir:}
end
else
{cando o contadorZoom e positivo,
{so temos que multiplicar a imaxe:}
begin
dibujarImagen(contadorZoom,imagen1,WidthOriginal,HeightOriginal);
end;
end;

118
Manual de usuario: Código Fuente

5.11. TIPOS.PAS

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls, Menus;
type
matrizByte=array[0..2000,0..2000]of byte;
TAC=record
Altura:integer;
color:tcolor;
cambio:boolean;
numeroPixels:Cardinal;
end;
TmatrizAc=array[1..256]of TAC;
Tdoble=record
valido:boolean;
color:Tcolor;
end;

TMAltura=class
private
NumElementos:integer;
matrizAC:tmatrizAC; //matriz Altura-color
cambio:boolean;
colorAntiguo,colorNuevo:tcolor;

Public
Constructor Create(num:integer);
procedure cambiarColor(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
Procedure Anhadir(var color:Tcolor;altura:integer);
Procedure ensenha;
function fCambios:boolean;
function ColorDeAltura(altura:integer):tcolor;
function AlturaDeColor(color:Tcolor):integer;
function CambioDeAltura(altura:integer):boolean;
function colorA:tcolor;
function colorN:tcolor;
procedure PonherCambioFalse;
Procedure Borrar(color:Tcolor;altura:integer);
function NElementos:integer;
function ColorDeIndice(indice:integer):tcolor;
function AlturaDeIndice(indice:integer):integer;
function SumaDeIndice(indice:integer):integer;
function indiceDeColor(color:tcolor):integer;
procedure SumaColor(color:tcolor);
procedure SumaCero;
Destructor Destroy;Override;
End;

TVColor=Class
Private
numElementos:integer;
vector:Array[0..255]of TDoble;
Public
Constructor Create(num:integer);
Procedure Anhadir(color:Tcolor);
Procedure Borrar(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
Destructor Destroy;Override;
Procedure Muestra(Panel:TPanel);
function Esta(color:tcolor):boolean;
function NElementos:integer;
End;
Implementation

Constructor TMAltura.Create(num:integer);
Begin
Inherited Create;
119
Manual de usuario: Código Fuente
NumElementos:=num;
cambio:=false;
End;

Procedure TMAltura.Anhadir(var color:Tcolor;altura:integer);


var
encontrado:boolean;
auxF:integer;
Begin
encontrado:=false;
auxF:=1;
while(encontrado=false)and (auxF<=numElementos) do
begin
if matrizAC[auxF].Altura=altura then
begin
encontrado:=true;
color:=matrizAC[auxF].color;
end
else
inc(AuxF);
end;
if encontrado=false then
begin
inc(numelementos);
matrizAC[auxF].Altura:=altura;
matrizAC[auxF].color:=color;
matrizAC[auxF].cambio:=false;
matrizAC[auxF].numeropixels:=0;
end;

End;
Procedure TMAltura.ensenha;
var
ficha:Tform;
etiqueta:Tlabel;
auxF:integer;
cuadrado:tShape;

begin
Application.CreateForm(Tform,Ficha);
Ficha.Caption:='Cores - Alturas';
ficha.Width:=100;
ficha.left:=410;
ficha.top:=80;
ficha.height:=350;
etiqueta:=TLabel.Create(Ficha);
etiqueta.parent:=Ficha;
etiqueta.left:=20;
etiqueta.top:=1;
etiqueta.caption:='Altura Cor';

For auxF:=1 to numElementos do


begin
etiqueta:=TLabel.Create(Ficha);
with Etiqueta do
begin
Caption:=IntToStr(MatrizAC[auxF].altura);
left:=25;
top:=auxf*20;
Parent:=Ficha;
end;

cuadrado:=Tshape.Create(Ficha);
with cuadrado do
begin
cuadrado.name:='cuadrado'+intToStr(auxF);
left:=55;
top:=auxF*20;
width:=15;
height:=15;

120
Manual de usuario: Código Fuente
Brush.Color:=MatrizAC[auxF].color;
Parent:=Ficha;
cuadrado.OnMouseDown:=CambiarColor;
end;
end;
Ficha.ShowModal;
Ficha.Free;
end;
function TMAltura.fCambios:boolean;
begin
fCambios:=cambio;
cambio:=false;
end;

function TMAltura.ColorDeAltura(altura:integer):tcolor;
var auxF:integer;
begin
for auxF:=1 to numElementos do
begin
if MatrizAC[auxF].altura=altura then ColorDeAltura:=MatrizAC[auxF].color;
end;
end;

function TMAltura.AlturaDeColor(color:Tcolor):integer;
var
auxF:integer;
encontrado:boolean;
begin
encontrado:=false;
if (numElementos=0) then
begin
AlturaDeColor:=0;
end else
for auxF:=1 to numElementos do
begin
if MatrizAC[auxF].color=color then
begin
AlturaDeColor:=MatrizAC[auxF].altura;
encontrado:=true;
end;
end;

if (encontrado=false) then
begin
AlturaDeColor:=0;
end
end;
function TMAltura.CambioDeAltura(altura:integer):boolean;
var auxF:integer;
begin
for auxF:=1 to numElementos do
begin
if MatrizAC[auxF].altura=altura then
begin
CambioDeAltura:=matrizAC[auxF].cambio;
matrizAC[auxF].cambio:=true;
end;
end;
end;

procedure TMAltura.PonherCambioFalse;
begin
cambio:=false
end;

Destructor TMAltura.Destroy;
Begin
inherited Destroy;
End;
function TMAltura.colorA:tcolor;

121
Manual de usuario: Código Fuente
begin
colorA:=colorAntiguo;
end;
function TMAltura.colorN:tcolor;
begin
colorN:=colorNuevo;
end;

procedure TMAltura.cambiarColor(Sender: TObject; Button: TMouseButton;


Shift: TShiftState; X, Y: Integer);
var
CD:TcolorDialog;
auxF:integer;
begin
CD:=TColorDialog.Create((Sender as tshape).parent);
if CD.execute then
begin
colorAntiguo:=(sender as tshape).brush.color;
colorNuevo:=Cd.Color;
(sender as tshape).brush.color:=colorNuevo;
for auxF:=1 to Nelementos do
begin
if MatrizAC[auxF].color=colorAntiguo then
begin
MatrizAC[AuxF].color:=ColorNuevo;
MatrizAC[AuxF].cambio:=true;
end;
end; //del for auxF:=!
cambio:=true;
(((sender as tShape).parent)as TForm).close;
end;
end;

function TMAltura.NElementos:integer;
begin
NElementos:=numElementos;
end;

function TMAltura.ColorDeIndice(indice:integer):tcolor;
begin
colorDeIndice:=matrizAC[indice].color;
end;
function TMAltura.AlturaDeIndice(indice:integer):integer;
begin
AlturaDeIndice:=matrizAC[indice].altura;
end;

function TMAltura.indiceDeColor(color:tcolor):integer;
var auxF:integer;
begin
indiceDeColor:=0;
for auxF:=1 to numElementos do
begin
if MatrizAC[auxF].color=color then
indiceDeColor:=auxF
end
end;

function TMAltura.SumaDeIndice(indice:integer):integer;
begin
SumaDeIndice:=matrizAC[indice].numeroPixels;
end;

procedure TMAltura.SumaColor(color:tcolor);
var auxF:integer;
begin
for auxF:=1 to numElementos do
begin
if MatrizAC[auxF].color=color then
begin

122
Manual de usuario: Código Fuente
inc(MatrizAC[auxF].numeroPixels);
end;
end;
end;

procedure TMAltura.SumaCero;
var auxF:integer;
begin
for auxF:=1 to numElementos do
begin
MatrizAC[auxF].numeroPixels:=0;
end;
end;
{*******************************************************************}
Constructor TVColor.Create(num:integer); //Tipo Vector-Color
Begin
Inherited Create;
NumElementos:=num;
End;

Procedure TVcolor.Anhadir(Color:Tcolor);
var
encontrado:boolean;
auxF:integer;
Begin
if numElementos<=260 then
begin
encontrado:=false;
auxF:=1;
while(encontrado=false)and (auxF<=numElementos) do
begin
if Vector[auxF].Color=Color then
begin
encontrado:=true;
color:=Vector[auxF].color;
end
else
inc(AuxF);
end;
if encontrado=false then
begin
inc(numelementos);
Vector[AuxF].Color:=color;
Vector[AuxF].valido:=true;
end;
end;
End;

Procedure TVcolor.Borrar(Sender: TObject; Button: TMouseButton;


Shift: TShiftState; X, Y: Integer);
var
elemento,auxF:integer;
begin
elemento:=((Sender as TShape).top - 50) div 4;
for auxF:=elemento to numElementos-1 do
Vector[AuxF]:=Vector[AuxF+1];
numElementos:=numElementos-1;
muestra(((sender as TShape).parent)as Tpanel);
end;

Destructor TVColor.Destroy;
Begin
inherited Destroy;
End;

Procedure TVColor.Muestra(Panel:TPanel);
var
AuxF:integer;
cuadrado:Tshape;
elementosPanel:integer;

123
Manual de usuario: Código Fuente
ficha:Tform;
etiqueta:Tlabel;
begin
Panel.visible:=true;
elementosPanel:=panel.controlCount;

for auxF:=1 to elementosPanel-2 do


begin
if (panel.controls[2].className='TShape')then
begin
((panel.Controls[2])as TShape).visible:=false;;
((panel.Controls[2])as TShape).destroy;
end;
end;
For auxF:=1 to numElementos do
begin
cuadrado:=Tshape.Create(Panel);
with cuadrado do
begin
left:=6;
top:=50+auxF*4;
width:=15;
height:=3;
Brush.Color:=Vector[auxF].color;
Parent:=Panel;
cuadrado.OnMouseDown:=Borrar;
end;
end;
end;
function TvColor.Esta(color:tcolor):boolean;
var auxF:integer;
begin
Esta:=false;
for auxF:=1 to numElementos do
if Vector[auxF].color=color then Esta:=true;
end;
function TVColor.NElementos:integer;
begin
NELementos:=numElementos;
end;

124
Manual de usuario: Tabla de ilustraciones

6.TABLA DE ILUSTRACIONES

ILUSTRACIÓN 1: PROPIEDADES DE PANTALLA................................................................................7

ILUSTRACIÓN 2: ICONO DE RELIEVES.................................................................................................8

ILUSTRACIÓN 3: PANTALLA DE INICIO DEL PROGRAMA RELIEVES.........................................9

ILUSTRACIÓN 4: PANTALLA PRINCIPAL SIN IMAGEN CARGADA..............................................10

ILUSTRACIÓN 5: PANTALLA PRINCIPAL............................................................................................12

ILUSTRACIÓN 6: VENTANA ABRIR O GRABAR IMAGEN...............................................................13

ILUSTRACIÓN 7: EJEMPLO DE BORRADO........................................................................................14

ILUSTRACIÓN 8: EJEMPLO DE TAMAÑO DE LAS LÍNEAS SIN UNIR..........................................15

ILUSTRACIÓN 9: EJEMPLO DE VALOR MÁXIMO DE UNIÓN........................................................16

ILUSTRACIÓN 10: IMAGEN TRIDIMENSIONAL SIN Y CON INTERPOLACIÓN:.......................17

ILUSTRACIÓN 11: LEYENDA VACÍA......................................................................................................18

ILUSTRACIÓN 12: LEYENDA...................................................................................................................19

ILUSTRACIÓN 13: DIÁLOGO DE COLOR.............................................................................................20

ILUSTRACIÓN 14: PANEL FERRAMENTAS..........................................................................................21

ILUSTRACIÓN 15: MAPA...........................................................................................................................22

ILUSTRACIÓN 16: AÑADIR REGIONES 1..............................................................................................25

ILUSTRACIÓN 17: AÑADIR REGIONES 2..............................................................................................26

ILUSTRACIÓN 18: COMPOSICIÓN DE IMÁGENES...........................................................................27

ILUSTRACIÓN 19: VENTANA DE COORDENADAS............................................................................28

ILUSTRACIÓN 20: COORDENADAS 1....................................................................................................30

ILUSTRACIÓN 21: COORDENADAS 2....................................................................................................31

ILUSTRACIÓN 22: CRÉDITOS..................................................................................................................35

ILUSTRACIÓN 23: MENÚ EMERGENTE...............................................................................................36

ILUSTRACIÓN 24: PANEL SUPERIOR....................................................................................................37

ILUSTRACIÓN 25: PANEL EXTRAER COLOR.....................................................................................39


125
Manual de usuario: Tabla de ilustraciones

ILUSTRACIÓN 26: EXTRACCIÓN DE RÍO Y CURVAS.......................................................................39

ILUSTRACIÓN 27: TABLA DE COLORES..............................................................................................40

ILUSTRACIÓN 28: PANEL DE COLORES..............................................................................................41

ILUSTRACIÓN 29: EXTRACCIÓN DE CURVAS..................................................................................42

ILUSTRACIÓN 30: EXTRACCIÓN DE CURVAS Y ADELGAZAMIENTO........................................43

ILUSTRACIÓN 31: PANEL UNIR..............................................................................................................44

ILUSTRACIÓN 32: ELIMINACIÓN DE DISCONTINUIDADES..........................................................45

ILUSTRACIÓN 33: DETECCIÓN DE EXTREMOS................................................................................46

ILUSTRACIÓN 34: PANEL GRÁFICO......................................................................................................47

ILUSTRACIÓN 35: PERFILES...................................................................................................................48

ILUSTRACIÓN 36: ALTURA BASE...........................................................................................................50

ILUSTRACIÓN 37: PRECISIÓN EN REPRESENTACIÓN TRIDIMENSIONAL...............................52

ILUSTRACIÓN 38: IMÁGENES TRIDIMENSIONALES CON Y SIN INTERPOLACIÓN..............52

ILUSTRACIÓN 39: ROTACIÓN EN 3D....................................................................................................53

ILUSTRACIÓN 40: ESTADÍSTICA POR REGIONES............................................................................54

ILUSTRACIÓN 41: PANEL DE ETIQUETADO.......................................................................................55

ILUSTRACIÓN 42 :DOS IMÁGENES ETIQUETADAS..........................................................................56

126
Manual de usuario

127

Potrebbero piacerti anche