Sunteți pe pagina 1din 136

El lenguaje de Turbo Pascal Palabras reservadas Identificadores Tipos de datos Variables y constantes Comentarios La estructura de los programas Estructura

de los programas Sentencia PROGRAM Declaracin de unidades Declaracin de constantes, tipos y variables Programa principal Ejecucin de los programas Compilacin y ejecucin en memoria Compilacin al disco La operacin de asignacin Asignacin o igualacin Entrada y salida de datos Salida de datos a la pantalla Entrada de datos desde teclado Tipos de datos Tipos enteros Tipos reales Tipos caracter

Tipos cadenas Tipos lgicos

Palabras reservadas
Para poder programar en cualquier lenguaje es necesario conocer los cdigos mediante los cuales podamos expresar las tareas que queremos realizar. El Turbo Pascal, como lenguaje de programacin pose su propio cdigo con palabras de uso exclusivo para ciertas funciones, a estas palabras les llamaremos palabras reservadas de Turbo Pascal. Las palabras reservadas de Turbo Pascal (versiones 6.0 o mayores) son: Pascal Estandar y Turbo Pascal 6.0 AND CONST ELSE FORWARD IN NOT PROCEDURE SET UNTIL ARRAY DIV END FUNCTION LABEL OF PROGRAM THEN VAR Turbo Pascal ABSOLUTE ASM DESTRUCTOR IMPLEMENTATION INTERFACE OBJECT PRIVATE SHR UNIT VIRTUAL CONSTRUCTOR EXTERNAL INLINE INTERRUPT SHL STRING USES XOR Estas palabras no pueden ser usadas como identificadores (siguiente tpico) ya que cada una de ellas tiene una funcin definida en Turbo Pascal. BEGIN DO FILE GOTO MOD OR RECORD TO WHILE CASE DOWNTO FOR IF NIL PACKED REPEAT TYPE WITH

Identificadores
Los identificadores son palabras que representan constantes, variables, tipos de datos, procedimientos, funciones y algunos otros datos. Existen dos tipos de identificadores: los predefinidos de Turbo Pascal y los definidos por el programador. Algunos de los identificadores predefinidos son: integer, real, byte, sin, ...

Los identificadores definidos por el programador son los elementos del lenguaje tales como variables, procedimientos, funciones, etc. Un identificador es una secuencia de 1 a 127 caracteres, que inicia con una letra, no tienen espacios ni smbolos: &, !, *, etc. y no es alguna palabra reservada. Para el Turbo Pascal no existen diferencias entre maysculas y minsculas, as que a un identificador denominado "valor" se le puede referir como "VALOR" o "VaLoR". Todo identificador en Pascal debe ser definido previamente a su utilizacin.

Tipos de datos
El manejo de la informacin en Turbo Pascal se realiza mediante diferentes clases de datos. En este apartado se tratarn los principales tipos y conforme se vayan necesitando se explicaran los dems. Integer Nmeros enteros sin parte decimal. Char Caracteres del cdigo ASCII Boolean Pueden contener los valores de falso o verdadero Real Nmeros que pueden incluir una parte decimal String En una secuencia de caracteres que se trata como un solo dato.

Variables y constantes
Los tipos de datos que manejaremos en nuestro programa pueden ser de dos clases: variables o constantes. Como su nombre lo indica las variables pueden cambiar a lo largo de la ejecucin de un programa, en cambio las constantes sern valores fijos durante todo el proceso. Un ejemplo de una variable es cuando vamos a sumar dos nmeros que sern introducidos por el usuario del programa, ste puede introducir dos valores cualesquiera y no sera nada til restringirlo a dos valores predefinidos, as que dejamos que use los valores que el necesite sumar. Ahora, si nuestro programa de operaciones matemticas va a utilizar el valor de PI para algunos clculos podemos definir un identificador PI con el valor de 3.1415926 constante, de tal forma que PI no pueda cambiar de valor, ahora en lugar de escribir todo el nmero cada vez que se necesite en nuestro programa, solo tenemos que escribir PI. Las variables y constantes pueden ser de todos los tipos vistos anteriormente: numricos tanto enteros como reales, caracteres, cadenas de caracteres, etc.

Comentarios
Es posible introducir comentarios en nuestro programa que sirvan unicamente para mejorar la comprensin del cdigo fuente. Un comentario no es tomado en cuenta al momento de la compilacin del programa y es de enorme importancia al momento de crearlo, modificarlo o mantenerlo.

Existen dos formas de colocar comentarios en un programa de Turbo Pascal, entre llaves: {Comentario} o entre parentesis y asteriscos: (*Comentario*).

Estructura de los programas


El lenguaje utilizado en Turbo Pascal es estructurado, lo que significa que cada programa requiere una forma especfica de escritura para que sea entendido por el compilador. Todo programa cuenta con algunas partes o mdulos los cuales son: Cabecera Declaraciones Programa La cabecera del programa unicamente lleva el nombre del programa. En la seccin de declaraciones se le indica al compilador todos los identificadores y unidades que se utilizarn durante la ejecucin del programa. En la seccin del programa se escribe el cdigo de instrucciones que se llevarn a cabo.

Sentencia PROGRAM
La sentencia PROGRAM es la declaracin del nombre del programa. Consta de tres partes: la palabra reservada PROGRAM, a continuacin un identificador utilizado como el nombre del programa y al final un punto y coma ";". Por ejemplo: PROGRAM suma_de_dos_numeros ; Esta declaracin es siempre la primer linea en cualquier programa de Turbo Pascal.

Declaracin de unidades
Las unidades son mdulos independientes del programa que, aunque no son ejecutables por si mismos, pueden ser utilizados por el programa principal sin necesidad de reescribir el cdigo que contienen. Para la utilizacin de estos "subprogramas" es necesaria su declaracin. La palabra reservada USES cumple el propsito de declarar las unidades en el formato siguiente: USES crt, dos; Esta linea declara y habilita para su uso a la unidad crt y a la unidad dos Cada unidad que se declara debera estar separada de la siguiente por una coma. Al final de todas las unidades declaradas se deber colocar un punto y coma ";".

Declaracin de constantes y variables


Para declarar las constantes se utiliza la palabra reservada CONST seguida de un identificador al que se le dar un valor determinado, un signo de igual "=", el valor que recibir el identificador y al final un punto y coma ";". Ejemplo: CONST pi = 3.1415926; De esta forma el identificador pi recibir el valor de 3.1415926 y no ser posible cambiarlo en el transcurso del programa.

Es posible declarar varias constantes sucesivamente, puede ser una por rengln o varias en un solo rengln. Cuando se hace sto, la palabra CONST solo se pone una sola vez como cabecera y a continuacin todas las constantes por definir. Ejemplo: CONST PI = 3.1415926; Nombre = 'Juan Gutirrez'; Unidad = 1; Otra forma de escribir lo mismo es as: CONST PI = 3.1415926; Nombre = 'Juan Gutirrez'; Unidad = 1; Pero por cuestiones de legibilidad es preferible la primera opcin. La declaracin de variables se lleva a cabo de la misma forma, solo que en lugar de la palabra CONS utilizamos la palabra VAR, y en lugar de "= valor;", utilizamos : tipo , sustituyendo "tipo" por alguna clase vlida de datos en Turbo Pascal. Ejemplo: VAR Num_entero : Integer; Nombre : String;

Programa principal
Despues de haber realizado todas las declaraciones se puede iniciar con el programa principal. (Es posible, antes del programa, declarar las funciones y procedimientos, pero eso se analizar posteriormente). El programa principal inicia con la palabara reservada BEGIN y termina con la palabra END., esta ltima con un punto al final. Cada linea de cdigo, enunciado, sentencia o instruccin completa que se escriba deber terminar con un punto y coma ";". Solo se omitir el punto y coma cuando se utiliza la palabra reservada ELSE. Aunque puede tambin omitirse si la siguiente expresin es END o UNTIL. Ya conociendo la estructura es posible escribir un primer programa: PROGRAM Primera_Prueba; VAR Entero : Integer; CONST Mensaje = 'Introduce un valor entero: '; Respuesta = 'El valor es: '; BEGIN Write(Mensaje); {Escribe en pantalla el mensaje definido como constante} ReadLn(Entero); {Lee un valor de teclado y lo almacena en la variable Entero} WriteLn(Respuesta, Entero); {Escribe en pantalla el contenido de Respuesta y el valor que se ingres de teclado}

END. Como podr apreciarse, no es importante el orden en el que se declaran las variables y constantes (aplicable solo al Turbo Pascal), es decir, pueden declararse primero las variables y luego las constantes y viceversa: PROGRAM Primera_Prueba; CONST Mensaje = 'Introduce un valor entero: '; Respuesta = 'El valor es: '; VAR Entero : Integer; BEGIN Write(Mensaje); {Escribe en pantalla el mensaje definido como constante} ReadLn(Entero); {Lee un valor de teclado y lo almacena en la variable Entero} WriteLn(Respuesta, Entero); {Escribe en pantalla el contenido de Respuesta y el valor que se ingres de teclado} END.

Compilacin y ejecucin en memoria


La compilacin de un programa es el paso mediante el cual traducimos dicho programa al lenguaje maquina entendible por la computadora. Para lograr la compilacin en el entorno integrado de desarrollo de Turbo Pascal se utiliza la opcin Compile del men del mismo nombre. Para accesar al men se utiliza la secuencia de teclas: [ALT] + [C], y luego se escoge la opcin Compile. Otra forma de realizar la compilacin es con la secuencia de teclas: [ALT] + [F9]. Es posible compilarlo y ejecutarlo automaticamente utilizando la secuencia: [CONTROL] + [F9]

Compilacin al disco
Para poder ejecutar un programa sin necesidad de llamar al entorno integrado de desarrollo de Turbo Pascal es necesario compilar el programa al disco. Para hacer esto es necesario activar la opcin Destination a Disk, esto se hace entrando al men Compile, se selecciona la opcin Destination y se presiona [Enter], de esta forma se cambia el destino de compilacin de memoria a disco o viceversa (Dependiendo de la opcin seleccionada actualmente). Una vez compilado un programa en el disco es posible ejecutarlo directamente desde el sistema operativo.

Asignacin o igualacin
La operacin de asignacin es una de las ms utilizadas en Turbo Pascal ya que nos permite darle un valor determinado a las variables que declaramos en el programa o lo que es lo mismo, igualarla a algn valor determinado.

El smbolo utilizado para la operacin es los dos puntos seguidos por un signo de igual := , a la izquierda de dicho smbolo se coloca el identificador al que se le asignar un nuevo valor y a la derecha se colocar un identificador o algn valor directo que se almacenar en el primer identificador. Ejemplo: Nombre := 'Juan Prez'; {Nombre guardar la cadena "Juan Prez"} Resta := Numero1 - Numero2; {Resta gurdar el resultado de la resta de Numero2 a Numero1} Area := (Base*Altura)/2; {Obtiene el area de un triangulo y la guarda en el identificador Area} Es indispensable para todo programa que cuente con la capacidad de manejar entradas y salidas de informacin, ya que sin estas capacidades sera un programa intil.

Salida de datos a la pantalla


Las instrucciones que permiten mostrar datos en la pantalla de la computadora son: Write y WriteLn. Aunque ya se hizo uso de ellas en los pequeos programas anteriores de ejemplo, aqui se describirn a fondo. La sintaxis de los procedimientos es la siguiente: Write (indentificadores); WriteLn (indentificadores); Donde los identificadores son aquellos que contienen la informacin que se desea mandar a la pantalla. Es posible utilizar varios de ellos por cada instruccin Write o WriteLn, unicamente se separan unos de otros por comas ",". Ejemplo: Write (Nombre, ApellidoP, ApellidoM); Esta linea de cdigo desplegar consecutivamente los contenidos de los identificadores Nombre, ApellidoP y ApellidoM. En caso de que la variable Nombre almacenara el valor 'Rodrigo ', la variable ApellidoP 'Gonzlez ' y la variable ApellidoM 'Garca', el resultado en pantalla sera: Rodrigo Gonzlez Garca Podemos obtener el mismo resultado si utilizamos la siguiente estructura: Write (Nombre); Write (ApellidoP); Write (ApellidoM); Si en lugar de utilizar la instruccin Write hacemos uso de WriteLn con la misma sintaxis del ejemplo anterior: WriteLn (Nombre); WriteLn (ApellidoP); WriteLn (ApellidoM); lo que obtendriamos sera: Rodrigo Gonzlez Garca

De este ejemplo es posible concluir que la diferencia entre las instrucciones Write y WriteLn es que esta ltima imprime el contenido de los identificadores y cambia el cursor al siguiente rengln de la pantalla, y la primera solo escribe el contenido y deja el cursor al final del dato escrito.

Entrada de datos desde teclado


Las instrucciones estandar de Turbo Pascal para obtener datos desde el teclado son Read y ReadLn. La sintaxis de estas instrucciones es muy parecida a la de Write y WriteLn: Read (Identificador); El identificador puede ser cualquier variable definida previamente, NO puede ser una constante. Puede ser tambin un conjunto de variables, separadas entre comas, en este caso se guardara el primer valor dado antes del [Enter] en el primer identificador proporcionado, luego el segundo y as sucesivamente hasta el ltimo identificador. La diferencia en el uso de la instruccin Read con respecto a ReadLn es que en la primera, si se le dan mas datos de los que se introducirn se guardan en un buffer y se usarn en la siguiente instruccin Read o ReadLn del programa, en cambio ReadLn ignora todo dato posterior a los que esten definidos en la instruccin. En caso de que se le indique a Read o ReadLn que lea un tipo especfico de valor, y se le proporcione otro diferente se generar un error y se detendr la ejecucin del programa.

Tipos de datos
Un programa debe ser capaz de manejar diferentes tipo de datos, como pueden ser nmeros enteros, reales, caracteres, cadenas de caracteres, etc. Para lograr el manejo de toda esta informacin Turbo Pascal prove diferentes tipos de datos para los identificadores que se utilizarn. Algunos de los ms importantes se citan en seguida:

Tipos enteros
En esta categora Turbo Pascal cuenta con 5 tipos diferentes, cada uno abarca un rango especfico de valores y utilizan una diferente cantidad de memoria dependiendo de ese rango. Naturalmente el trabajar con rangos menores nos ofrece una mayor velocidad y menor espacio en memoria, pero si se utilizan enteros largos se cuenta con mayor presicin. Los tipos de enteros en Turbo Pascal son:

Tipo
Integer Word ShortInt Byte LongInt

Rango de valores que acepta


-32,768 a 32,767 0 a 65535 -128 a 127 0 a 255 -2,147,483,648 a 2,147,483,648

Al utilizar los tipos enteros es posible representar en el programa un nmero en formato hexadecimal, para hacer esto solo se le antepone el smbolo "$" al valor hexadecimal, al momento de visualizar dicho valor, o utilizarlo en alguna operacin ser como decimal. Por ejemplo: Cantidad := $10; El valor que se guarda en "Cantidad" es 16.

Tipos reales
Los nmeros reales son aquellos que cuentan con una parte decimal. En Turbo Pascal contamos con varios tipos de datos reales, pero no se puede utilizar, mas que el tipo real, en mquinas que no cuenten con un coprocesador matemtico. Los tipos de datos reales son:

Tipo

Rango de valores que acepta

Real 2.9E-39 a 1.7E38 Single 1.5E-45 a 3.4E38 Double 5.0E-324 a 1.7E308 Extended 1.9E-4851 a 1.1E4932 Comp -9.2E18 a 9.2E18 Los nmeros reales deben llevar por fuerza al menos un dgito de cada lado del punto decimal as sea ste un cero. Como ejemplo, el nmero 5 debe representarse como: 5.0, el .5 como 0.5 , etc. En este tipo de datos se utiliza la notacin cientfica, que es igual a la de las calculadoras, el dgito que se encuentra a continuacin de la E representa la potencia a la que se elevar el nmero 10 para multiplicarlo por la cantidad a la izquierda de dicha E: 3.0E5 = 3.0 * 10^5 = 3.0 * 100000 = 300000 1.5E-4 = 1.5 * 10^-4 = 1.5 * 0.0001 = 0.00015

Tipos caracter
Los caracteres son cada uno de los smbolos que forman el cdigo ASCII, el tipo estndar de Pascal para estos datos es Char. Los caracteres se especifican entre apostrofes: 'a'</TD 'B'</TD '2' '#' El tipo Char es un tipo ordinal de Pascal, sto quiere decir que sus elementos vlidos siguen una secuencia ordenada de valores individuales. La secuencia de caracteres para este tipo corresponden al nmero del cdigo ASCII, del 0 al 255. Es posible accesar a cada uno de los caracteres utilizando un signo # antes de su valor correspondiente, por ejemplo, la letra A puede ser representada como #65, el retorno de carro, o enter, se representa como #13, y as cualquier caracter.

Tipo cadena
Las cadenas son secuencias de caracteres o arreglos que tienen una longitud maxima de 255 caracteres. Se definen entre apostrofes. El tipo de Pascal para las cadenas es String. PROGRAM Cadena; VAR Nombre : String; BEGIN Nombre := 'Ernesto Chvez'; WriteLn (Nombre); END. Este programa guarda la cadena 'Ernesto Chvez' en la variable definida como tipo string, y la visualiza en la pantalla por medio de la instruccin WriteLn. El tamao por defecto para un tipo string es de 255 caracteres, pero es posible definir uno mas pequeo utilizando el siguiente formato: Variable : String[Tamao]; Donde Variable es la variable a definir y Tamao es el nmero maximo de caracteres que podr contener esa variable (naturalmente mayor a 0 y menor a 256). Es posible acceder a un solo caracter de una cadena utilizando inmediatamente despues del nombre de la misma la posicin del caracter encerrada entre corchetes. Por ejemplo: PROGRAM Cadena01; VAR Nombre : String[30]; {Permite un mximo de 30 caracteres en la variable} BEGIN Nombre := 'Ernesto Chvez'; WriteLn (Nombre[5]); {Visualiza el 5to caracter de la cadena} END.

Tipos lgicos
Este tipo de datos tienen la peculiaridad de que solo pueden tomar dos tipos de datos: verdadero o falso, el verdadero puede ser representado por su nombre en ingls: True y el falso por False; tambin se representan por 1 y por 0 respectivamente. El tipo est definido como Boolean.

Los datos lgicos tienen una enorme aplicacin en la evaluacin de ciertos procesos, as como en el control de flujo de los programas.

Operaciones Aritmticas Operaciones bsicas Operadores DIV y MOD (Enteros) Prioridad de operadores Constantes variables Uso de las constantes variables Constantes expresiones Uso de las expresiones como constantes

Operaciones bsicas
Las operaciones bsicas en Turbo Pascal estn formadas por dos partes: el operador y los operandos. Un operador es el smbolo que le indica al programa que operacin realizar y los operandos son los datos sobre los cuales se efectuar la operacin. Los operadores de Turbo Pascal son: Operador Operacin + Suma Resta * Multiplicacin / Divisin El tipo de datos que pascal regresa como resultado de una operacin depender del tipo de datos usados como operandos. Por ejemplo, la suma de dos enteros da como resultado otro entero, y la suma de dos nmeros reales da como resultado otro nmero real.

Operadores DIV y MOD


La divisin de dos nmeros, sin importar su tipo, dar como resultado un nmero real, as que para dividir dos enteros, y obtener el resultado como entero, Turbo Pascal ofrece el operador DIV, el cual da el resultado entero de una divisin entre enteros, y el operador MOD que regresa el residuo de una divisin de enteros. Su sintaxis es: entero := dividendo DIV divisor entero := dividendo MOD divisor El siguiente programa es un ejemplo del uso de los operadores aritmticos: PROGRAM Operaciones_Bsicas; VAR Suma, Resta, Multiplicacion, Division : Real; Cociente_Entero, Residuo_Entero : Integer; BEGIN Suma := 12 + 8; Resta := 12 - 8; Multiplicacion := 12 * 8; Division := 12/8; Cociente_Entero := 12 DIV 8; Residuo_Entero := 12 MOD 8; WriteLn ('La suma de 12 + 8 es igual a: ',Suma); WriteLn ('La resta de 12 - 8 es igual a: ',Resta); WriteLn ('La multiplicacin de 12 * 8 es igual a: ',Multiplicacion); WriteLn ('La divisin de 12 / 8 es igual a: ',Division); WriteLn ('La divisin entera de 12 / 8 es igual a: ',Cociente_Entero); WriteLn ('El residuo de la divisin entera de 12 / 8 es: ',Residuo_Entero); END.

Prioridad de operadores
Cuando se utilizan en alguna expresin mas de un operador, stos se evaluan conforme a una prioridad establecida por Turbo Pascal. Es necesario conocer el orden de evaluacin para evitar errores en nuestros programas. El orden en que se ejecutan las operaciones es el siguiente: *, /, DIV, MOD primeros en evaluarse, todos tienen igual prioridad. +, ltimos en evaluarse, ambos tienen igual prioridad. En caso de existir parentesis en la expresin se evaluar primero el contenido de los parentesis antes que otros operadores. Si existen dos operadores de igual prioridad se evaluar de izquierda a derecha. Para observar la importancia de la evaluacin correcta de los operadores se expone el siguiente ejemplo: PROGRAM Operadores;

VAR Resultado_Uno, Resultado_Dos : Real; BEGIN Resultado_Uno := 3 + 5 * 7; Resultado_Dos := (3 + 5) * 7; WriteLn ('El resultado de la operacin 3 + 5 * 7 es: ',Resultado_Uno); WriteLn ('El resultado de la operacin (3 + 5) * 7 es: ',Resultado_Dos); END. Como se podr observar en la primera operacin se ejecutar primero la operacin 5*7 y al resultado se le sumarn 3,en cambio,en la segunda operacin se realizar primero la suma 3+5 para multiplicarle al resultado 7.

Uso de las constantes variables


Cuando se declaran las variables en Turbo Pascal no se inicializan con algn valor en especial, sto quiere decir que una variable que no ha sido igualada a cierto valor llevar un contenido imprevisible, cosa no deseable en la mayora de los programas, para evitar resultados indeseables es posible asignarle a cada variable un valor "por defecto", que se guarde al iniciar el programa. Estas variables inicializadas son llamadas constantes variables, ya que se declaran en la seccin de constantes, pero es posible cambiar su valor. La sintaxis para su declaracin es la siguiente: Identificador : tipo_de_datos = valor; Ejemplo: PROGRAM Constantes_Variables; CONST Valor_Inicializado : Integer = 23; Texto_Inicializado : String = 'Buenos Dias!'; VAR Texto : String; Entero : Integer; BEGIN WriteLn ('Cadena inicializada: ',Texto_Inicializado); WriteLn ('Cadena sin inicializar: ',Texto); WriteLn ('Entero inicializado: ',Valor_Inicializado); WriteLn ('Entero sin inicializar: ',Entero); END.

Uso de las expresiones como constantes


Es posible declarar constantes con base en otras constantes ya declaradas en el programa utilizando alguna expresin para este fin, por ejemplo: CONST

Columnas = 80; Filas = 24; Total_de_espacios = Columnas * Filas; Solo es posible utilizar constantes en las expresiones de este tipo, si se usa alguna variable ocurrir un error al momento de compilar el programa.

Sentencias compuestas Sentencias compuestas Sentencias repetitivas Ciclos FOR Ciclos WHILE Ciclos REPEAT-UNTIL Bifurcaciones condicionales IF...THEN...ELSE IF anidados CASE Bifurcaciones incondicionales GOTO HALT

Sentencias compuestas
Las sentencias compuestas son grupos de sentencias, separadas cada una por un punto y coma ";" que son tratadas como una sola sentencia. Para identificar una sentencia compuesta de un grupo sucesivo de sentencias se encierran entre las palabras reservadas BEGIN y END. Uno de los ejemplos ms claros de una sentencia compuesta es el cuerpo de un programa principal en Turbo Pascal, el lenguaje toma todo lo que existe entre estas dos sentencias como un solo elemento a ejecutarse an cuando contenga varias instrucciones o sentencias: PROGRAM Prueba;

BEGIN WriteLn('Primera linea de una sentencia compuesta'); WriteLn('Segunda linea de una sentencia compuesta'); WriteLn('Tercera linea de una sentencia compuesta'); END. El punto y coma que se encuentra antes de la palabra reservada END puede ser suprimido sin afectar a la compilacin. En ocasiones es necesario repetir un determinado nmero de veces la ejecucin de una sentencia, ya sea sencilla o compuesta, para realizar esta tarea Turbo Pascal cuenta con instrucciones especficas para el tipo de repeticin que se requiera.

Ciclos FOR
El ciclo FOR repite una sentencia un determinado nmero de veces que se indica al momento de llamar al ciclo. Lo que hace FOR es que incrementa una variable en uno desde un valor inicial hasta un valor final ejecutando en cada incremento la sentencia que se quiere repetir. Su sintaxis es: FOR identificador := inicio TO fin DO instruccin; Donde el identificador es la variable que se incrementar, inicio es el primer valor que tendr dicha variable y fin es el valor hasta el cual se incrementar la misma; instruccin es la sentencia (sencilla o compuesta) que se ejecutar en cada incremento de la variable. El siguiente ejemplo escribe los nmeros del 1 al 50 en pantalla. La variable utilizada es "Numero". PROGRAM Ciclo_FOR; VAR Numero : Integer; BEGIN FOR Numero := 1 to 50 DO WriteLn(Numero); END. Una de las limitaciones de los ciclos FOR es que una vez iniciado el ciclo se ejecutar el nmero de veces predefinido sin posibilidad de agregar o eliminar ciclos. Es posible hacer que un ciclo cuente hacia atrs, es decir que la variable en lugar de incrementarse se decremente. Para sto cambiamos la palabra TO por DOWNTO, y colocamos el valor mayor a la izquierda y el menor a la derecha. Ejemplo: PROGRAM Ciclo_FOR_2; VAR Numero : Integer;

BEGIN FOR Numero := 50 DOWNTO 1 DO WriteLn(Numero); END.

Ciclos WHILE
Los ciclos WHILE ofrecen la ventaja de que la ejecucin se realiza mientras se cumpla una condicin, por lo tanto es posible controlar el nmero de repeticiones una vez iniciado el ciclo. Su sintaxis es: WHILE condicin DO instruccin Donde condicin es la condicin que se evaluar, mientras sta sea verdadera se ejecutar la instruccin, que es una sentencia simple o compuesta. Un programa que escriba los nmeros del 1 al 50, utilizando el ciclo WHILE se vera como sigue: PROGRAM Ciclo_WHILE; VAR Numero : Integer; BEGIN Numero := 1; WHILE Numero <= 50 DO BEGIN WriteLn (Numero); Numero := Numero +1; END; END. Al final del programa la variable Numero guardar el valor 51, que fu el valor que no cumpli con la condicin establecida en el ciclo WHILE.

Ciclos REPEAT-UNTIL
Este tipo de ciclos es muy parecido a los ciclos WHILE, la diferencia entre ambos es que en WHILE la condicin se evala al principio del ciclo, en cambio en REPEAT-UNTIL se evala al final, lo que significa que en un ciclo REPEATUNTIL la sentencia se ejecutar por lo menos una vez, cosa que puede no ocurrir en el ciclo WHILE. Ejemplo: PROGRAM Ciclo_RepeatUntil; VAR Numero : Integer; BEGIN Numero := 1; REPEAT WriteLn (Numero); Numero := Numero + 1; UNTIL Numero = 50;

END. Para crear un buen programa es necesario dotarlo con capacidad de desicin con base en las variables o eventos definidos por el programador, para que el programa sea aplicable en un entorno ms generalizado y no solo para un problema especfico. Para lograr este control se cuenta con las estructuras de control que, en Turbo Pascal, son las siguientes:

Sentencia IF...THEN...ELSE
Esta expresin es utilizada para ejecutar una sentencia en el caso que una condicin establecida sea verdadera, de lo contrario se podra ejecutar una sentencia distinta. Su sintaxis es: IF condicin THEN instruccin ELSE otro Donde condicin es la expresin que se evaluar, en caso de ser verdadera se ejecutar la sentencia dada como instruccin, en caso de que la condicin sea falsa se ejecutara la sentencia dada como otro. Ejemplo: PROGRAM IF_THEN_ELSE; VAR Contador : Integer; BEGIN FOR contador := 1 to 50 DO BEGIN IF contador > 10 THEN WriteLn(Contador) ELSE WriteLn('*'); END; END. En este pequeo programa la variable Contador se incrementar desde 1 hasta 50, la sentencia condicional IF verificar si es verdad que Contador es mayor a 10, de ser as se escribir en pantalla el valor de la variable, de lo contrario se escribira en la pantalla un caracter "*". Como el contador inicia desde 1, tenemos que se imprimiran 10 asteriscos antres del primer nmero, que ser el 11, valor que si cumple la condicin "Contador > 10" (la hace verdadera). La seccin ELSE con su correspondiente sentencia son opcionales y pueden omitirse en caso de no necesitarse.

Sentencias IF anidadas
Es posible utilizar en una expresin del tipo IF..THEN..ELSE una sentencia compuesta como la sentencia a ejecutarse en caso de que la condicin sea verdadera, as como en la sentencia posterior a un ELSE, de esta forma podemos utilizar otra sentencia IF..THEN..ELSE dentro de la anterior, para de esta forma evaluar varias condiciones una dentro de otra. Ejemplo: IF Numero > 5 THEN

BEGIN IF Numero < 10 THEN Opcion := Numero; IF Numero < 30 THEN Opcion2 := Numero; END;

Selecciones CASE
Esta forma de control se utiliza cuando se va a evaluar una expresin que puede contener varios datos diferentes y en cada dato deber realizar una accin especial. Por ejemplo, si se crea un men con diferentes opciones se realizar un determinado proceso para cada accin, aunque la seleccin por parte del usuario se haga desde el mismo lugar. El siguiente programa ilustra el uso de la forma CASE, el programa preguntar un nmero al usuario y lo clasificar de acuerdo a su valor. PROGRAM Case; VAR Numero : Integer; BEGIN WriteLn('Introduzca un nmero entero del 1 al 5: '); ReadLn(Numero); CASE Numero OF 1 : WriteLn('El nmero fu 1'); 2 : WriteLn('El nmero fu 2'); 3 : WriteLn('El nmero fu 3'); 4 : WriteLn('El nmero fu 4'); 5 : WriteLn('El nmero fu 5'); ELSE WriteLn('El nmero no estaba en el rango indicado'); END.

GOTO
La sentencia GOTO es una sentencia utilizada para alterar el flujo del programa, es decir, para ir a ejecutar una sentencia en un lugar diferente del programa y no la linea siguiente. El uso de GOTO no es aconsejable ya que destruye el modelo de la programacin estructurada que es la que se utiliza en Turbo Pascal, adems se cuenta con las estructuras de datos anteriores que hacen casi innecesario su uso. Para utilizar este tipo de salto es necesario declarar etiquetas, que no son otra cosa que el identificador que marcar el lugar a donde se dirigir el flujo del programa al momento de usar el GOTO. La declaracin de etiquetas se hace antes que la de constantes y variables, la palabra reservada para su declaracin es LABEL. El nombre de la etiqueta es un nombre de un identificador como cualquier otro, pero al utilizarse debe terminar con dos puntos ":". La sintaxis del comando es: GOTO etiqueta;

Ejemplo: PROGRAM Uso_del_GOTO; LABEL Etiqueta; BEGIN WriteLn('Esta linea si se escribir'); GOTO Etiqueta; WriteLn('Esta linea no se escribir'); Etiqueta: WriteLn('Se efectu el brinco'); END.

HALT
La instruccin HALT provoca la terminacin inmediata de un programa, sin importar las siguientes instrucciones. Normalmente se utiliza en casos de error, se despliega un mensaje y se termina el programa. Ejemplo: PROGRAM Uso_de_HALT; BEGIN WriteLn('Primera linea del programa'); WriteLn('Terminar la ejecucin del programa'); HALT WriteLn(''); END.

Procedimientos Definicin Creacin Uso de los procedimientos Variables locales y globales Paso de informacin entre procedimientos

Parmetros Funciones Definicin Uso de las funciones Procedimientos predefinidos en Turbo Pascal HALT y EXIT INC y DEC (incrementar y decrementar)

Definicin de procedimiento
Un procedimiento es un grupo de sentencias que realizan una tarea concreta. En lugar de reescribir el cdigo completo de esa tarea cada vez que se necesite, unicamente se hace una referencia al procedimiento. Por ejemplo, es muy comn que se quiera visualizar un ttulo determinado varias veces en un programa, para evitar teclear ese ttulo en nuestro programa fuente todas las veces que sea necesario creamos un procedimiento llamado "Titulo" que se encargar de escribirlo. Una vez creado un procedimiento actuar como una instruccin ms de Turbo Pascal, y para ejecutarlo unicamente teclearemos el nombre de dicho procedimiento. Para poder ejecutar un procedimiento es necesario declararlo en el programa que se este utilizando.

Creacin de los procedimientos


El primer paso para crear un procedimiento es saber que queremos que haga. Una vez definiendo este punto declaramos el procedimiento despues de haber declarado variables y constantes, antes del cuerpo del programa principal. La palabra reservada para su declaracin es Procedure seguida del nombre del procedimiento. Vamos a crear un procedimiento encargado de escribir en pantalla el enunciado "Programa de Turbo Pascal": PROCEDURE Titulo; BEGIN WriteLn ('Programa de Turbo Pascal'); END;

Uso de los procedimientos


Una vez declarado el procedimiento es posible utilizarlo como una instruccin de Turbo Pascal. Al uso de un procedimiento se le conoce como llamada al procedimiento.

El siguiente programa ilustra el uso o la llamada al procedimiento creado anteriormente: PROGRAM Procedimientos; PROCEDURE Titulo; BEGIN WriteLn ('Programa de Turbo Pascal'); END; BEGIN WriteLn ('Programa ejemplo del uso de procedimientos'); Titulo; {Llama al procedimiento} WriteLn; Titulo; {Vuelve a llamar al procedimiento} END;

Variables locales y globales


En Turbo Pascal cada identificador tiene un campo de accin, solo dentro de ste campo es posible utilizarlo. Los ejemplos ms claros son las variables, que pueden ser globales o locales. La diferencia estriba en que una variable global puede ser utilizada por cualquier parte del programa, incluyendo a todos los procedimientos, en cambio una variable local puede ser utilizada unicamente por el procedimiento en el que esta declarada, el programa principal y los otros procedimientos la toman como inexistente. Ejemplo: PROGRAM Variables; VAR Hola : String; PROCEDURE prueba; VAR Adios : String; BEGIN {En esta seccin si es posible usar la variable Hola} Adios := 'Adios, que les vaya bien'; WriteLn (Adios); END; BEGIN {En esta seccin no se reconoce a la variable Adios} Hola := 'Hola, bienvenidos al programa'; WriteLn (Hola); WriteLn (Adios);

{Al compilar el programa se generar un error ya que la variable Adios es inexistente en esta seccin, para eliminar el problema quites esta linea} prueba; END. Es posible darle el mismo nombre a una variable local y a una global en el mismo programa, pero entonces el procedimiento no podr utilizar la variable global ya que le da preferencia a las locales sobre las globales. Por ejemplo: PROGRAM Variables_2; VAR Saludo : String; PROCEDURE Mensaje; VAR Saludo : String; BEGIN Saludo := 'Este mensaje solo es vlido para el procedimiento "Mensaje"'; WriteLn('Saludo'); END; BEGIN Saludo := 'Primer saludo (Global)'; WriteLn (Saludo); Mensaje; WriteLn (Saludo); {Se escribir el mensaje "Primer saludo"} END.

Parmetros
Para poder pasar informacin entre el programa principal y procedimientos, o entre los mismos procedimientos usamos los parmetros, que son los canales de comunicacin de datos. Los parmetros son opcionales y si no se necesitan no se deben usar. Para utilizarlos es necesario declararlos son la siguiente sintaxis: PROCEDURE nombre (lista de parmetros); La lista de parmetros esta compuesta de los nombres de los mismos y del tipo de datos que representan, los del mismo tipo se separan con comas "," y cada tipo diferente se separa con punto y coma ";". Ejemplo: Procedure Ejemplo(a, b : Integer; c, d : String); Para llamar a un procedimiento que utiliza parmetros se pueden utilizar como tales otras variables o constantes, siempre y cuando sean del mismo tipo que los declarados. Ejemplo: Ejemplo(1, 2, 'Hola', 'Adios'); Ejemplo de un programa con procedimiento que utiliza un parmetro. PROGRAM Parametros; VAR

Saludo : String; PROCEDURE Imprime_5 (a : String); VAR Contador : Integer; BEGIN FOR contador := 1 to 5 DO {Imprime 5 veces la cadena almacenada } WriteLn(a); {en la variable "a", que es la informacin} END; {que llega como parmetro } BEGIN Saludo := 'Bienvenidos al programa'; Imprime_5 (Saludo); {llama al procedimiento Imprime_5, usando como} {parmetro la variable Saludo } Imprime_5 ('Fin'); {Utiliza la cadena "fin" como parmetro } END. Es vlido crear un procedimiento que llame a otro procedimiento siempre y cuando el procedimiento llamado haya sido declarado antes del que lo usar.

Definicin de las funciones


Las funciones son, al igual que los procedimientos, un conjunto de sentencias que se ejecutan constantemente, la diferencia entre stas y los procedimientos es que las funciones regresan un valor. La declaracin de las funciones se realiza de la siguiente forma: FUNCTION nombre(parmetros) : tipo_de_datos; A continuacin se escribe el contenido de la funcin como una sentencia normal (sencilla o compuesta), normalmente terminando con la igualacin de la funcin al valor que regresar. Ejemplo: FUNCTION Promedio (a, b : Real) : Real; {Promedio de dos nmeros reales} BEGIN Promedio := (a + b) / 2; END;

Uso de las funciones


Como las funciones devuelven un valor especfico la forma ms usual de utilizarlas es por medio de asignaciones de una variable a la funcin. Ejemplo: PROGRAM Funciones; VAR X, Y, Z : Real;

FUNCTION Promedio (a, b : Real) : Real; {Promedio de dos nmeros reales} BEGIN Promedio := (a + b) / 2; END; BEGIN X := 5.89; Y := 9.23; Z := Promedio (X, Y); {Iguala Z al valor devuelto por la funcin Promedio} WriteLn('El promedio de ',X,' y ',Y,' es: ',Z); END.

Procedimieto HALT
El procedimiento HALT ya se habia revisado anteriormente, pero se tom como una instruccin, siendo que es realmente un procedimiento predefinido de Turbo Pascal que nos permite terminar nuestro programa en cualquier punto del mismo. El procedimiento EXIT provoca la salida del procedimiento que se est ejecutando y nos regresa al lugar de donde fue llamado.

Procedimientos INC y DEC


El procedimiento INC incrementa en 1 el contenido de cualquier variable de tipo entero, es lo mismo en un programa teclear: Variable := Variable + 1; o telcear: Inc(Variable); El procedimiento DEC decrementa en 1 el valor de cualquier variable de tipo entero que se le indique, se usa igual que INC: DEC (Variable);

Funciones estndar de Turbo Pascal Truncamiento y redondeo

Exponenciales y logaritmicas Aritmticas Trigonomtricas Nmeros aleatorios

Truncamiento y redondeo
La funcin Round (nmero) redondea un nmero real al entero ms cercano y devuelve el resultado como un nmero real. La funcin Trunc (nmero) elimina la parte decimal del nmero real y devuelve el resultado como tipo entero. Ejemplo: PROGRAM Redondeo; VAR Entero : Integer; ValorReal1, ValorReal2 : Real; BEGIN ValorReal1 := 123.435; ValorReal2 := Round(ValorReal1); Entero := Trunc (ValorReal1); WriteLn('El resultado de la funcin Round sobre el valor'); WriteLn(ValorReal1, ' es: ','ValorReal2, ' (Nmero real)'); WriteLn('El resultado de la funcin Trunc sobre el valor'); WriteLn(ValorReal1, ' es: ', Entero, ' (Nmero entero)'); END.

Funciones exponenciales y logartmicas


La funcin Sqr devuelve el cuadrado del valor utilizado como parmetro. Sqrt regresa la raz cuadrada del valor dado como parmetro, el resultado siempre es real aunque se utilice un nmero de tipo entero como argumento. Ejemplo: PROGRAM Exponentes; VAR Dato, Cuadrado : Integer; Raiz : Real; BEGIN Dato := 45; Cuadrado := Sqr(Dato); Raiz := Sqrt(Dato); WriteLn(' El cuadrado de ',Dato, ' es: ',Cuadrado); WriteLn('La raz cuadrada de ',Dato,' es: ',Raiz); END.

Las funciones Exp y Ln tratan con logaritmos naturales o neperianos. Exp devuelve la funcion exponencial e^x y Ln devuelve el logaritmo natural de x. El resultado en ambos siempre es del tipo real. Es posible crear una funcin con base en estas dos para calcular el resultado de un nmero x elevado a una potencia n, la cual nos quedara as: FUNCTION Potencia(x,n:Real):Real; BEGIN Potencia := Exp(n *Ln(x)) END; El uso de esta funcin en un programa podra ser: PROGRAM Potenciacion; FUNCTION Potencia(x, n : Real) : Real; BEGIN Potencia := Exp(n * Ln(x)) END; BEGIN WriteLn('El resultado de 5 elevado a 3 es: ',Potencia(5,3)); END.

Funciones aritmticas
Abs regresa el valor absluto del identificador que se le pase como parmetro. El valor que devuelve ser del mismo tipo que el argumento. Abs(-24) {Regresa el valor 24} La funcin Int devuelve la parte entera de un valor real, como tipo real. La funcin Frac regresa la parte decimal de un valor real, tambin como valor real.

Funciones trigonomtricas
Las funciones trigonometricas definidas en Turbo Pascal son: Sin(valor), Cos(valor) y Arctan(valor), todas las demas pueden definirse desde estas: Tan(x) Sin(x) / Cos(x) Cot(x) Cos(x) / Sin(x) Sec(x) 1 / Cos(x) Csc(x) 1 / Sin(x) Las funciones para utilizarlas son: FUNCTION Tan(x : Real) : Real; BEGIN Tan := Sin(x) / Cos(x) END; FUNCTION Cot(x : Real) : Real; BEGIN Cot := Cos(x) / Sin(x) END; FUNCTION Sec(x : Real) : Real; BEGIN

Sec := 1 / Cos(x) END; FUNCTION Csc(x : Real) : Real; BEGIN Csc := 1 / Sin(x) END;

Generacin de nmeros aleatorios


Para generar nmeros aleatorios Turbo Pascal cuenta con la funcin Random y el procedimiento Randomize. La funcin Random genera un nmero aleatorio de tipo real comprendido entre 0 y 1, en cambio la funcin Random (x) genera un entero aleatorio entre 0 y x. Sin embargo el uso de la funcin Random es en ocasiones insuficiente por si sola para la generacin de valores aleatorios ya que los nmeros son realmente pseudoaleatorios, y cada vez que se ejecute el programa se obtendran los mismos valores. Para evitar esto debemos utilizar en todo programa que utilice valores aleatorios el procedimiento Randomize, que inicializa el generador de nmeros aleatorios, en otras palabras, asegura que los nmeros que obtendr sern diferentes cada vez que se ejecute el programa. Es recomendable usar este procedimiento antes de cada funcin random del programa. Ejemplo de un programa generador de nmeros aleatorios: PROGRAM Nums_Aleatorios; VAR x : Integer; BEGIN Randomize WriteLn('Lista de nmeros aleatorios'); For x := 1 to 20 do WriteLn(Random); END.

Operaciones bsicas con cadenas Comparacin de cadenas

Manejo de los elementos de la cadena Unin de cadenas Operador + Funcin Concat Procedimientos y funciones para el manejo de cadenas Pos Copy Insert Delete UpCase Str Val Las cadenas de caracteres son secuencias de caracteres con longitudes que varan desde 1 hasta los 255 caracteres. El tipo identificador de las cadenas es String. Cuando declaramos una variable de tipo string ser posible introducir hasta 255 caracteres en ella, pero tambin es factible declarar cadenas ms cortas agregando al momento de la declaracin la longitud de la variable, por ejemplo: VAR Mensaje : String[120]; {Longitud maxima = 120 caracteres}

Comparacin de cadenas
La comparacin de cadenas es una operacin muy comn en Turbo Pascal; estas comparaciones se realizan con base en el orden del cdigo ASCII, por ejemplo la cadena 'Prueba' es menor a la cadena 'prueba' ya que el valor del cdigo ASCII de P es 80 y el de p es 112. As tambin podemos diferenciar las cadenas con respecto a su tamao: 'Hola' es menor a 'Bienvenido' Existe un caso especial de una cadena, que es cuando no tiene ningn caracter en ella, en ese momento decimos que es una cadena nula o vaca. Se recomienda ampliamente inicializar todos los valores de las cadenas a cadenas nulas al inicio del programa, ya que podran contener datos extraos e indeseables.

Manejo de los elementos de la cadena


Es posible leer cada elemento de una cadena por separado, por ejemplo, si en la variable Calle almacenamos la cadena 'Hidalgo' es posible asignar a otra cadena el valor de Calle[x] donde x es el caracter de la cadena que se quiere leer, as tambin

es posible visualizar el caracter en pantalla usando la instruccin WriteLn. Ejemplo: PROGRAM Caracter; VAR Calle : String; Letra : String; BEGIN Calle := 'Hidalgo'; WriteLn(Calle[2]); {Visualiza el segundo caracter de Calle} Letra := Calle[1]; {Guarda en Letra el primer caracter de Calle} WriteLn(Caracter) END. Para conocer la longitud de una cadena utilizamos la funcin Length, la longitud es la cantidad de caracteres que contiene la cadena en un momento determinado. Su sintaxis es: Length (cadena); La funcin regresa un valor entero. PROGRAM Funcion_Length; VAR Cadena : String; BEGIN Cadena := 'Prueba de longitud'; WriteLn ('Longitud de la cadena: ', Length (Cadena)); END. El programa imprime en la pantalla un mensaje con la longitud de la cadena almacenada en memoria, en este caso especfico 18. En ocasiones es necesario combinar dos o ms cadenas de caracteres en una sola, para lograr sto utilizamos los siguientes mtodos.

Operador +
Es una de las formas ms sencillas de unir dos cadenas y se maneja exactamente como una suma, la nica limitante es que en caso de ser mayor la longitud resultante de la suma que la longitud que pueda manejar la variable en que se almacenar se truncarn los caracteres sobrantes. Ejemplo: Cadena1 := 'Buenos '; Cadena2 := 'dias '; Cadena3 := Cadena1 + Cadena2; WriteLn (Cadena3); Se imprimir en la pantalla: 'Buenos dias'. (Notese que este ejemplo es solo una seccin del programa, para ejecutarlo es necesario completar la estructura).

Funcin Concat
La funcin concat produce los mismos resultados que la concatenacin, es posible incluir cualquier nmero de cadenas que se necesiten concatenar.

La suma de las cadenas no deber sobrepasar la longitud que la variable, a la cual se asignar dicha suma, puede manejar. Ejemplo: Cadena := Concat (Cad1, cad2, cad3);

Pos
Laa funcin Pos nos sirve para localizar una determinada cadena dentro de otra, en otras palabras para verificar si una cadena es subcadena de otra segunda. Los parmetros que requiere son: la cadena que se buscar y la cadena donde se buscar la primera: Pos (Cadena1, Cadena2); Cuando encuentra la cadena la funcin devuelve su posicin inicial, en caso de que no la encuentre devuelve el valor de 0. Ejemplo: Cadena := 'Domingo Lunes Martes Miercoles Jueves Viernes Sabado'; WriteLn(Cadena); WriteLn(Pos('Lunes', Cadena)); {Muestra 9} WriteLn(Pos('Jueves', Cadena)); {Muestra 32} WriteLn(Pos('Ayer', Cadena)); {Muestra 0}

Copy
La funcin copy regresa una subcadena de una variable o constante dada como parmetro. Su sintaxis es: Copy (Cadena, Inicio, Cantidad); Donde Cadena es la fuente de la subcadena, Inicio es la posicin desde la cual se obtendr la subcadena y Cantidad es el nmero de caracteres que se extraern. Los valores de Inicio y Cantidad deben ser de tipo entero. Ejemplo: Cadena := "Nuevos horizontes"; WriteLn (Copy(Cadena, 8, 10)); {Visualiza: horizontes}

Insert
El procedimiento Insert sirve para insertar una cadena dentro de otra en alguna posicin determinada. Sintaxis: Insert (Cadena1, Cadena2, Posicin) Donde Cadena1 es la que se insertar, Cadena2 es donde se insertar y Posicin es el lugar donde se insertar. El parmetro Posicin debe ser de tipo entero.

Delete
Este procedimiento elimina un determinado nmero de caracteres de una cadena. Su sintaxis es: Delete (Cadena, Inicio, Nmero) Cadena es la variable en la cual se eliminarn los caracteres, Inicio es la posicin del primer caracter a eliminar y Nmero es la cantidad de caracteres que se borrarn.

UpCase
La funcin UpCase regresa la letra mayuscula correspondiente al caracter dado como parmetro. Es muy comn trabajando con cadenas que se quiera convertir una que contiene un nmero a su valor numrico, para poder utilizarlo en operaciones matemticas, as como convertir un nmero a su equivalente en una cadena. Esto es ms fcil de entender si consideramos que no es lo mismo el valor 75 y el valor '75', en el primer caso es un nmero mientras que en el segundo es un par de caracteres ASCII. Para lograr estos cambios de tipo en Turbo Pascal utilizamos los procedimientos siguientes:

Str
El procedimiento Str obtiene una cadena a partir de un valor numrico. Su sintaxis es: Str(Valor, Cadena) Donde valor es el nmero a convertir y Cadena es la variable donde se almacenar la cadena ya convertida.

Val
Este procedimiento convierte una cadena en un valor de tipo numrico, el problema con esta funcin es que si la cadena no esta formada exclusivamente de nmeros siguiendo las reglas para el tipo de datos que se vallan a obtener se generar un error. Sintaxis: Val (Cad, Num, Cdigo) Cadena contiene la cadena que ser procesada, Num es la variable de tipo numrico donde se guardar el valor de la cadena y Cdigo es una variable de tipo entero (Integer) que contendr el valor de 0 si no hubo errores y un valor diferente en caso de que no se haya podido convertir la cadena, el valor de Cdigo representa la posicin de la cadena donde ocurrio el error.

Concepto de unidad Concepto de unidad La declaracin USES

Creacin de unidades Estructura de las unidades Creacin de una unidad Compilacin de la unidad Utilizacin de las unidades Uso de las unidades

Concepto de unidad
Las unidades son grupos de funciones o procedimientos compilados que pueden ser llamados y utilizados desde cualquier programa en Turbo Pascal sin necesidad de escribirlos de nuevo. Las unidades no son ejecutables por si solas, dependen del programa que las llama para poder realizar su funcin. Turbo Pascal incorpora algunas unidades que contienen una gran cantidad de rutinas integradas, pero para hacer uso de ellas es necesario primero declarar el uso de tales unidades.

La declaracin USES
Para declarar una unidad, o lo que es lo mismo, dejarla lista para ser utilizada, se utiliza la palabra reservada USES que debe ir inmediatamente despues de la sentencia PROGRAM, despues se escriben los nombres de las unidades que se utilizarn. Las unidades estndar de turbo pascal son: Crt Dos Graph Overlay Printer System

Estructura de las unidades


Las unidades estan compuestas por cuatro partes: Declaracin Es obligatoria, provee el nombre de la unidad que se crear. Su suntaxis es: UNIT nombre_de_la_unidad; Ejemplo:

UNIT prueba; Interfaz Esta seccin se declara con la palabra INTERFACE, en esta seccin se encuentran las declaraciones de todos los elementos que pueden ser utilizados por el programa que llama a la unidad, por ejemplo otras unidades, variables, constantes, procedimientos y funciones. En esta seccin no se incluyen los cdigos de los procedimientos ni funciones, unicamente su declaracin. Ejemplo: INTERFACE USES Crt, Dos; VAR Numero : Integer; CONST Columnas = 10; PROCEDURE Colocar(Cad1 : String; X, Y : Integer); Implementacin La seccin de implementacin es exclusiva para la unidad que se est creando, contiene declaraciones de etiquetas, variables, constantes, as como el contenido de los procedimientos y funciones declarados en la seccin de interfaz. La palabra usada para declarar esta parte es IMPLEMENTATION. Ejemplo: IMPLEMENTATION USES Crt; PROCEDURE Colocar(Cad1 : String; X, Y : Integer); BEGIN GotoXY(X,Y); Write(Cad1); END; Inicializacin Esta seccin se utiliza para inicializar los valores de las variables, no es indispensable y por lo mismo no siempre se incluye. Su sintaxis es parecida a la del cuerpo principal de un programa, se inicia con BEGIN y termina con un END.

Creacin de una unidad


La creacin de una unidad propia se realiza utilizando las partes de la citadas anteriormente. Su creacin se realiza en la misma forma que la de un programa. Un ejemplo de una unidad es: UNIT Prueba; INTERFACE PROCEDURE Centrar(Cad1 : String; renglon : Integer); IMPLEMENTATION

USES Crt; VAR C : Integer; PROCEDURE Centrar(Cad1 : String; renglon : Integer); BEGIN C := (80 - Length(Cad1)) DIV 2 GotoXY (C,renglon); Write(Cad1); END; BEGIN END.

Compilacin de la unidad
Para compilar una unidad y dejarla lista para su utilizacin en programas posteriores se utiliza la opcin Compile en el men del mismo nombre. Es necesario verificar que en la opcin Destination, del mismo men, est activado el almacenamiento del cdigo al disco (Disk) y no a memoria, de lo contrario la unidad unicamente se podr utilizar durante esa sesin y no en las sesiones posteriores porque se eliminar de la memoria al momento de salir del entorno integrado de desarrollo. La secuencia de teclas [ALT] + [F9] tambin compilan la unidad as como los programas dependiendo del caso.

Uso de las unidades


Una vez compilada una unidad se puede incorporar al programa agregando la sentencia USES de la que se haba hablado al principio, ya declaradas las unidades que se utilizarn se puede hacer uso de todos los procedimientos y funciones incluidas como si estuvieran escritas en el mismo programa.

Archivos de acceso secuencial Declaracin de un archivo Abrir archivos Escribir datos en un archivo Leer datos de un archivo

Fin del archivo Cerrar archivos Funcin Eoln Agregar datos a un archivo de texto Archivos de acceso directo Estructura del archivo Declaracin de un archivo Asignacin de un archivo Abrir archivos Registro actual y tamao de un archivo Posicionamiento en el interior de un archivo Lectura y escritura de archivos Cerrar un archivo

Archivos de acceso secuencial


Los archivos de acceso secuencial son llamados tambin archivos de texto, estn formados por cadenas de caracteres separadas unas de otras por los cdigos retorno de carro/avance de lnea, que corresponden a los caracteres 13/10 del cdigo ASCII. El final del archivo se indica mediante el caracter ASCII 26, que tambin se expresa como ^Z o EOF. Es posible visualizar estos archivos con la orden TYPE del sistema operativo DOS y se pueden editar con cualquier editor de textos. Este tipo de archivos solo permiten operaciones de lectura y escritura secuenciales, la unica forma de modificarlos es agregando lneas al final del archivo. Los pasos para leer o escribir en un archivo de este tipo son: Declarar una variable de tipo texto y asociarla al nombre de un archivo. A esto tambin se le llama declarar el archivo. Abrir el archivo ya sea para lectura o escritura. Leer o escribir datos en el archivo. Cerrar el archivo

Declaracin de un archivo
Para declarar un archivo primero se declara una variable tipo text de la siguiente forma: VAR VarArchivo : Text; Una vez declarada la variable se asigna al nombre de algun archivo: ASSIGN (VarArchivo, NombreArchivo); Donde NombreArchivo es una cadena de caracteres que contiene el nombre del archivo, la unidad de disco donde se encuentra y el directorio. Por ejemplo: ASSIGN (VarArchivo, 'C:\DOS\PRUEBA.TXT');

Abrir archivos
Exsiten tres formas de abrir un archivo: Rewrite Reset Append

Escribir datos en un archivo


Para escribir datos a un archivo se utilizan las instrucciones Write y WriteLn, como si se quisiera escribir a la pantalla, con la diferencia de que se especificar la variable de archivo ya declarada. Ejemplo: WriteLn(VarArchivo, 'Prueba de archivos'); Esta sentencia grabara el texto 'Prueba de archivos' en el archivo asignado a VarArchivo.

Leer datos de un archivo


Para leer los datos de un archivo de acceso secuencial se utilizan las instrucciones Read y ReadLn. La instruccin Read lee uno o varios datos del archivo abierto y deja el puntero en el mismo rengln en el cual ley los datos, en cambio ReadLn lee los datos y mueve el puntero al siguiente rengln.

Fin del archivo


Normalmente los archivos de este tipo se leen rengln por rengln hasta llegar al final del mismo. Cuando se conoce de antemano el tamao del archivo es posible utilizar un ciclo FOR, pero es ms seguro utilizar la funcin EOF la cual es verdadera despues de que el programa lee la ltima linea de un archivo de acceso secuencial. La sintaxis de la funcin EOF es: EOF (VaribleArchivo); Es comn realizar la verificacin de la funcin con un ciclo WHILE como en el ejemplo siguiente: WHILE NOT EOF(Archivo) DO BEGIN ReadLn(Archivo, Datos);

WriteLn(Datos); END;

Cerrar archivos
Para asegurar que toda la informacin se grabe en el disco correctamente es necesario cerrar el archivo antes de que se termine la ejecucin del programa, de lo contrario se corre el riego de que la ltima informacin que se haya accesado no se grabe en su totalidad. La instruccin para cerrar un archivo es Close, y su sintaxis es: Close (VaribleArchivo);

Funcin Eoln
La funcin Eoln sirve para verificar si el puntero ha llegado al final de la linea. Regresa el valor verdadero si se encuentra al final. Comunmente se utiliza en las lecturas caracter por caracter.

Agregar datos a un archivo de texto


Para aadir datos a un archivo de texto son necesarios los siguientes pasos: Asignar un archivo a una variable con Assign Agregar los datos con el procedimiento Append Escribir los datos Cerrar el archivo A continuacin se ilustra un ejemplo de un programa que agrega una linea a un archivo de texto: PROGRAM Archivo; VAR Texto : TEXT; BEGIN Assign (Texto, 'PRUEBA.DAT'); Append(Texto); WriteLn(Texto, 'Agregando una linea al archivo PRUEBA.DAT'); Close (Texto) END.

Archivos de acceso directo


Un archivo de acceso directo esta formado por un conjunto de partes individuales que pertenecen al mismo tipo de datos. Cada uno de los componentes del archivo es llamado registro. Cada uno de los componentes de este tipo de archivos es accesible directamente. Los archivos de acceso directo son tambin llamados archivos con tipos o tipeados.

Estructura del archivo


A diferencia de los archivos secuenciales, los archivos tipeados no estan compuestos de lineas de caracteres, sino que se acomodan en registros con estructuras fijas. La longitud de los registros esta determinada por la cantidad de bytes que se necesitan para almacenar el tipo de datos que contendr el registro. Por ejemplo, si se van a almacenar nmeros enteros en un archivo, cada registro servir para un nmero especfico y ocupar 2 bytes, el siguiente registro utilizar los dos bytes siguientes del archivo y as sucesivamente hasta completar la cantidad de datos que se vayan a almacenar. Este tipo de archivos no pueden ser visualizados con la instruccin type del sistema operativo debido al formato utilizado para guardarlos.

Declaracin de un archivo
Para declarar un archivo de acceso directo se realiza con las palabras reservadas FILE OF, su sintaxis es la siguiente: VariableArchivo : FILE OF TipoElementos; Esta declaracin se realiza en la seccin correspondiente a la declaracin de las variables. Ejemplo: PROGRAM Archivo_Tipeado; VAR Archivo : FILE OF Integer; BEGIN END. Normalmente no se desea crear archivos que puedan almacenar un solo tipo de datos ya que se requeririan varios archivos, por ejemplo para alguna base de datos: uno para los nombres, otro para apellidos, otro para la edad, etc. Para evitar este inconveniente es posible usar registros del tipo RECORD, que permiten grabar en un solo registro un grupo de datos que pueden ser de diferentes tipos, uno de tipo INTEGER, uno de tipo STRING, etc. Los registros del tipo record deben ser declarados antes de las variables en una seccin llamada TYPE con el siguiente formato: TYPE Nombre_Reg = RECORD Campo_del_registro_1 : Tipo; Campo_del_registro_2 : Tipo; ... Campo_del_registro_n : Tipo; END;

Donde Nombre_Reg es el nombre del registro que se utilizar, Campo_del_Registro_x son las variables que estarn contenidas en el registro y Tipo es el tipo de cada una de las variables del registro. La seccin TYPE se escribe antes de la declaracin de las variables. Como ejemplo, si se quiere crear un archivo el que se guarden el nombre, domicilio, edad y estado civil de un grupo de personas el primer paso a realizar es crear un registro que contenga todos estos campos: TYPE Datos = RECORD Nombre : String[40]; Domicilio : String[60]; Edad : Integer; EdoCivil : String[10]; END; El siguiente paso es declarar un archivo del tipo Datos as como una variable del mismo tipo de los que se utilizarn en el archivo: VAR Archivo : FILE OF Datos; Persona : Datos;

Asignacin de un archivo
An cuando se tenga declarado el archivo no es posible grabar nada en l si no se le asigna un nombre real para guardarlo en el disco. El proceso de dicha asignacin es el mismo que para los archivos de texto: Assign (Archivo, 'Nombre.ext'); Nombre.txt puede ser una constante, una variable o estar escrita directamente en el programa. Naturalmente debe cumplir con todas las reglas para nombrar un archivo.

Abrir archivos
Una vez declarado un archivo ya es posible abrirlo. En caso de querer abrir un archivo nuevo se utiliza la instruccin Rewrite, o si el archivo ya existe en el disco se abre con el procedimiento Reset. No existe ninguna diferencia entre la apertura de un archivo de acceso directo para su lectura o para su escritura.

Si al utilizar el procedimiento Rewrite el archivo asignado ya exista se eliminar del disco y se crear uno nuevo, por lo mismo se debe tener ciudado al momento de abrir estos archivos.

Registro actual y tamao de un archivo


La funcin FileSize regresa el tamao de un archivo, o mejor dicho devuelve el nmero de registros contenidos en ste. Al momento de abrir un archivo nuevo la funcin FileSize regresa el valor de 0, lo que significa que el archivo no tiene datos guardados en l.

Posicionamiento en el interior de un archivo


Cada uno de los registros de un archivo esta referenciado por un nmero especfico comenzando desde el registro 0 y aumentando de 1 en 1. La funcin FilePos devuelve el nmero de registro actual, su sintaxis es: FilePos (VariableArchivo) VariableArchivo es la variable a la cual se asign un nombre de archivo en el disco. Para moverse a un registro determinado se utiliza la funcin Seek, con la siguiente sintaxis: Seek (VariableArchivo, NumRegistro); Para moverse al final del archivo para agregar un nuevo registro se utiliza este mismo comando con el parametro NumRegistro como sigue: Seek (VariableArchivo, FileSize(VariableArchivo)); Cuando se avanza en un archivo registro por registro se utiliza la funcin EOF para determinar si ya se lleg al final del archivo.

Lectura y escritura de archivos


Para la lectura y escritura en un archivo de acceso directo unicamente se utilizan los procedimientos Read y Write. Despues de cada operacion de lectura o escritura el puntero se posiciona en el siguiente registro. Para estar seguros de que se leera el registro que se desea se debe emplear el procedimiento seek antes de cualquier procedimiento de lectura o escritura.

Cerrar un archivo
Para cerrar los archivos abiertos se procede igual que en uno de acceso secuencial, utilizando el procedimiento close: Close (VariableArchivo);

Constantes predefinidas Modo de pantalla Colores Variables predefinidas CheckBreak DirectVideo LastMode TextAttr WindMin WindMax Procedimientos predefinidos ClrEol ClrScr Delay DelLine GotoXY HighVideo InsLine LowVideo NormVideo NoSound Sound TextBackground TextColor

TextMode Window Funciones predefinidas KeyPressed ReadKey WhereX WhereY

Modo de Pantalla
Las constantes definidas de Turbo Pascal para indicar el modo de pantalla que se utilizar son: Constante Valor Modo de video BW40 0 40x25 Blanco y negro en tarjeta de color CO40 1 40x25 Color BW80 2 80x25 Blanco y negro en tarjeta de color CO80 3 80x25 Color Mono 7 80x25 Monocromtico

Colores
Las constantes definidas para los colores son: Colores para Colores para primer plano: Constante Valor Color Constante ValorColor Black 0 Negro Dark gray 8 Gris oscuro Blue 1 Azul Light Blue 9 Azul claro Green 2 Verde Light Green 10 Verde claro Cyan 3 Cyan Light Cyan 11 Cyan claro Red 4 Rojo Light Red 12 Rojo claro Magenta 5 Magenta Light Magenta 13 Magenta claro Brown 6 Marrn Yellow 14 Amarillo Light Gray 7 Gris claro White 15 Blanco Parpadeo Blink 128 La unidad CRT provee un conjunto de variables utilizadas para modificar aspectos referentes a entradas de teclado, modo de la pantalla, etc. A continuacin se listan las principales con su funcin especfica.

CheckBreak
Tipo : boolean. Cuando el contenido de esta variable es True se encuentra activada la terminacin de un programa por medio de las teclas Crtl-Break. Si se cambia su valor a False se desactiva esta opcin. Su valor por defecto es True.

DirectVideo
Tipo : boolean. Cuando existen problemas de entrada/salida de texto se debe desactivar esta variable (guardar en ella el valor false) que inhibe la escritura directa de caracteres a la memoria de video.

LastMode
Tipo : Word La variable LastMode contiene el valor del modo de texto actual. Se inicializa al momento de iniciar el programa y se utiliza comunmente para restaurar el modo original al momento de terminar el programa.

TextAttr
Tipo : Byte Usualmente se utiliza para cambiar los atributos de colores en la pantalla, es ms rpido que los procedimientos TextColor y TextBackground que tienen la misma funcin.

WindMin
Tipo : Word; Esta variable contiene las coordenadas de la esquina superior izquierda de la ventana de texto activa definida por el procedimiento Window.

WindMax
Esta variable contiene las coordenadas de la esquina inferior derecha de la ventana de texto activa definida por el procedimiento Window. A continuacin se listan algunos de los procedimientos que incluye esta unidad con una breve descripcin de cada uno.

ClrEol
Sintaxis: ClrEol; Este procedimiento borra todos los caracteres de la linea actual desde la posicin del cursor hasta el final de la linea. Ejemplo: PROGRAM Proc_ClrEol; USES Crt; VAR x,y : Integer; BEGIN

FOR x := 1 TO 24 DO FOR y := 1 TO 80 DO Write('#'); GotoXY(15,15); ClrEol; END.

ClrScr
Sintaxis: ClrScr; Se utiliza para borrar la pantalla completa o la ventana actual y situa el cursor en la esquina superior izquierda. Ejemplo: PROGRAM LimpiarPantalla; USES Crt; VAR x,y : Integer; Prb : String; BEGIN FOR x := 1 TO 24 DO FOR y := 1 TO 80 DO Write('#'); WriteLn('Presione [ENTER] para borrar la pantalla'); ReadLn(Prb); ClrScr; WriteLn('Se borr la pantalla'); END.

Delay
Sintaxis: Delay(Tmp : Word); Detiene la ejecucin del programa durante un tiempo especificado en Tmp en milisegundos. El intervalo vlido es desde 0 hasta 65535, la precisin del retardo depende de la precisin del reloj interno de la computadora. Ejemplo: PROGRAM Retardo; USES Crt; BEGIN WriteLn('Inicia retardo de aproximadamente 5 segundos'); Delay(5000); WriteLn('Fin del retardo'); END.

DelLine
Sintaxis: DelLine;

Borra la linea donde se encuentra el cursor y las lineas inferiores suben una posicin. Ejemplo PROGRAM BorrarLinea; USES Crt; VAR x : Integer; prb : String; BEGIN ClrScr; For x := 1 to 20 DO WriteLn('Linea nmero: ', x); WriteLn('Presione [ENTER] para borrar la linea 6'); GotoXY(0,6); DelLine; WriteLn('Linea 6 eliminada'); END.

GotoXY
Sintaxis: GotoXY(x, y : Byte); Posiciona el cursor en las coordenadas especificadas por x y y. El byte x representa la columna partiendo de izquierda a derecha y el byte y representa la fila partiendo de arriba hacia abajo. Ejemplo: PROGRAM Posicin; USES Crt; BEGIN GotoXY(10,10); Write('*'); GotoXY(20,20); Write('*'); END.

HighVideo
Sintaxis: HighVideo; Activa la pantalla de video de alta intensidad.

InsLine
Sintaxis: InsLine Inserta una linea en blanco en la posicin actual del cursor.

LowVideo
Sintaxis: LowVideo

Activa la pantalla de video de baja intensidad.

NormVideo
Sintaxis: NormVideo; Restaura los atributos de primer plano y fondo a los colores originales establecidos cuando arranc el programa.

NoSound
Sintaxis: NoSound; Desactiva el sonido iniciado con el procedimiento Sound.

Sound
Sintaxis: Sound (Frecuencia : Word); Genera un sonido en la bocina de la computadora a una frecuencia determinada por el valor de Frecuencia. Para detener el sonido es necesario ejecutar el procedimiento NoSound.

TextBackground
Sintaxis: TextBackGround (Color : byte); Se utiliza para seleccionar el color del fondo de la pantalla. Los valores que puede utilizar son del 0 al 7, tambin es posible utilizar las constantes predefinidas para los colores.

TextColor
Sintaxis: TextColor (Color : Byte); El procedimiento TextColor se usa para seleccionar el color del texto en la pantalla.

TextMode
Sintaxis: TextMode (Modo : Word); Define el modo de video, sto es, el nmero de filas y columnas que se podrn mostrar en pantalla, tambin si se mostrarn en blanco y negro o en color. Los modos vlidos de pantalla de texto son: Constante Valor Modo de video BW40 0 40x25 Blanco y negro en tarjeta de color CO40 1 40x25 Color BW80 2 80x25 Blanco y negro en tarjeta de color CO80 3 80x25 Color

Mono Sintaxis:

80x25 Monocromtico

Window
Window (x1, y1, x2, y2 : Byte); Define las coordenadas de la ventana de texto activa; x1 y y1 son las coordenadas de la esquina superior izquierda, x2 y y2 son las coordenadas de la esquina inferior derecha. Las siguientes son las funciones de la unidad CRT:

KeyPressed
Tipo: Boolean La funcin KeyPressed devuelve el valor de True si se puls alguna tecla y false si no se ha presionado ninguna.

ReadKey
Tipo: Char Esta funcin lee un caracter del teclado, se utiliza mucho para leer teclas de direccin, teclas de control y de funciones.

WhereX
Tipo: Byte WhereX devuelve el nmero de la columna donde se encuentra el cursor.

WhereY
Tipo: Byte La funcin WhereY devuelve el nmero de la fila donde se encuentra el cursor al momento de llamar a la funcioacute;n.

PASCAL GRAFICO

OBJETIVO DEL MODULO: - Dar a conocer las diferencias de las unidades Graph y Crt, as como los usos de coordenadas de las dos unidades; y tambin saber las constantes de los diferentes colores para colorear pantallas. INDICE

1.1 Graficas lineales en modo texto 1.2 Modos graficos 1.3 Colores 1.4 Sistemas de coordenadas 1.5 Texto en modo grafico 1.6 Auto evaluacin TARJETAS 1.1 GRAFICAS LINEALES EN MODO TEXTO: En este modo los programas trabajarn con la unidad Crt, Dos o cualquier otra unidad que no sea modo grfico, o sea, la unidad GRAPH. En el modo texto la pantalla consta de 25 renglones de 40 u 80 caracteres cada uno. La pantalla se dividir en renglones y columnas. Los renglones se enumeran del 1 al 80, donde la columna 1 esta en la parte superior izquierda y la columna 80 en el extremo derecho. Cada punto se identifica con una pareja de nmeros, que indica el rengln y la columna. Para colocar el cursor en la columna x y el rengln y, se usa la instruccin gotoxy (x,y) donde la x y la y que se encuentran dentro del parntesis significan una coordenada de la pantalla, es decir, el rengln y la columna. se pueden escribir caracteres del cdigo ASCII y as poder hacer lneas y grficas en modo texto. Programa Ejemplo: Program ModoTexto; Uses Crt; Var x : integer; Procedure presentacion; begin gotoxy (25,2); write(' UNIVERSIDAD DE GUADALAJARA '); gotoxy (1,3); for x:=1 to 80 do write(chr(205)); readln end; Procedure letras; begin gotoxy(1,10); write('PERSONAS'); gotoxy(45,23); write('MES'); end; Procedure Lineas; Var a,b : integer; begin for b := 10 to 22 do begin gotoxy(9,b); write(chr(179)); end; gotoxy(9,22); write(chr(192)); For a := 10 to 50 do begin gotoxy(a,22); write(chr(196)); end; end; Begin presentacion; letras; lineas;

end. Volver al indice 1.2 MODOS GRAFICOS: COMO INICIALIZAR Y FINALIZAR UN PROGRAMA DE GRAFICOS EN PASCAL? Al igual que un programa de PASCAL, se tiene que especificar el tipo de unidad que utilizaremos, en este caso es GRAPH, ya que estamos haciendo un programa en PASCAL. Despus se inicializan los controles grficos, esto se hace especificando el tipo de adaptador y el modo grfico y despus llamando a InitGraph que es el que preparar el Hardware para los grficos, y se indicar dnde debe encontrar el archivo .BGI que es el que contiene el adaptador de grficos, esta informacin es necesaria para dibujar correctamente un grfico. Despus de llamar a InitGraph, el programa llama a GraphResult, una funcin que devuelve un cdigo de estado. Si el cdigo no es igual a grOK, se sabe que se ha producido un error (grOK es una constante definida en la unidad GRAPH y tiene el valor cero). A continuacin viene el cdigo del programa, es aqu donde pondremos las instrucciones para realizar los grficos que se desean y finalizaremos con CloseGraph que devuelve el Hardware al modo en que se encontraba antes de entrar en modo grfico. Ejemplo: Program Ejemplo; Uses CRT, GRAPH; Var DrvGraph,ModoGraph : Integer; Begin DrvGraph := Detect; InitGraph(DrvGraph,ModoGraph, 'k:\apps\tp\bgi'); SetLineStyle(dottedLn,0,ThickWidth); Rectangle(280,150,40,30); Delay (5000); CloseGraph; End. USES GRAPH Esta unidad de PASCAL es bastante compleja ya que contiene ms de 50 procedimientos y ms de 20 funciones, muchas constantes, variables y tipos de datos. Se incluye controladores para los adaptadores de grficos ms importantes y fuentes para dibujar una gran cantidad de estilos de caracteres. La pantalla de grficos est formada por pixels ordenados en lneas horizontales y verticales. Esto es vlido para todos los modos grficos de la computadora; la diferencia esta en el tamao del pixel. Por ejemplo: CGA: los pixels son bastante grandes, por lo que solo caben 320 horizontalmente y 200 verticalmente. (320 x 200). VGA: los pixels son pequeos y caben 640 horizontalmente y 480 verticalmente. (640 x 480).Cuanto mas pequeo es el pixel, existen mas pixels por imagen y es mejor su calidad de imagen (monitor). Mayor resolucin.Todos los PC, XT, o AT estan equipadas por algunos tipos de tarjetas de video. Las tarjetas muy bsicas, las tiene el adaptador monocromatico (MDA), que soporta texto solamente. Si este fuere el caso no se puede programar para usar grficos. El primer paso hacia adelante fu la tarjeta adaptadora CGA (Color Graphics Adapter), aunque la alta resolucin y amplias opciones que provee el MCGA (Monochrome Graphics Adapters) y el EGA (Enhaned Graphics Adapter) son mayores y vinieron despus. Pero los ms avanzados grficos en capacidad son las aplicaciones CAD, las AT&T 400 y VGA (Video Graphics Array), PC-3270 y IBM-8514, adaptadores de video todos ofrecen una alta resolucin. En PASCAL, soporta grficos para todos esos tipos es proveido por seis interfaces grficas (.BGI) unidades (ATT, CGA, EGAVGA, HERC, IBM8514, y cuatro tipos de letras (GOTH.CHR, LITT.CHR, SANS.CHR y TRIP.CHR). A continuacin se observa en la tabla las tarjetas de adaptador de video, los modos de video con sus tamaos de pantalla por columnas y renglones y los colores que utiliza cada uno: TARJETAS MODOS COLORES

tarjeta

resolucin

colores

CGA CGA0 CGA1 CGA2

320*200 320*200 320*200

VerdeClaro, RojoClaro, Amarillo. CyanClaro, MagentaClaro, Blanco. Verde, Rojo, Caf.

CGA3 CGAHi MCGA MCGAC0 MCGAC1 MCGAC2 MCGAC3 MCGAMed MCGAHi EGA EGALO EGAHi EGA64LO EGA64Hi EGAMonoMi HERC HERCMonoHi ATT400 ATT400C0 ATT400C1 ATT400C2 ATT400C3 ATT400Med ATT400Hi VGA VGALO VGAMed VGAHi IBM8514 IBM8514LO IBM8514Hi PC3270 PC3270Hi Volver al indice

320*200 640*200 320*200 320*200 320*200 320*200 640*200 640*480 640*200 640*350 640*200 640*350 640*350 720*348 320*200 320*200 320*200 320*200 640*200 640*200 640*200 640*350 640*480 640*480 1024*768 720*350

Cyan, Magenta, Gris Claro. Monocromtico. VerdeClaro, RojoClaro, Amarillo. CyanClaro, MagentaClaro, Blanco. Verde, Rojo, Caf. Cyan, Magenta, Gris Claro. Monocromtico. Monocromtico. 16 colores. 16 colores. 16 colores. 4 colores. 2 colores. Monocromtico. VerdeClaro, RojoClaro, Amarillo. CyanClaro, MagentaClaro, Blanco. Verde, Rojo,Caf. Cyan, Magenta, Gris Claro. Monocromtico. Monocromtico. 16 colores. 16 colores. 16 colores. 256 colores. 256 colores. Monocromtico.

1.3 COLORES: En modos CGA, MCGA y ATT400 la seleccin de colores esta limitada a cuatro colores predefinidos que incluye a C0, C1, C2 y C3. Con una alta resolucin, algunas tarjetas de grficos ofrecen 16 colores; otras ofrecen dos o cuatro colores, pero la seleccin de los colores es independiente de la paleta predefinida. En cuanto a modos IBM8514, su paleta de colores es de 256 colores con una posible seleccin de 262,144 sombras. Es por eso que en este tema se tratarn los colores y selecciones de colores en modos EGA/VGA y despus, con CGA y sistemas monocromticos. En sistemas monocromticos, las salidas y entradas de grficos estan limitadas por dos bits de informacin por pixel: uno de video on/off y otro de intensidad de bit. En sistemas CGA, el sistema de color RGBI(Red, Green, Blue, e Intensidad) son usados con cuatro bits de informacion por pixel, pero las combinaciones son limitadas solo a cuatro. El color de fondo es negro, pero puede ser seleccionado por el rango entero de 16 colores. En Sistemas EGA/VGA el sistema de color RrGgBb usa seis bits de infomacin por pixel para un total de 64 colores. Existe la funcin GetMaxColor que regresa el valor mximo del color. Esto es vlido tanto para alta y baja resolucin , por ejemplo en un modo de baja resolucin GetMaxColor regresa el valor de 3, uno menos que el nmero de colores en la paleta predefinida. En alta resolucin el valor regresado ser 15 y en el monocromtico no regresa valores. Depende del comando que se ponga colorear una regin ya sea el fondo, el contorno o se rellenado de figuras. Para colorear se utilizar SetColor, esta instruccin establece el color hasta que se le indique que lo cambie. Se colocar la instruccin y entre parntesis se pondr el nombre del color deseado o la constante del color. Para colorear el fondo se utilizar el enunciado SetBkColor y se utilizar igual que el anterior. Existen ms procedimientos para colorear y entre ellas se encuentra FillPoly que crea y rellena una regin poligonal; la sintaxis para este procedimiento es primero el nmero de vrtices y despus van las coordenadas del los vrtices del polgono Con el procedimiento GetPalette que devuelve informacin sobre las capacidades de color del modo y controlador de grficos actual, ste toma un slo prametro que es PaletteType, que esta definida ya por una estructura de PASCAL y es: Const

Maxcolors = 15; Type PaletteType = Record Size : Byte; Colors : Array [0..Maxcolors] of ShortInt; End; Para regresar al color que se tena en primer plano se utiliza la funcin GetColor. En baja resolucin usando el color de la paleta, el valor regresado ser el nmero de la paleta y no el valor del color actual. En alta resolucin (16 colores) el valor regresado corresponde al valor del color a menos que SetPalette y SetAllPalete esten usando o cambiando los valores de la paleta. En PASCAL, para sistemas EGA/VGA se puede escoger los colores mediante las siguientes constantes o los nombres: Nombre Const. Color

Black Blue Green Cyan Red Magenta Brown LightGray DarkGray LightBlue LightGreen LightCyan LightRed LightMagenta Yellow White Volver al indice

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

Negro Azul Verde Azulcianuro Rojo Magenta Cafe Gris Claro Gris Obscuro Azul claro Verde claro Azul cianuro claro Rojo claro Magenta claro Amarillo Blanco

1.4 SISTEMAS DE COORDENADAS: En los modos grficos las coordenadas son reemplazadas por las coordenadas de pixeles, dependiendo del hardware dependen las coordenadas, si son las pantallas de alta o baja resolucin depender las coordenadas, y se ajustarn las operaciones a esos lmites por ejemplo: en el modo EGAHi ser de de 640*350. Cada pixel queda determinado por una pareja de coordenadas (x,y), donde x es el nmero de la columna y y es el nmero de rengln. Los renglones y columnas se numeran a partir de 0 y no de 1 como en el modo texto. En el modo grfico CGA, los renglones se numeran de 0 a 199 y las columnas de 0 a 319. En el modo grfico CGA de alta resolucin, los renglones se numeran de 0 a 199 y las columnas de 0 a 639. Las coordenadas en el modo grfico se determinan primero con la columna, o sea, la coordenada x. Existen muchas variedades de resoluciones de pantallas, pero existe el uso de funciones en PASCAL como GetMaxX y GetMaxY que determinan el tamao de la pantalla, ajustando las operaciones subsecuentes dentro de los lmites de la pantalla. Las funciones GetMaxX y GetMaxY regresa el mximo eje x y y de las coordenadas de la pantalla en el modo grfico actual. Por ejemplo, en el modo EGAHI, GetMaxX regresa 639 (0..639) y GetMaxY regresa 349 (0..349). En el modo grfico, el cursor no est visible. En su lugar se mantiene un apuntador en el ltimo punto considerado, que se llama apuntador activo. Para saber la posicin del apuntador activo, mediante las funciones GetX y GetY. que regresan las coordenadas x y y del apuntador activo, respectivamente. Es decir, GetX y GetY regresan la posicin actual en las coordenadas de los pixeles horizontales y verticales. Las funcines GetY, GetViewSettings, MoveRel y MoveTo contienen informacin similar usada en el modo texto con WhereX y WhereY. La funcin Moveto mueve la posicin actual, con las coordenadas especificadas, en el modo texto esta funcin es equivalente a la funcin GotoXY.

Volver al indice 1.5 TEXTO EN MODO GRAFICO: La unidad GRAPH contiene cinco fuentes: una fuente de mapa de bits y cuatro fuentes de "trazo". Para seleccionar una fuente se utiliza el procedimiento SetTextStyle, que toma tres parmetros. El primero puede ser uno de los siguientes:

PRIMER PARAMETRO
Comando Tipo

DefaultFont Tipo Normal TriplexFont Tipo Triple SmallFont Tipo Pequea SansSerifFont Tipo GothicFont Tipo Gtico El segundo parmetro es la direccin en la que se va a escribir el texto. La direccin del texto es horizontal, pero puede ser vertical. Existen dos direcciones, son definidas en GRAPHICS.H y son: 0 para horizontal 1 para vertical. Y como tercer parmetro es el tamao de las letras: es 1 para la fuente y 4 para las fuentes trazadas, pero estos se pueden aumentar hasta diez veces su tamao normal. En grficas se requiere mucha presicin. La proposicin SetTextJustify dice en donde se debe colocar el carcter en relacin a un pixel. SetTextJustify toma dos parmetros, Horiz y Vert. El primero tiene como opciones: CONSTANTE NOMBRE Comando Alineado

LeftText a la izquierda CenterText centrado RightText a la derecha Las opciones de Vert son: CONSTANTE NOMBRE Comando Alineado

BottomText abajo CenterText centrado TopText arriba. Una vez que se ha seleccionado una fuente, se puede mostrar texto con el procedimieto OutTextXY, que muestra una cadena comenzando en las coordenadas que se le pasan como parmetros o tambin con OutText con la diferencia de que ste exhibe el texto dado en la posicin del apuntador activo y el otro se utiliza para exhibir el texto en un lugar determinado. PROGRAMA FINAL DEL MODULO: program pcxx; uses crt,graph,dos; PROCEDURE INICIAR_GRAFICOS; VAR MONITOR,MODO,ERROR:INTEGER; BEGIN MONITOR:=DETECT; INITGRAPH(MONITOR,MODO,' '); ERROR:=GRAPHRESULT;

IF ERROR<>GROK THEN BEGIN WRITELN('ERROR EN GRAFICOS ');DELAY(3000); HALT; END; CLEARDEVICE; END; Procedure SetRGBPalette(Col,R,G,B:byte); Var Regs:registers; begin Fillchar(Regs,sizeof(Regs),0); Regs.AX:=$1010; Regs.BX:=col; Regs.Dh:=R; Regs.Ch:=G; Regs.Cl:=B; Intr ($10,Regs); end; Procedure Graba_Pcx(xmin,ymin,xmax,ymax:integer;nombre:string); type maping=arraY[0..15,1..3] of byte; pcxinit=record manufactura,version,codigofin,bitsporpixel:byte; xmin,ymin,xmax,ymax,hres,vres:integer; mapacolor:maping; reservado,nplanes:byte; bytesporlinea,typopaleta:integer; sheet:array[1..58] of byte; end; const Colors:maping= ( (0,0,0),(0,0,2),(0,2,0), (0,2,2),(2,0,0),(2,0,2), (2,2,0),(2,2,2),(1,1,1), (1,1,3),(1,3,1),(1,3,3), (3,1,1),(3,1,3),(3,3,1), (3,3,3) ); Var archi1:file of pcxinit; archi:file of byte; Hdr:pcxinit; punto,contador,l:byte; i,j,k,x,y:integer; Function Lee_color(var x,y:integer):byte; var co:byte; begin if y<=ymax then co:=Getpixel(x,y); inc(x); if x>xmax then begin x:=xmin; inc(y) end; Lee_color:=co end; Function Lee_byte:byte; var l:byte; begin l:=Lee_color(x,y); l:=l mod 16; l:=Lee_color(x,y)+(16*l); Lee_byte:=l

end; Begin Hdr.manufactura:=10; Hdr.version:=5; Hdr.codigofin:=1; Hdr.bitsporpixel:=4; Hdr.hres:=26; Hdr.vres:=26; Hdr.reservado:=0; Hdr.nplanes:=1; if odd(xmax-xmin+1) then Hdr.bytesporlinea:=(xmax-xmin+1) div 2 else Hdr.bytesporlinea:=((xmax-xmin+1) div 2)+1; Hdr.typopaleta:=0; for i:=0 to 15 do for j:=1 to 3 do Hdr.mapacolor[i,j]:=Colors[i,j]*85; Hdr.xmin:=xmin; Hdr.xmax:=xmax; Hdr.ymin:=ymin; Hdr.ymax:=ymax; {$i-} assign(archi1,nombre); rewrite(archi1); write(archi1,Hdr); close(archi1); {$i+} assign(archi,nombre); reset(archi); seek(archi,128); x:=xmin; y:=ymin; contador:=1; l:=Lee_byte; punto:=Lee_byte; repeat While (l=punto) and (contador<63) do begin inc(contador); punto:=Lee_byte end; if ((contador=1) and (l<192)) then write(archi,l) else begin contador:=contador+192; write(archi,contador); write(archi,l); end; l:=punto; contador:=1; punto:=Lee_byte; Until (y>ymax); close(archi); {$i+} end; Procedure Lee_Pcx_16(nombre:string); {$r-}{$v-} type plano=^tplano; tplano=array[0..38399] of byte; maping=Array[0..15,1..3] of byte; pcxinit=record manufactura,version,codigofin,bitsporpixel:byte; xmin,ymin,xmax,ymax,hires,vres:integer;

mapacolor:maping; reservado,nplanes:byte; bytesporlinea,typopaleta:integer; sheet:array[1..58] of byte; end; p:Array[0..5] of word; archi1:file of pcxinit; archi:file of byte; Hdr:pcxinit; punto,contador,l,npl:byte; i,j,k,x,y:integer; xmax,ymax,xmin,ymin,bpl:integer; plane,color:word; count,cuantos:longint; plano0,plano1,plano2,plano3:plano; Procedure Configura_Paleta(Colors:maping); var i:byte; Begin for i:=0 to 5 do SetRgbPalette(i,Colors[i,1] div 4,Colors[i,2] div 4,Colors[i,3] div 4); for i:=6 to 15 do begin SetRgbPalette(21+i,Colors[i,1] div 4,Colors[i,2] div 4,Colors[i,3] div 4); SetPalette(i,21+i); end; end; Procedure Pon_Punto(var x,y:integer;co:byte); begin if y<=ymax then Putpixel(x,y,co); inc(x); if x>xmax then begin x:=xmin; inc(y) end; end; Begin {$i-} assign(archi1,nombre); reset(archi1); read(archi1,Hdr); close(archi1); {$i+} {$i-} xmin:=Hdr.xmin; ymin:=Hdr.ymin; xmax:=Hdr.xmax; ymax:=Hdr.ymax; assign(archi,nombre); reset(archi); seek(archi,128); { Configura_Paleta(Hdr.mapacolor);} x:=0; y:=0; case Hdr.bitsporpixel of 4: begin repeat contador:=1; read(archi,l); if (l and $c0)=$c0 then begin contador:=l and $3f; Var

read(archi,punto) end else punto:=l; for i:=1 to contador do begin pon_punto(x,y,punto div 16); pon_punto(x,y,punto mod 16) end; until (Eof(Archi)) or (y>=ymax); end; 1:begin new(plano0); new(plano1); new(plano2); new(plano3); count:=0;plane:=0; bpl:=Hdr.bytesporlinea; npl:=Hdr.nplanes; cuantos:=bpl* npl*(1+ymax-ymin); for i:=0 to 3 do p[i]:=0; repeat contador:=1; read(archi,l); if (l and $c0)=$c0 then begin contador:=l and $3f; read(archi,punto) end else punto:=l; for i:=1 to contador do begin while (p[plane]>=38399) do inc(plane); case plane of 0: plano0^[p[0]]:=punto; 1: plano1^[p[1]]:=punto; 2: plano2^[p[2]]:=punto; 3: plano3^[p[3]]:=punto; end; inc(p[plane]); if (p[plane] mod bpl)=(bpl-1) then begin if plane=3 then inc(y); plane:=(plane+1) mod npl; end; end; count:=count+contador; until (Eof(Archi)) or (plane>3) or (count=cuantos); cleardevice; for y:=0 to ymax do for x:=24 to xmax-20 do begin color:=(plano0^[(bpl*y)+(x div 8)] shr (7-(x mod 8))) and 1 ; color:=color+2*((plano1^[bpl*y+(x div 8)] shr (7-(x mod 8))) and 1); color:=color+4*((plano2^[bpl*y+(x div 8)] shr (7-(x mod 8))) and 1); color:=color+8*((plano3^[bpl*y+(x div 8)] shr (7-(x mod 8))) and 1); putpixel(x,y,color); end; dispose(plano0);dispose(plano1);dispose(plano2);dispose(plano3); End; End; close(archi); {$i+}

end; Begin iniciar_graficos; readln; Lee_Pcx_16('b:velero.pcx'); SETCOLOR(0); {CIRCLE(100,100,40); SETFILLSTYLE(1,14); FLOODFILL(100,100,0); SETCOLOR(0); LINE(0,450,150,450);} {SETFILLSTYLE(1,LIGHTCYAN); FLOODFILL(200,100,0);} readln; end. Volver al indice AUTOEVALUCION: 1. Diga la diferencia entre las unidades Graph y Crt. 2. Si se desea hacer unas grficas en modo texto que unidad se utilizar? Y en modo grfico? 3. Dependiendo de qu se mejora la calidad de imagen de la pantalla? 4. Qu es pixel? 5. Se marcan las coordenadas igual en modo texto que en modo grfico? Por qu? 6. Hacer un programa que contenga: a) Se divida la pantalla en tres partes con lneas en modo texto. b) En la primera parte que aparesca el abecedario en tamao normal, pero con tipo de letra gtica. c) En la segunda parte que aparescan los nmeros del 0 al 9, de color rojo y de tamao mediano. d) Y en la tercera parte que aparesca el nombre del curso de color azl con un tipo de letra Sanserif y el tamao grande.

OBJETIVO DEL MODULO: - Ser capaz al final del modulo de hacer lneas, crculos y rectngulos ya sea con comandos de PASCAL as como por medio de algoritmos utilizando las ecuaciones matemticas necesarias. - Y adems hacer grficas de barras y de sectores con colores y patrones para su presentacin. INDICE 2.1 Trazos de recta 2.2 Lineas rectagunlos y circunferencias 2.3 Dibujo de grficas de barras y sectores 2.4 Rellenado de regiones en pantalla 2.5 Auto evaluacin 2.1 TRAZO DE RECTAS: Se puede dibujar lneas mediante un algoritmo basado en la ecuacin algebraica de una recta: Y = (m*x) + b donde m es la pendiente y b es la ordenada al origen. Y es la ordenada en el origen cuando x vale cero. RECTAS HORIZONTALES Y VERTICALES: Las rectas ms fciles de dibujar son las horizontales y las verticales. Las coordenadas en pantalla se obtienen manteniendo constante el valor de Y e incrementando X. En el caso de rectas verticales, el valor de X queda fijo y el valor de Y vara.

Ejemplo de una lnea horizontal: Program LineaHoriz; uses Crt, Graph; var xi,xf,x,y : integer; Gd, Gm : Integer; begin Gd := Detect; InitGraph(Gd, Gm, 'k:\apps\tp\bgi'); if GraphResult <> grOk then Halt(1); xi:=10; xf:=100; y:=250; For x:= xi to xf do putpixel (x,y,15); delay(5000); end. Ejemplo de una lnea Vertical: Program LineaVer; uses Crt, Graph; var yi,yf,x,y : integer; Gd, Gm : Integer; begin Gd := Detect; InitGraph(Gd, Gm, 'k:\apps\tp\bgi'); if GraphResult <> grOk then Halt(1); yi:=10; yf:=100; x:=250; For y:= yi to yf do putpixel (x,y,15); delay(5000); end. RECTAS DIAGONALES: Para trazar un recta inclinada o diagonal se necesita incrementar los valores tanto de X como los de Y a partir de los pixels de inicio y fin. La pendiente se define como el cambio en los valores de Y dividido entre el cambio de los valores de X. Este es un ejemplo de un programa que hace una lnea con ecuaciones y no con las funciones ya establecidas por PASCAL. Program Linea; Uses Graph, Crt; var x1,y1, x2,y2, i:integer; Procedure Iniciar; var gD : Integer; gM : Integer; ErrCode : Integer; begin gD := Detect; InitGraph(gD,gM,'k:\apps\tp\bgi'); ErrCode := GraphResult; if ErrCode <> grOk then Halt(1); End;

Begin Iniciar; i:=0; x1:=50; y1:=50; x2:=100; y2:= 100; PutPixel(x1,y1,15); PutPixel(x2,y2,15); while (x1+i < x2) do Begin PutPixel(x1+i,y1+i,15); i:=i+1; End; readln; CloseGraph;

End.

Volver al indice 2.2 LINEAS, RECTANGULOS Y CIRCUNFERENCIAS: LINEAS: Line traza un lnea entre dos puntos dados. El valor del apuntador activo no se modifica con este comando. Line dibuja una lnea desde x1, y1 a x2, y2. Line(x1,y1,x2,y2) A continuacin un breve ejemplo: Program Linea; uses Crt, Graph; var Gd, Gm : Integer; begin Gd := Detect; InitGraph(Gd, Gm, 'k:\apps\tp\bgi'); if GraphResult <> grOk then Halt(1); Randomize; repeat Line (Random(200), Random(200), Random(200), Random(200)); until KeyPressed; ReadLn; CloseGraph; end. La proposicin LineTo si cambia el apuntador activo al punto dado. LineTo dibuja una lnea desde la posicin actual a la posicin x, y. LineTo(x,y) Ejemplo de LineTo: Program Linea; uses Crt, Graph; var Gd, Gm : Integer; begin Gd := Detect; InitGraph(Gd, Gm, ''); if GraphResult <> grOk then Halt(1); Randomize; repeat LineTo(Random(200),Random(200)); until KeyPressed; ReadLn; CloseGraph; end. La proposicin LineRel traza una lnea del apuntador activo a un punto especificado por un movimiento relativo determinado. El apuntador activo cambia al punto dado. Dibuja una lnea desde la posicin actual a un punto

determinado mediante Dx y Dy. Por ejemplo, si la posicin actual es 1, 2, la orden LineRel(100,100) dibujar una lnea desde 1, 2 a 101, 102. LineRel(Dx,Dy) Ejemplo de LineRel: Program Linea; uses Graph; var Gd, Gm : Integer; begin Gd := Detect; InitGraph(Gd, Gm, 'k:\apps\tp\bgi'); if GraphResult <> grOk then Halt(1); MoveTo(1,2); LineRel(100, 100); ReadLn; CloseGraph; end. ESTILOS DE LINEA: Los estilos y espesores de las lneas se establecen mediante el procedimiento SetLineStyle, que tiene tres parmetros. El primero se refiere al estilo y existen cuatro estilos de lnea predefinidos y uno que el usuario define: Comando Dibuja

SolidLn Una lnea continua DottedLn Una lnea punteada CenterLn Una lnea centrada DashedLn Una lnea intermitente UserBitLn el usuario define el estilo de la lnea El segundo se refiere al patrn y esta muy ligado con el anterior. El tercero es el grosor de la lnea y existen dos espesores ya definidos : Comando Espesor

NormWidth normal ThickWidth Grueso Para usar este procedimiento se pone primero SetLineStyle y sus parmetros y a continuacin la figura que se quiera cambiar su estilo de lnea. RECTANGULOS: La funcin del rectngulo dibuja un cuadro o rectngulo definido por la coordenada de la esquina y se pasan como parmetros. Para trazar rectngulos se utiliza el procedimiento rectangle y tiene la siguiente sintaxis: Rectangle(x1, y1, x2, y2) Dibuja un rectngulo con la esquina superior izquierda en x1, y1 y la esquina inferior derecha en x2, y2. La proposicin rectangle realiza el trazo con el color, estilo y espesor de lnea activos. En el siguiente ejemplo se muestra un programa para hacer un rectngulo: Program Rectangulo; Uses CRT, GRAPH; Var Gd, Gm : Integer; begin Gd := Detect; InitGraph(Gd, Gm, ''); if GraphResult <> grOk then Halt(1); Rectangle(280,150,40,30);

Delay (5000); CloseGraph; End. CIRCULOS: Los crculos son las curvas ms utilizadas en las gficas y las ms elementales. Para trazar circulos se puede utilizar un procedimiento ya establecido en PASCAL Circle, este tiene tres parmetros . Los dos primeros forman un par de coordenadas que determinan el centro del crculo, mientras que el tercer parmetro es el radio del crculo en pixels horizontales. Ejemplo: Program circulo; (* Ejemplo de Circle *) uses Graph; var Gd, Gm: Integer; Radius: Integer; begin Gd := Detect; InitGraph(Gd, Gm, 'k:\apps\tp\bgi'); if GraphResult <> grOk then Halt(1); for Radius := 1 to 5 do Circle(100, 100, Radius*10); ReadLn; CloseGraph; end. Adems de el procedimiento ya definido por PASCAL se tienen diferentes algoritmos que pueden crear un crculos, se explicarn a continuacin algunos. 1. Conociendo la ecuacin del crculo, se especifica el centro del circulo (xc,yc) y de su radio r, la ecuacin ms comn es: (x-xc)2 + (y-yc)2 = r2 Y puede variar de acuerdo a la necesidad y los datos que tengamos.

A continuacin un ejemplo:
Program circulo_ecuacion; Uses Graph, crt; Var xc, yc, radio : integer; Procedure iniciar; Var Gd, Gm : Integer; begin Gd := Detect; InitGraph(Gd, Gm, 'k:\apps\tp\bgi'); if GraphResult <> grOk then Halt(1); end; Procedure circulo (xc, yc, radio : integer); Const fi = 1.33; Var dtheta, ct,st,x,y,xtemp : real; Begin iniciar; radio:=20; dtheta := 1/radio; ct:=cos(dtheta); st:=sin(dtheta); x:=0; xc:=150; yc:=150; y:=radio; while y >= x do begin putpixel(round(xc+x),round(yc+y*fi),15); putpixel(round(xc-x),round(yc+y*fi),15); putpixel(round(xc+x),round(yc-y*fi),15);

putpixel(round(xc-x),round(yc-y*fi),15); putpixel(round(xc+y),round(yc+y*fi),15); putpixel(round(xc-y),round(yc+y*fi),15); putpixel(round(xc+y),round(yc-y*fi),15); putpixel(round(xc-y),round(yc-y*fi),15); xtemp:=x; x:=(x*ct-y*st); y:=(y*ct+xtemp*st)

end; end; Begin Circulo(xc,yc,radio); readln; closegraph; end. 2. Tambin se puede representar polarmente: x = xc + r cos(Q) y = yc + r sen(Q) Donde Q se mide en radianes desde 0 hasta 2p. Ya que la longitud del arco es igual a r * Q y r, el radio, son constantes, los incrementos iguales de Q, dQ, dan por resultado un espaciamiento entre los puntos graficados. 3. Tambin puede trazarse un crculo por medio de numerosos segmentos de recta. Estableciendo el nmero de segmentos igual a una cantidad costante de veces el radio, los crculos grandes se vern perfectos al igual que los chicos. Cuando se aumente el valor de la constante multiplicadora, se ver el crculo ms perfecto. Ejemplo: Program Rect_Circulo; Uses Graph,Crt; Var xc,yc,radio : real; Procedure Iniciar; var Gd,Gm:Integer; begin Gd := Detect; InitGraph(Gd, Gm, 'k:\apps\tp\bgi'); if GraphResult <> grOk then Halt(1); end; Procedure Trazar_Circ(xc,yc,radio:real); Const dos_Pi = 6.28318; fi = 1.33; Var dtheta,ct,st,x:real; y,xtemp:real; cont:integer; Begin radio:=50; xc:=300; yc:=250; dtheta:=dos_Pi/21*radio; ct:=cos(dtheta); st:=sin(dtheta); x:=0; y:=radio; moveto(round(xc+x),round(yc+y*fi)); for cont:= 1 to round(591*radio) do begin xtemp:=x; x:=(x*ct-y*st); y:=(y*ct+xtemp*st); putpixel(round(xc+x),round(yc+y*fi),15) end; end; begin iniciar;

Trazar_circ(xc,yc,radio); readln; end. 4. Existe un algoritmo llamado de Bresenham para crear crculos y dice que los valores de un crculo centrado en el origen se calculan en un sector de 45 grados desde x = 0 hasta x = radio/2. Los siete sectores restantes se obtienen por la simetra de ocho puntos en el crculo. Y se decrementa cuando x se incrementa desde x = 0 hasta x = r/2. Si (0,r) es el punto inicial del algoritmo, entonces, a medida que x se incrementa en una unidad, y los valores de Y correspondientes permanecen sin cambio o decrementados en una unidad. Si (xi,yi) es un punto en el crculo, el siguiente punto se describe como: (xi + 1, yi); a la derecha del punto anterior. (xi + 1, yi - 1); abajo y a la derecha del punto anterior. El algoritmo puede ahora escoger entre uno u otro, calcular y comparar las distancias de cada pixel con respecto al punto en el crculo cuyo valor de x sea de xi + 1. Estas distancias miden cun lejos del crculo se encuentra del cada punto, el punto con la distancia ms pequea representa la mejor aproximacin del crculo. ELIPSES: En el caso de las elipses se tiene tambin procedimientos ya especificados por PASCAL y con el procedimiento Ellipse, que tiene cinco parmetros se realiza una. Ellipse(x,y,ngulo inicial,ngulo final,xradio,yradio) Donde x,y son el centro de la elipse, xradio es el radio horizontal y yradio es el radio vertical. Los ngulos se expresan en grados. Ejemplo: Program Elipse; uses Graph; var Gd, Gm: Integer; begin Gd := Detect; InitGraph(Gd, Gm, 'k:\apps\tp\bgi'); if GraphResult <> grOk then Halt(1); Ellipse(100,100,0,360,30,50); Ellipse(100,100,0,180,50,30); ReadLn; CloseGraph; end. En el caso de la elipse que es como un crculo estirado se tienen algoritmos que se pueden utilizar en lugar de el procedimiento ya definido por PASCAL. Se puede crear una elipse a partir de una ecuacin polar de elipse centrada en (xc, yc) y son: x = xc + a*cos(Q) y = yc + b*sen(Q) donde el ngulo Q adopta valores entre 0 y 2p radianes. Los valores de a y b determinan el contorno de la elipse. Si b > a, la elipse se alarga en la direccin de y; y si b < a, la elipse se extiende en direccin de x. Puede tambin dibujarse la elipse empleando una simetra de cuatro puntos y con ecuaciones incrementales: x2 = x1 cos(dQ) - (a/b) y1 sen(dQ) y2 = y1 cos(dQ) - (b/a) x1 sen(dQ). Volver al indice 2.3 DIBUJO DE GRAFICAS DE BARRAS Y SECTORES: GRAFICAS DE BARRAS: Es ms complicado hacer grficas de barras de lo que parece ya que se har un programa que contendr varios procedimientos y funciones que construirn el eje de coordenadas, las letras, n-meros y barras, stas pueden ser bidimensionales o tridimensio-nales, se pueden rellenar con colores o patrones a necesidad y gusto de nosostros. La funcin de graficas de barras hace que se ajuste a la presentacin del grfico apropiado, vertical y horizontalmente y la resolucin de la pantalla y modo de grficos que se usar, comenzando por lo ancho MaxX y altura MaxY. Cuando es creado, se guarda un margen necesario para las letras, esto a lo largo de un lado. En seguida, a lo ancho es decrementado por el nmero que se quiera hasta permitir espacio para ms titulos o rtulos. Para hacer grficas de barras se pueden utilizar los proce-dimientos Bar y Bar3D; el primero se utiliza para hacer barras bidimencionales y se pueden rellenar con el color o el patrn deseados. Su sintaxis es Bar(x1, y1, x2, y2) Ejemplo:

Program Barras; uses Graph; var Gd, Gm, I, Width: Integer; begin Gd := Detect; InitGraph(Gd, Gm, ''); if GraphResult <> grOk then Halt(1); Width := 10; for I := 1 to 5 do Bar(I*Width, I*10, Succ(I)*Width, 200); ReadLn; CloseGraph; end. Si se quiere hacer grficos en tercera dimensin se utilizar Bar3D que traza una barra tridimensional con vrtices opuestos. Su sintaxis es Bar3D(x1, y1, x2, y2, Profundidad, altura) Profundidad se refiere a hacer tridimensional la barra y la altura determina si se traza la barra con una parte superior o no. Ejemplo: Program Barras3; uses Graph; var Gd, Gm: Integer; y0, y1, y2, x1, x2: Integer; begin Gd := Detect; InitGraph(Gd, Gm, ''); if GraphResult <> grOk then Halt(1); y0 := 10; y1 := 60; y2 := 110; x1 := 10; x2 := 50; Bar3D(x1, y0, x2, y1, 10, TopOn); Bar3D(x1, y1, x2, y2, 10, TopOff); ReadLn; CloseGraph; end. El manejo del estilo y color del rellenado se hace depen-diendo de la resolucin, si la resolucin es alta se usar los colores antes mencionados, en caso que que el sistema sea monocromtico, entonces all no se apreciarn los colores sino simplemente los patrones. GRAFICAS DE SECTORES: Existen dos diferentes clases o modos de grficas de sectores una es la sencilla y la otra es por partes o resaltadas. En el caso del diagrama de sectores sencilla o normal se necesitan tres partes principales: trazado de crculos, trazado de lneas radiales y escritura de texto. El interior del crculo se divide en sectores; el tamao de cada una corresponde al porcentaje respecto del total del diagrama. Cada porcin tiene dos rectas radiales que la delimitan y un texto que describe lo que se quiere indicar en ese sector. El diagrama de pastel puede ser sombreado con los colores antes descritos o los patrones de rellenado que se explicarn. Otra forma de hacer un diagrama de sectores es usando el procedimiento PieSlice que crea un arco, dibuja lneas del centro hacia afuera y entonces con patrones o colores completar el diagrama. El diagrama de sectores resaltado se usa para remarcar uno o ms sectores de un diagrama. Y para hacerla se hace directamente. Un sector que aparece resaltado se dibuja con su centro desplazado respecto del diagrama original. Es decir no se ver el crculo completo si no se ver una rebanada a parte como para resaltar algun dato. Ejemplo: Program Sectores; uses Graph; const Radius = 30;

var Gd, Gm : Integer; begin Gd := Detect; InitGraph(Gd, Gm, ''); if GraphResult <> grOk then Halt(1); PieSlice(100, 100, 0, 270, Radius); ReadLn; CloseGraph; end. Volver al indice 2.4 RELLENADO DE REGIONES DE PANTALLA: PASCAL adems de colorear regiones de pantalla con los colores antes mencionados, puede rellenar una regin con un patrn. Los patrones definidos se determinan mediante las siguientes constantes que ya se incluyen en PASCAL. Los procedimientos que ejecutan el trabajo pesado son setfillstyle y floodfill. Setfillstyle permite elegir el patrn que se quiere usar y el color con el que se quiere mostrar. Floodfill, pinta el interior de un polgono o crculo con el patrn y el color que se defini mediante Setfillstyle. Para que Floodfill funcione necesita de dos datos: Posicin del pixel dentro del area a rellenar y el color del lmite de la misma. El color del lmite es la nica forma de que Floodfill pueda determinar dnde tiene que parar de rellenar. Existen 12 patrones diferentes que son: Comando Rellena

EmptyFill Slido, con el color del fondo SolidFill Slido, con el color especificado LineFill guiones LtSlashFill con /// SlashFill con /// gruesas BkSlashFill con \\\ gruesas LtBkSlashFill con \\\ HatchFill con un ligero sombreado XHatchFill con un sombreado denso InterleaveFill Intercala lneas WideDotFill con puntos muy dispersos CloseDotFill con puntos muy distribuidos densamente UserFill Patrn de rellenado definido por el usuario Se puede poner el nombre o el nmero que ya tiene PASCAL definido para cada patrn o color. Tambin existe un procedimiento para el rellenado de regiones poligonales es FillPoly en que se incluye el nmero de vrtices y las coordenadas de los vrtices del polgono. PROGRAMA FINAL DE MODULO: Este programa dibuja un diagrama de sectores. Program pastel_Graph; Uses Graph, Crt; type STR5 = string[5]; const Accounts : array[1..4,1..9] of integer = (( 1986, 133, 35, 33, 17, 29, 15, 17, ( 1987, 122, 41, 30, 25, 18, 24, 43, ( 1988, 111, 65, 57, 14, 17, 39, 32, ( 1989, 100, 60, 70, 12, 16, 13, 17, AccTypes : array[1..9] of STR5 = ( ' ', 'Motor', 'Acsry', 'Reprs', 'Lease', 'Tires', 'Paint', 'Misc'); Var GraphDriver, GraphMode, MaxColors, ErrorCode,

32 21 17 12

), ), ), ) );

'Govmt',

XWidth, YHeight, ZDepth, XAxis, YAxis, ZAxis, XOrg, YOrg, MaxX, MaxY : integer; Scale, AspR : Real; Procedure initialize; Var Xasp, yasp : Word; Begin GraphDriver := DETECT; InitGraph (GraphDriver, GraphMode, 'k:\apps\tp\bgi' ); ErrorCode:=GraphResult; If ErrorCode<>grOK then begin writeln('Error de graficos: ', GraphErrorMsg(errorCode) ); halt(1); end; MaxColors := GetMaxColor + 1; GetAspectRatio(xasp, yasp); AspR:=xasp / yasp; MaxX := GetMaxX; MaxY := GetMaxY; end; procedure pause; Var Ch : Char; Begin While keypressed do ch:= ReadKey; Ch := readKey; end; function I2S (Value : integer) :string; var buffer : string[10]; begin str(value, Buffer); I2S := Buffer; end; procedure PieGraph( DataSet, x, y : integer); Const BlankLine = $0000; Var i, m, r, s, t, HJust, VJust, Total, CapColor : integer; ArcRec : ArcCoordsType; Begin m := 135; Total := 0; for i := 2 to 9 do inc( Total, Accounts[ DataSet, i ] ); r:=Total div 4; SetLineStyle ( UserBitLn, BlankLine, NormWidth); SetFillStyle ( 0, 0 ); PieSlice ( x, y, m, m+1, r+10 ); GetArcCoords ( ArcRec ); if MaxColors > 4 then SetColor (White); SetTextStyle (SansSerifFont, HorizDir, 2 ); SetTextJustify (RightText, BottomText ); OutTextXY (ArcRec.xEnd, ArcRec.yEnd, I2S (Accounts[ DataSet, 1 ] ) ); SetTextStyle( DefaultFont, HorizDir, 1 ); if maxColors > 4 then SetColor (EGAYellow); s := 0;

t := 0; for i := 2 to 9 do begin SetFillStyle( i-1, i-1 ); if MaxColors > 4 then SetColor( white ); SetLineStyle ( SolidLn, 0, NormWidth ); inc( t, round( 360 * ( Accounts[ DataSet, i ] / Total ) + 0.5 ) ); if t > 360 then t := 360; if ( i = 9 ) AND ( t < 360 ) then t := 360; PieSlice ( x, y, s, t, r ); SetLineStyle ( UserBitLn, BlankLine, NormWidth ); SetFillstyle( 0, 0 ); CapColor := i+8; if CapColor > 15 then capcolor := 7; if MaxColors > 4 Then SetColor ( CapColor ); m := round ( ( t-s ) / 2 + s ); PieSlice( x, y, m, m+1, r+5 ); GetArcCoords( ArcRec ); if ArcRec.xEnd > x then HJust := LeftText else HJust := RightText; if ArcRec.yEnd > y then VJust := TopText else VJust := BottomText; SetTextJustify( HJust, VJust ); OutTextXY( ArcRec.xEnd, ArcRec.yEnd, AccTypes[i] ); s := t; end; end; procedure DrawGraphs; Var i : integer; begin ClearDevice; GraphDefaults; Rectangle( 0, 0, MaxX, MaxY); PieGraph( 1, GetMaxX div 4, GetMaxY div 4 ); PieGraph( 2, GetMaxX div 4, 3*GetMaxY div 4 ); PieGraph( 3, 3*GetMaxX div 4, GetMaxY div 4 ); PieGraph( 4, 3*GetMaxX div 4, 3*GetMaxY div 4 ); end; begin Initialize; DrawGraphs; Pause; CloseGraph; end. Volver al indice AUTOEVALUACION: 1. Hacer un programa que haga lo siguiente: - Que se haga un marco del tamao de la pantalla que contenga cuatro rectngulos y aparesca lo que en el grfico aparece:

OBJETIVO DEL MODULO: - Al finalizar el mdulo ser capaz de crear imagenes en tercera dimensin, con opcin de movimiento; adems de crear recuadros o reas especificas de visualizacin del dibujo hecho y almacenar o recuperar mediante procedimientos la figura creada por el programa. INDICE 3.1 Introduccion a imagenes en tercera dimensin 3.2 Almacenamiento y recuperacion de imagenes grficas 3.3 Determinacion de reas de visualizacin por parte del usuario 3.4 Arrastre de una imagen(movimiento) 3.5 Auto evaluacin 3.1 INTRODUCCION A IMAGENES EN TERCERA DIMENSION: Cuanto mas se quiera hacer mas real una imagen hecha en la computadora, tambin se incrementa lo dificil de las matemticas que se aplican. Se necesita de conocimientos de matemticas y fsica. Las imagenes en tercera dimensin se definen por los puntos lneas y planos que la componen. Para especificar esto se necesita de un sistema de coordenadas en tercera dimensin; donde la tercera dimensin, que es la profundidad, se representar mediante el eje z, que se halla en ngulo recto respecto del plano de coordenadas. Existen dos sistemas coordenadas conocidos, se explican a continuacin: El primero es el llamado de mano derecha o es el sistema de coordenadas del mundo, se llama as porque si se cierran los dedos de la mano derecha en el sentido que va del eje positivo x al eje positivo y, el pulgar apunta en la direccin del eje positivo z. Este es el ms utilizado y es el que conocemos. Otro es el de mano izquierda o sistema de coordenadas del observador, consiste en que la pantalla es un plano bidimensional con el origen en la esquina inferior izquierda, el eje y positivo hacia arriba y el eje x positivo hacia la derecha. El eje z empieza en el origen y apunta al interior de la pantalla. Es llamado de mano izquierda ya que si se cierran los dedos de la mano izquierda en la trayectoria de x a y, el pulgar apunta en la direccin z. Y se refiere a sistema del observador, ya que el ojo del observador est en el origen. Cualquier punto en este sistema de coordenadas rectangulares puede describirse por medio de (x, y, z). Cada coordenada representa una distancia dirigida, es decir, una direccin positiva o negativa sobre su eje coordenado correspondiente. Volver al indice 3.2 ALMACENAMIENTO Y RECUPERACION DE IMAGENES GRAFICAS: Cuando PASCAL almacena una imagen de una porcin de la pantalla, la imagen de la pantalla es comprimida y guardada en la memoria y despus se usar. PASCAL, da un paso adelante y tiene un algoritmo que minimiza los requerimientos de la memoria, reduciendo 1,681 EGA/VGA pixels nada ms a 990 bytes de imagen. En el modo monocromtico, la compresin es similar. El almacenamiento y recuperacin es automatico y es hecho cada vez que se llama a PutImage y GetImage y el programador no se necesita preocupar por los mecanismos involucrados. Para almacenar una imagen se necesita: primero determinar cuanta memoria se va a necesitar para almacenar la imagen grfica, es decir, describir la imagen que se va a almacenar; la imagen a almacenar se debe delimitar como una regin rectngular. La imagen puede contener carcteres de texto, porciones de carcteres de texto o imagenes graficas. Despus reservar un buffer de ese tamao y salvar la imagen en el buffer. PASCAL tiene procedimientos ya definidos para hacer este trabajo en los que tenemos ImageSize que calcula la cantidad de memoria requerida para almacenar una imagen determinada por un rectngulo definido mediante dos pares de coordenadas que definen los puntos superior izquierdo e inferior derecho en la panta-lla. Como si estuvieramos describiendo un rectngulo. Este procedimiento regresa el nmero de bytes requeridos para almacenar la imagen en el rectngulo en modo grfico. Despus el procedimiento GetMem que asigna memoria a una variable de tipo apuntador y por ltimo el procedimiento GetImage que mueve la imagen al buffer que apunta el apuntador y la guarda en ese buffer. Ya que se tiene almacenada o salvada la imagen se puede recuperar mediante el procedimiento PutImage que contiene cuatro parmetros, los dos primeros se refiere al area rectangular donde aparecer la imagen. El tercer parmetro es el apuntador al buffer donde esta almacenada o salvada la imagen. El cuarto parmetro es el que determina cmo va a aparecer la imagen y tiene los siguientes valores constantes: Comando Valor

NormalPut 0 CopyPut 0 XORPut 1 OrPut 2 AndPut 3 NotPut 4 A continuacin se explica un poco las constantes anteriores: CopyPut Cada pixel en la imagen es mapeado en la pantalla, reempla-zando alguna imagen existente. Esto incluye los pixeles del fondo de la imagen. XOrPut Cada pixel existente en la pantalla es valuado por un Or eXclusivo correspondiendo los bytes de las imagenes y el resultado es escribir atras de la pantalla otra igual. El resultado es una composicin del primero haciendo un segundo. OrPut Este indica cmo se cambia el color en el fondo de la pantalla pero esto se har uno por uno (color). AndPut Con AndPut, se mesclarn los colores para el fondo de la pantalla, por ejemplo LightRed con LighBlue regresar DarkGray. NotPut El NotPut indica que va a invertir los colores de la imagen. APUNTADORES: Los apuntadores o tambin conocidos como punteros son variables dinmicas porque se pueden crear y disponer de ellas mientras se est ejecutando un programa. Una variable de puntero no contiene datos de la misma forma que lo hacen las dems variables. En su lugar, almacena la direccin que apunta a una variable que se encuentra en la memoria. El signo ^ que se coloca delante del tipo de datos en la definicin indica a PASCAL que define una variable como puntero. i : ^integer. Pero tambin este simbolo se puede utilizar as: i^ := 100; esto quiere decir que el simbolo ^ se esta refiriendo a la variable de la memoria y no al puntero en s. Volver al indice 3.3 DETERMINACION DE AREAS DE VISUALIZACION POR PARTE DEL USUARIO: Esto es definido por el usuario para una aplicacin especifica, se puede ver o ampliar slo una porcin de la imagen o tambin reducir y distorsionar. Muchos procesadores de texto y juegos utilizan esta tcnica. En imagenes bidimensionales se utilizan procedimientos ya especificados por PASCAL que a continuacin se explican. Dependiendo lo que se quiera y la aplicacin del programa se pueden activar pantallas rectngulares pequeas dentro de la pantalla principal para diferentes usos, esto se puede hacer con el procedimiento SetViewPort que lleva cuatro coordenadas de la regin donde se har el rectngulo y una variable que determina si las operaciones de dibujo sern delimitadas por el rectngulo de visualizacin, se pondr Clipon para delimitar las operaciones y Clipoff para desactivarlo o para saber que las operaciones no sern delimitadas por el rectngulo de visualizacin. Cuando un puerto de visualizacin esta activo, todas las coordenadas que se indiquen sern referentes al recuadro de visualizacin. Para eliminar las pantallas rectngulares de visulaizacin se usa el procedimiento ClearViewPort. Para imagenes en tercera dimensin se hace igual a lo ante-rior, con la unica diferencia que se tomarn otros parmetros, se puede hacer por medio de la creacin de algoritmos y se tendr como base el sistema de coordenadas de la mano derecha. Se explica a continuacin un poco de ello. Llamaremos plano visual a lo que el programador puede ver de una imagen en tercera dimensin. El plano visual, esta definido por un punto y una normal (vector perpendicular) en el plano. Este punto de referencia visual desempea un papel central en la transformacin de la visualizacin. Los dems parmetros de visualizacin estn definidos en relacin con este punto. La normal del plano visual indica la orientacin del plano visual. Junto con el punto de referencia visual, define de manera total el plano visual.

El punto de referencia visual es el origen del sistema de coordenadas bidimensional. En el sistema de coordenadas en tercera dimensin no es el origen, en este sistema el ojo humano o centro de proyeccin es el origen. Muchas veces el observador no puede apreciar toda la imagen. En las ventanas bidimensionales se tienen lados paralelos a los ejes x y y, y su posicin y tamao estan definidos en relacin con las distancias respecto del punto de referencia visual. En el sistema coordenada de tercera dimensin se aumenta a las ante-riores el centro de proyeccin para as formar una pirmide visual que, a su vez define en tres dimensiones las partes de la imagen que el ojo humano puede ver. Todos los objetos fuera de este pirmide visual son recortados y no se proyectan en el plano visual. Volver al indice 3.4 ARRASTRE DE UNA IMAGEN (MOVIMIENTO): Antes de empezar explicar que al decir arrastre de una imagen nos referiremos a mover una imagen por medio de flechas o cualquier otro dispositivo que el usuario quiera y que no se confunda con la animacin que es otro tipo parecido al de movimiento de imagenes. Para arrastrar una imagen tambin se puede utilizar el procedimiento PutImage al igual que para recuperar imagenes salvadas o almacenadas, como ya se dijo. Para arrastrar una imagen se necesita de dos cosas: primero, la imagen que se va a arrastrar tiene que estar guradada en un buffer aparte de la imagen subyacente. En segundo lugar, se tiene que usar el procedimiento PutImage con XORPut como tercer parmetro. Esta sentencia se usa dos veces por cada paso en el movimiento. La primera vez que se usa, PutImage borra la figura; la segunda vez, lo vuelve a dibujar en una nueva posicin. Un punto importante en el uso de esta tcnica es definir el buffer ms pequeo posible para guardar la imagen almacenada porque cuanto ms grande sea el buffer, ms tiempo lleva actualizar la imagen y ms lento parecer el proceso de arrastre. PROGRAMA FINAL DE MODULO: Programa uno: CARD3.PAS PROGRAM PRESENT; uses Crt, Graph; var BE,ba,bi, GD,t, GM: Integer; C: CHAR; Xasp, Yasp: word; rxasp, ryasp, p: real; x,y,z: real; ratio, Angular,prof: real; switch: integer; xa,ya,za: real; R1,R2,R3: REAL; CR1,CR2,CR3: REAL; SR1,SR2,SR3: REAL; s : string; procedure move3d(x,y,z: real); begin xa:=cr1* x-sr1* z; za:=sr1* x+cr1* z; x:=cr2*xa+sr2* y; ya:=cr2* y-sr2*xa; z:=cr3*za-sr3*ya; y:=sr3*za+cr3*ya; moveto(round(angular* x/(prof-z))+320 ,175-round(Ratio*angular* y/(prof-z)) ); end; procedure join3d(x,y,z: real); var x1,y1,x2,y2:integer; begin x1:=getx; y1:=gety; move3d(x,y,z); x2:=getx; y2:=gety;

line(x1,y1,x2,y2); end; procedure lini(x1,y1,z1,x2,y2,z2:real); begin move3d(x1,y1,z1); join3d(x2,y2,z2); end; procedure setupang(a1,a2,a3: real); begin SR1:=sin(a1); CR1:=cos(a1); SR2:=sin(a2); CR2:=cos(a2); SR3:=sin(a3); CR3:=cos(a3); end; function radian( th: integer ): real; begin radian:=(pi/180.0*th); end; procedure circuloz(x1,y1,z1,r :real ); var ang,inc : real; begin move3d(x1+r,y1,z1); ang:=0.0; inc:=pi/18; while ang <= 2*pi+0.1 do begin join3d(x1+r*cos(ang),y1+r*sin(ang),z1); ang:=ang+inc; end; end; procedure circuloy(x1,y1,z1,r :real ); var ang,inc : real; begin move3d(x1,y1,z1+r); ang:=0.0; inc:=pi/18; while ang <= 2*pi+0.1 do begin join3d(x1+r*sin(ang),y1,z1+r*cos(ang)); ang:=ang+inc; end; end; procedure circulox(x1,y1,z1,r :real ); var ang,inc : real; begin move3d(x1,y1+r,z1); ang:=0.0; inc:=pi/18; while ang <= 2*pi+0.1 do begin join3d(x1,y1+r*cos(ang),z1+r*sin(ang)); ang:=ang+inc; end; end; procedure ellipsez(x1,y1,z1,r,ex,ey,ani,anf :real var ang,inc,r1,r2 : real; begin r1:=r*ex; r2:=r*ey; );

end;

move3d(x1+r1*cos(ani),y1+r2*sin(ani),z1); ang:=ani; inc:=pi/18; while ang <= anf+0.1 do begin join3d(x1+r1*cos(ang),y1+r2*sin(ang),z1); ang:=ang+inc; end; );

procedure ellipsey(x1,y1,z1,r,ex,ez,ani,anf :real var ang,inc,r1,r2 : real; begin r1:=r*ex; r2:=r*ez; move3d(x1+r1*sin(ani),y1,z1+r2*cos(ani)); ang:=ani; inc:=pi/18; while ang <= anf+0.1 do begin join3d(r1*sin(ang),y1,r2*cos(ang)); ang:=ang+inc; end; end; procedure ellipsex(x1,y1,z1,r,ey,ez,ani,anf :real var ang,inc,r1,r2 : real; begin r1:=r*ey; r2:=r*ez; move3d(x1,y1+r1*cos(ani),z1+r2*sin(ani)); ang:=ani; inc:=pi/18; while ang <= anf+0.1 do begin join3d(x1,y1+r1*cos(ang),z1+r2*sin(ang)); ang:=ang+inc; end; end;

);

begin GD := 9; GM := 1; InitGraph(GD, GM, 'F:\USERS\CURSO\PROG\CLAUDIA.CJV'); if GraphResult<> grOk then Halt(1); Angular:=600.0; Prof:=1000; p:=-1; switch := -1; r1:=radian(0); r2:=radian(0); r3:=radian(0); setupang(r1,r2,r3); GetAspectRatio(Xasp, Yasp); RXasp:=xasp; RYasp:=yasp; Ratio:=rXasp/rYasp; c:='m'; prof:=prof+3; x:=0.0; y:=100.0; setcolor(15); s:='-+64.028'; while c <> 'Q' do begin case c of

'-' : prof:=prof+50; '+' : prof:=prof-50; '0' : r1:=r1+radian(10); '.' : r1:=r1-radian(10); '6' : r2:=r2+radian(10); '4' : r2:=r2-radian(10); '2' : r3:=r3+radian(10); '8' : r3:=r3-radian(10); end; setupang(r1,r2,r3); setcolor(15); lini(-200,100,400,200,100,400); lini(200,100,400,200,100,-400); lini(-200,100,-400,200,100,-400 ); lini(-200,100,400,-200,100,-400); lini(200,100,100,-200,100,100); lini(-200,100,100,-200,180,100); lini(-200,180,100,200,180,100); lini(200,180,100,200,100,100); circuloz(-100,50,400,30); circuloz(100,50,400,30); lini(-200,100,400,-200,0,400); lini(-200,0,400,200,0,400); lini(200,0,400,200,100,400); lini(200,0,400,200,0,300); ellipsex(200,0,250,50,1,1,-pi/2,pi/2); if switch < 0 then SetVisualPage(0) { Muestra Pagina} else SetVisualPage(1); switch:=switch*-1; C:=upcase(READKEY); if Pos(C,s) > 0 then begin if switch > 0 then SetActivePage(1) { Va a pagina oculta} else SetActivePage(0); cleardevice; end; end; CLOSEGRAPH; CLRSCR; END. Programa dos: FLYING.PAS Program avionazo; Uses crt{,dos,},graph; type dibujillo=array[0..51,0..87] of byte; var Dibujo:Dibujillo; Fd:file of dibujillo; k,m,i,j:integer; G:Pointer; modo,a,b:word; Procedure Inicia_Graficos; var monitor,modo:integer; begin detectgraph(monitor,modo); initgraph(monitor,modo,' '); if graphresult<>0 then halt end; Begin {$i-}

Assign(Fd,'b:Fly.Cjv'); Reset(Fd); if ioresult<>0 then halt else Read(Fd,Dibujo); Close(Fd); {$i+} Inicia_graficos; randomize; setfillstyle(1,lightcyan); Bar(0,0,639,479); for m:=1 to 20 do for i:=0 to 51 do for j:=0 to 87 do putpixel(j,100+i,dibujo[i,j]); Getmem(G,Imagesize(0,0,87,51)); Getimage(0,100,87,151,G^); Putimage(0,100,G^,NormalPut); modo:=Normalput; setfillstyle(1,15); for i:=0 to 270 do begin bar(i*2,90,i,140); setcolor(0); line(i*2,90,i,90); line(i*2,140,i,140); setcolor(15); line(i*2,115,i,115); bar(i*2,90,i*2,140); Putimage(i*2,100,G^,modo); end; Readln; end. Volver al indice AUTOEVALUACION: 1. Explique qu es una imagen en tercera dimensin? 2. Qu es y para qu sirve un apuntador? 3. Cmo se almacena una imagen y cmo se recupera? 4. Si se quiere ver slo una parte de una imagen qu se necesita? 5. Hablando de sistemas coordenadas qu sucede con ellas dentro de una area de visualizacin? 6. Explicar la diferencia entre arrastre de una imagen y animacin. 7. Haga un programa que contenga una figura y la mueva alrededor de la pantalla y sea capaz de ver solo una parte de dicha figura.

OBJETIVO DEL MODULO: - Utilizar todo lo antes explicado y los primeros temas de este capitulo para llegar al tipo de diseo Paintbrush, donde se utiliza lneas, rectngulos, crculos, coordenadas, en fin todo lo de los tres modulos anteriores y algunos temas que se explicarn a continuacin.

INDICE 4.1 Manipulacin de imagenes 4.2 Animacin 4.3 Diseo tipo "Paintbrush" 4.4 Auto evaluacin 4.1 MANIPULACION DE IMAGENES: Todas las manipulaciones de tercera dimensin se pueden expresar como matrices de 4*4. La manipulacin de una imagen se refiere a la traslacin, rotacin, escalamiento y afilamiento. Se exlicarn a continuacin. TRASLACION: Cuando nos referimos a la traslacin nos referimos al movimiento de una figura, en terminos de matemticos nos referimos que se han modificado sus coordenadas x,y,z. La transformacin que traslada un punto (x,y,z)Tx unidades en la direccin x, Ty unidades en la direccin z hacia el punto nuevo (x',y',z') se representa por medio de la matriz: Tr(Tx,Ty,Tz) = 1 0 0 0 0100 0010 Tx Ty Tz 1 El punto homogneo trasladado es: [x',y', z', 1] = [x,y,z,1] * Tr(Tx,Ty,Tz) donde x' = x + Tx y' = y + Ty z' = z + Tz La matriz de traslacin inversa se obtiene invirtiendo el signo de los valores de Tx, Ty, Tz. As, para trasladar el punto (x',y',z') de regreso a (x,y,z) se multiplica el punto homogneo [x',y'.z',1] por la matriz Tr(-Tx,-Ty,-Tz). ROTACION: Una imagen puede ser rotada pixel por pixel y crear una segunda imagen, que es la duplicacin del primero, pero el cual tuvo la diferencia de la orientacin. Al mismo tiempo, cada pixel en el rea de la imagen especi-ficada es probada para ver si no es cero, desde alli no tiene un punto en rotacin de los pixeles del fondo. Si el pixel valuado no es cero, entonces el pixel posicionado es leido por los ejes x y y compensado con un punto central. Nominalmente, una imagen es rotada egocentricamente (desde si misma hasta el centro), pero provisionamente puede ser hecha rodar una imagen excentricamente pero especificando la necesidad de cero puntos como coordenadas. En ambos casos, la posicin del pixel, tienen coordenadas x y y compensadas, es convertido un ngulo y un vector de distancia (la hipotenusa de un tringulo formado por x y y distancias). El ngulo del pixel es entonces incrementado por el angulo de rota-cin y el vector distancia se recombierte a la compensacin de los ejes x y y el cual genera una nueva posicin del pixel. Una rotacin bidimensional en torno al origen equivale a una rotacion tridimensional en el palano x,y en torno al eje z. Una rotacin se efectua alrededor de un eje. ESCALAMIENTO: El escalamiento en coordenadas en tercera dimension permite la contraccin o expansin en las direcciones x, y, o z. Es decir, se puede hacer la imagen ms grande o en su defecto ms pequea. Para hacer un escalamiento en tercera dimensin se hace as se necesita que un punto permanesca estatico es decir en una posicin fija y los dems se aumentan se produce una distorsin y a esto se refiere el escalamiento. AFILAMIENTO: El afilamiento en sistemas bidimensionales se refiere a distorsiones de la imagen en x y y, en sistemas tridimensionales tambin se refieren al eje z. Por ejemplo, un afilamiento y transforma el punto (x,y,z) al punto (x',y',z'). Es decir, en el caso de una imagen bidimensional, un rectngulo se distorsiona hasta darle forma de paralelogramo. Volver al indice 4.2 ANIMACION: Las imagenes generadas por la computadoras se usan tanto en juegos de vdeo como en cintas de peliculas cinematograficas, como en la docencia. PASCAL ofrece animacin de baja resolucin ya que para hacer animacin como de juegos de vdeo se necesita programar en ensamblador y quiz en lenguaje mquina. Existen varias tcnicas de animacin y entre ellas se explicarn las siguientes:

* Tiempo de borrado de la pantalla, se relaciona con la velocidad de actualizacin. Antes de presentar un nuevo cuadro debe borrarse la totalidad, o parte, del cuadro anterior. Si el tiempo de borrado de la pantalla es mayor que un cuarto del tiempo de cuadro, se produce un parapadeo perceptible. Se dispone de varios mtodos para disminuir la longitud del periodo de pantalla en blanco. La tcnica de actualizacin selectiva requiere cambiar slo una pequea rea de la pantalla. El tiempo que toma en borrar esta rea, en vez de la pantalla completa, puede bastar para eliminar el parpadeo. * Otra tcnica es la de pantalla con almacenes alternados, esta requiere de dos memorias de imagen. A medida que el controlador de video muestra la imagen contenida en una memoria, el procesador de la presentacin borra y redibuja la imagen en la segunda memoria. Cuando la nueva imagen est lista, el controlador presenta el contenido de la segunda memoria. Tal cosa se realiza de manera instantnea, sin que se perciba parpadeo alguno. Una desventaja es que la memoria adicional que se requiere para la segunda memoria. Pero el bajo costo de las memorias hace atractiva esta opcin para los nuevos sistemas de presentacin. * Tabla de bsqueda de trayectoria.- En una secuencia animada, muchos objetos siguen una trayectoria especfica, como puede ser una curva trigonomtrica. En este mtodo se refiere a trayectoria como una curva y con un velocidad constante o especifica. En este mtodo consiste en procesar previamente, para luego almacenar los valores de coordenadas en una tabla de bsqueda de trayectoria. Cuando el objeto se mueve, slo hace falta tener acceso a la tabla para determinar las coordenadas de la pantalla. Pero la desventaja es que esta tabla de bsqueda de trayectoria se lleva espacio en la memoria. Esta tabla se hace mediante un arreglo de registros, cada registro contiene las coordenadas en pantalla de un punto en la trayectoria especificada. Existe algo llamado colisin que se refiere a cuando varias figuras ocupan las mismas coordenadas en pantalla. Se puede detectar inmediatamente y fcil por el programador, pero a la computadora le es dificil y tardado detectar este fenmeno. Para aumentar la velocidad de la deteccin existe un mtodo o tcnica, a esta tcnica se le llama la de los rectngulos de definicin de los objetos. Se toma como referencia la tabla de definicin de la figura. Y por medio de desigualdades se sabe si la figura esta dentro del rango de un rectngulo especificado por el programador de estar dentro del rango o que sean vlidas las desigualdades se tiene colisin, es decir, el objeto que tenga coordenadas ms cercanas a esos valores es el colisionado. La ventaja de esta tcnica es que es fcil de codificar y adems detecta en tiempo real las colisiones. Su desventaja es que puede producir resultados imprecisos. Volver al indice 4.3 DISEO TIPO PAINTBRUSH: En este tema se ocupar lo anteriormente explicado ya que para hacer un programa de estas caracteristicas se ocupa recuperacin y almacenamiento de imagenes, colores, etc. En algunas literaturas se refiere a diseo tipo Paintbrush en otras se refiere a editores de iconos. Con el incremento de la popularidad de aplicaciones grficas muchos programas y programadores ya no utilizan los mens de textos en favor de las aplicaciones basadas en iconos. Algunos que empezaron esto fueron las computadoras Apple, Microsoft Windows y lo ms reciente Presentation Manager. Los iconos pueden servir como smbolos en pantallas y como botones de aplicaciones de control. El editor de iconos esta provista por un simple mapa de bits este puede crear imagenes arriba de 32 pixels en cuadros en color o monocromticos, puede almacenar y recuperar imagenes de disco y pueden invertir imagenes o cambiar de color a monocromtico. Se pueden poner iconos de color y tambin los monocromticos. Los iconos monocromticos, requieren menor memoria que los de color. La limitacin de tamao de 32*32 son arbitrarios y pueden ser incrementados si se desea. En muchos casos, un cuadro de 32 bits es suficiente, en otros casos no lo es y se podrn incrementar los bits. Las imagenes pueden aparecer de forma vertical y horizontal como el programador y el usuario quiera. En general, cuando se empieza a crear un editor de iconos se empieza por crear la reja y despus se crea la imagen o simplemente se recupera. Donde cada cuadro de la reja simula un pixel. Puede almacenar figuras y tambin puede recuperarlas en la reja para hacerle modificacines o simplemente verlas. Para crear imagenes, recuperarlas, etc, se necesita programar una serie de procedimientos que indique hacer lo que se quiera. Cuando se hace este tipo de editor se puede hacer uso o no de el mouse. En la figura que a continuacin se muestra se puede ver la rejilla que se explicaba y es aqu donde se podr recuperar la imagen para verla o hacerle cambios y tambin podr ser almacenada. PROGRAMA FINAL DE MODULO: Este programa es un editor de iconos o diseo tipo Paintbrush y es el cdigo de las figuras anterio res. PROGRAM IMPORTA_DEL_PM; USES CRT,GRAPH,DOS; CONST

B_ESPACE=#8; ENTER=#13; ESCAPE=#27; F1=';'; F2='<'; F3='='; F4='>'; F5='?'; F6='@'; F7='A'; F8='B'; F9='C'; F10='D'; F_ARR='H'; F_I='K'; F_D='M'; F_AB='P'; DEL='S'; INS='R'; HOME='G';FIN='O';F11='T';F12='U';PU='I';PD='Q'; TYPE ARCH=RECORD INICIO:ARRAY[1..4] OF CHAR; MATRIZ:ARRAY[1..52,1..11] OF BYTE; TERMINO:CHAR;END; CONV=ARRAY[0..51,0..87] OF BYTE; PERMITIDOS=SET OF CHAR; VAR MAT:ARCH; ARCHIVO:FILE OF ARCH; ARCHVGA:FILE OF CONV; DIBUJO:CONV;CAD:STRING; I,J,K,L:INTEGER;ALGO:CHAR; MANO,MANO2:ARRAY[1..9] OF FILLPATTERNTYPE; PROCEDURE CAMBIA_COLOR(COLOR,ROJO,VERDE,AZUL:BYTE); VAR RES:REGISTERS; BEGIN FILLCHAR(RES,SIZEOF(RES),0); WITH RES DO BEGIN AH:=$10; AL:=$10; BX:=COLOR; DH:=ROJO; CH:=VERDE; CL:=AZUL; INTR($10,RES); END; END; PROCEDURE BOX(X1,Y1,X2,Y2,TRAMA,COLOR:INTEGER); VAR TRAM:FILLPATTERNTYPE;I:INTEGER; BEGIN FILLCHAR(TRAM,SIZEOF(TRAM),0); CASE TRAMA OF 1..9:SETFILLSTYLE(TRAMA,COLOR); 10:BEGIN FOR I:=1 TO 8 DO BEGIN TRAM[I]:=$AA; SETFILLPATTERN(TRAM,COLOR);END;END; 11:BEGIN FOR I:=1 TO 8 DO BEGIN IF ODD(I) THEN TRAM[I]:=$FF ; SETFILLPATTERN(TRAM,COLOR);END;END; END; BAR(X1,Y1,X2,Y2); END; PROCEDURE CAJA(X1,Y1,X2,Y2,TRAMA,C1,C2:WORD); VAR I,J:INTEGER; BEGIN SETLINESTYLE(USERBITLN,TRAMA,NORMWIDTH); BOX(X1,Y1,X2,Y2,1,C1); SETCOLOR(C2); FOR I:=Y1 TO Y2 DO IF ODD(I) THEN LINE(X1,I,X2,I); IF TRAMA<>0 THEN SETLINESTYLE(USERBITLN,TRAMA XOR $FFFF,NORMWIDTH); FOR I:=Y1 TO Y2 DO IF NOT(ODD(I)) THEN LINE(X1,I,X2,I); END;

FUNCTION INN(NUMMAY,NUMERO,NUMMEN:INTEGER):INTEGER; BEGIN IF NUMERO<NUMMEN THEN NUMERO:=NUMMEN ELSE IF NUMERO>NUMMAY THEN NUMERO:=NUMMAY; INN:=NUMERO; END; FUNCTION INKEY(VAR SECUNDARIO:BOOLEAN):CHAR; VAR CAR:CHAR; BEGIN SECUNDARIO:=FALSE; CAR:=READKEY; IF (CAR=CHAR(0)) AND KEYPRESSED THEN BEGIN CAR:=READKEY;SECUNDARIO:=TRUE;END; INKEY:=CAR; END; PROCEDURE PAINT(X,Y,TRAMA,CF,CB:INTEGER); BEGIN SETFILLSTYLE(TRAMA,CF); FLOODFILL(X,Y,CB); END; PROCEDURE DIBUJ(X,Y,ESTILO,COLOR:INTEGER;FIGURA_C:FILLPATTERNTYPE); VAR I,J,NUM1,NUM2,RES,IT:BYTE;D_L,ITALICS:BOOLEAN; BEGIN RES:=0;SETCOLOR(0);D_L:=FALSE;ITALICS:=FALSE;IT:=0; IF ESTILO=3 THEN BEGIN D_L:=TRUE;ESTILO:=2 END; IF ESTILO=4 THEN BEGIN IT:=1;ESTILO:=2 END; IF ESTILO=5 THEN BEGIN IT:=1;D_L:=TRUE;ESTILO:=2 END; FOR J:=0 TO (ESTILO*4-1) DO BEGIN I:=0; NUM1:=FIGURA_C[J+1]; WHILE (NUM1>=1) DO BEGIN NUM2:=NUM1 DIV 2; RES:=NUM1-(NUM2 *2); NUM1:=NUM2; IF RES=1 THEN BEGIN IF D_L THEN BEGIN PUTPIXEL(X+8-I+(IT*((7-J)DIV 2)),Y+(J*2),COLOR); PUTPIXEL(X+8-I+(IT*((7-J)DIV 2)),Y+(J*2)+1,COLOR); END ELSE PUTPIXEL(X+8-I+(IT*((7-J) DIV2)),Y+J,COLOR);END; I:=I+1; END; END; END; (*_____________________________________________________________*) PROCEDURE CHAR4X8(CARACTER:CHAR;XCOR,YCOR,COLOR,ESTILO:INTEGER); VAR COUNT,MASCARA,I,NIBBLE1,ASCII:BYTE; SEGMENTO,PRINCIPIO:LONGINT; FIGURA_C:FILLPATTERNTYPE;STYLE:INTEGER; BEGIN FILLCHAR(FIGURA_C,SIZEOF(FIGURA_C),0);

THEN

ASCII:=ORD(CARACTER); SEGMENTO:=$F000; PRINCIPIO:=$FA6E+(ASCII*8); COUNT:=0; STYLE:=ESTILO; IF ESTILO>2 THEN ESTILO:=2; CASE ESTILO OF 1:BEGIN FOR I:=0 TO 3 DO BEGIN COUNT:=I*2; NIBBLE1:=MEM[SEGMENTO:PRINCIPIO+COUNT] ; FIGURA_C[I+1]:=NIBBLE1; END; FIGURA_C[8]:=(MEM[SEGMENTO:PRINCIPIO+7]); IF (CARACTER IN['3','8','F','E','B','K','H','b','d','f'])

FIGURA_C[5]:=FIGURA_C[4] OR 28; IF (CARACTER IN['E','F']) THEN FIGURA_C[6]:=FIGURA_C[6] AND 239; IF (CARACTER='p') THEN FIGURA_C[7]:=FIGURA_C[7] OR 24; IF (CARACTER IN['q','g']) THEN FIGURA_C[7]:=FIGURA_C[7]OR 12; END; 2: BEGIN FOR I:=0 TO 7 DO FIGURA_C[I+1]:=(MEM[SEGMENTO:PRINCIPIO+I]); END; END; DIBUJ(XCOR,YCOR,STYLE,COLOR,FIGURA_C); END; (*____________________________________________________________*) PROCEDURE TEXTO4X8(TEXTO:STRING;XCOR,YCOR,COLOR,ESTILO:INTEGER); VAR COLUM,I:INTEGER; BEGIN COLUM:=XCOR; FOR I:=1 TO LENGTH(TEXTO) DO BEGIN CHAR4X8(TEXTO[I],COLUM,YCOR,COLOR,ESTILO); COLUM:=COLUM+8; END; END; (*____________________________________________________________*) PROCEDURE CENT(FRASE:STRING;Y,XMEN,XMAY,COLOR,ESTILO:INTEGER); VAR COLUMNA:INTEGER; BEGIN COLUMNA:=XMEN+(((XMAY-XMEN)-(LENGTH(FRASE)*8)) DIV 2); TEXTO4X8(FRASE,COLUMNA,Y,COLOR,ESTILO); END; (*_____________________________________________________________*) PROCEDURE LEE_CADENA(VAR CAD:STRING;NUM:INTEGER;DAT:PERMITIDOS); VAR I,J,K,X,Y:INTEGER;CAR:CHAR; BEGIN I:=1; CAR:=' '; X:=GETX; Y:=GETY; TEXTO4X8(CAD,X,Y,RED,2); MOVETO(X,Y);

CAR:=UPCASE(READKEY); IF CAR<>#13 THEN BEGIN BOX(X,Y,X+(LENGTH(CAD)*8),Y+8,1,WHITE); FILLCHAR(CAD,SIZEOF(CAD),0); MOVETO(X,Y);END; WHILE (CAR<>#13) DO BEGIN IF (CAR IN DAT) AND (I<=NUM) THEN INSERT(CAR,CAD,I); IF (CAR=#8) AND (I>1) THEN BEGIN DELETE(CAD,I-1,1); MOVETO(X+((I-2)*8),Y);BOX(GETX,GETY,GETX+8,GETY+8,1,WHITE); END; IF CAR=#27 THEN BEGIN BOX(X,Y,X+(LENGTH(CAD)*8),Y+8,1,WHITE); MOVETO(X,Y);CAD:=''; END; I:=LENGTH(CAD)+1; MOVETO(X,Y); TEXTO4X8(CAD,GETX,GETY,RED,2); CAR:=UPCASE(READKEY); END; MOVETO(X,Y+1); END; (*_____________________________________________________________*) PROCEDURE Rejilla(X,Y:INTEGER); VAR I,J:INTEGER; BEGIN SETLINESTYLE(USERBITLN,$FFFF,NORMWIDTH); SETCOLOR(BLUE); FOR I:=0 TO 87 DO FOR J:=0 TO 51 DO RECTANGLE(X+(I*6),Y+(J*6),X+(I*6)+6,Y+(J*6)+6); END; PROCEDURE DIBUJA2(X,Y:INTEGER); VAR I,J,K,H,COLOR:INTEGER;COMODIN:BYTE; BEGIN WITH MAT DO BEGIN FOR I:=0 TO 51 DO FOR J:=0 TO 10 DO FOR K:=7 DOWNTO 0 DO BEGIN COMODIN:=(MATRIZ[I+1,J+1] AND (1 SHL K)) DIV (1 SHL K) XOR 1; COMODIN:=COMODIN*15; PAINT(X+2+((J*8)+7-K)*6,Y+((I)*6)+2,1,COMODIN,BLUE); DIBUJO[I,(7-K)+(J*8)]:=COMODIN; END; END; END; PROCEDURE DIBUJA(X,Y,INC,DEC:INTEGER); VAR I,J,K,H,MONITOR,MODO,COLOR:INTEGER;COMODIN:BYTE; BEGIN DETECTGRAPH(MONITOR,MODO); IF (MONITOR=VGA) THEN COLOR:=yellow ELSE COLOR:=1; WITH MAT DO BEGIN FOR I:=1 TO 52 DO FOR J:=1 TO 11 DO FOR K:=7 DOWNTO 0 DO BEGIN

COMODIN:=(MATRIZ[I,J] AND (1 SHL K)) DIV (1 SHL K) XOR 1; COMODIN:=COMODIN*COLOR;SETCOLOR(COMODIN); LINE(X+((J*8*INC DIV DEC)-(K*INC DIV DEC)),Y+I, X+((INC-1) DIV DEC)+((J*8*INC DIV DEC)-(K*INC DIV DEC)),Y+I); END; END; END; PROCEDURE DIBUJA_CH; VAR I,J:INTEGER;COMODIN:POINTER;SECUNDARIO:BOOLEAN;K:CHAR; BEGIN GETMEM(COMODIN,IMAGESIZE(100,80,187,131)); GETIMAGE(100,80,187,131,COMODIN^);K:=' '; FOR I:=0 TO 51 DO FOR J:=0 TO 87 DO PUTPIXEL(100+J,80+I,DIBUJO[I,J]); REPEAT K:=INKEY(SECUNDARIO);UNTIL (K=CHR(27)); PUTIMAGE(100,80,COMODIN^,NORMALPUT); FREEMEM(COMODIN,IMAGESIZE(100,80,187,131)); END; PROCEDURE DIBUJA3; VAR I,J,X,Y,CO:INTEGER;ES:WORD; BEGIN X:=100;Y:=10; FOR I:=0 TO 51 DO FOR J:=0 TO 87 DO BEGIN CO:=DIBUJO[I,J] DIV 16; IF DIBUJO[I,J]>15 THEN ES:=$AAAA ELSE ES:=0; CAJA(X+(J*6)+1,Y+(I*6)+1,X+(J*6)+5,Y+(I*6)+5,ES,DIBUJO[I,J],CO); END; END; PROCEDURE DIBUJA4; VAR I,J:INTEGER;SECUNDARIO:BOOLEAN;K:CHAR;COMODIN:POINTER; BEGIN GETMEM(COMODIN,IMAGESIZE(100,80,296,184)); GETIMAGE(100,80,296,184,COMODIN^);K:=' '; FOR I:=0 TO 51 DO FOR J:=0 TO 87 DO BEGIN BOX(100+(J*2),80+(I*2),101+(J*2),81+(I*2),1,DIBUJO[I,J]); IF DIBUJO[I,J]>15 THEN PUTPIXEL(101+(J*2),81+(I*2),DIBUJO[I,J] DIV 16); END; REPEAT K:=INKEY(SECUNDARIO);UNTIL (K=CHR(27)); PUTIMAGE(100,80,COMODIN^,NORMALPUT); FREEMEM(COMODIN,IMAGESIZE(100,80,296,184)); END; PROCEDURE GRABA_EN_DISCO; BEGIN WRITE(ARCHVGA,DIBUJO); CLOSE(ARCHVGA); END; PROCEDURE LLAMA_DE_DISCO; BEGIN READ(ARCHVGA,DIBUJO); CLOSE(ARCHVGA); END;

PROCEDURE VENTANA_DISCO(OPCION:CHAR;VAR DIBUJO:CONV); VAR I,J:INTEGER;WIN:POINTER;NOMBRE:STRING; BEGIN {$I-} GETMEM(WIN,IMAGESIZE(100,30,440,70)); GETIMAGE(100,30,440,70,WIN^); CAJA(120,30,440,70,$CCCC,BLUE,BLACK); BOX(140,40,420,60,1,WHITE);NOMBRE:=''; { TEXTO4X8(' NOMBRE DEL ARCHIVO :',122,42,GREEN,4); MOVETO(142,52); LEE_CADENA(NOMBRE,25,['A'..'Z','.','\',':','0'..'9']);} CASE OPCION OF 'G':BEGIN TEXTO4X8(' NOMBRE DEL ARCHIVO A GRABAR:',122,42,GREEN,4); MOVETO(142,52); LEE_CADENA(NOMBRE,25,['A'..'Z','.','\',':','0'..'9']); IF NOMBRE<>'' THEN BEGIN ASSIGN(ARCHVGA,NOMBRE); REWRITE(ARCHVGA); WRITE(ARCHVGA,DIBUJO) END END; 'L':BEGIN TEXTO4X8(' NOMBRE DEL ARCHIVO A LLAMAR:',122,42,GREEN,4); MOVETO(142,52); LEE_CADENA(NOMBRE,25,['A'..'Z','.','\',':','0'..'9']); IF NOMBRE<>'' THEN BEGIN ASSIGN(ARCHVGA,NOMBRE); RESET(ARCHVGA); READ(ARCHVGA,DIBUJO) END END; END; IF IORESULT<>0 THEN WRITE(CHR(7)); PUTIMAGE(100,30,WIN^,NORMALPUT); {$I+} END; PROCEDURE CREA_IMAGEN(X1,Y1:INTEGER); VAR X,Y,I,J,K,CO2,CO21:INTEGER;DISP,SECUNDARIO:BOOLEAN;OP:CHAR; ESTILO,ES2:WORD;CI2:STRING[20]; BEGIN K:=0;J:=0;X:=X1;Y:=Y1; I:=0;DISP:=FALSE;SECUNDARIO:=FALSE; TEXTO4X8('COLOR',30,100,BLUE,3); REPEAT IF I>16 THEN ESTILO:=$AAAA ELSE ESTILO:=0; CO2:=I DIV 16; CAJA(30,125,70,135,ESTILO,I,CO2); BOX(36,280,98,320,1,WHITE);STR(I,CI2); TEXTO4X8('COLOR: '+CI2,10,300,RED,2); STR(J,CI2); TEXTO4X8('X: '+CI2,20,280,BROWN,2); STR(K,CI2); TEXTO4X8('Y: '+CI2,20,290,BROWN,2); STR(DIBUJO[K,J],CI2); TEXTO4X8('PIXEL :'+CI2,10,310,GREEN,2); IF DISP THEN BEGIN BOX(30,230,80,240,1,CYAN); TEXTO4X8('ACTIVO',30,231,RED,4);END ELSE BOX(30,230,80,240,1,WHITE); REPEAT REPEAT

BOX(X+1,Y+1,X+5,Y+5,1,I); BOX(X+1,Y+1,X+5,Y+5,1,I XOR 15); UNTIL KEYPRESSED; OP:=INKEY(SECUNDARIO); UNTIL (OP IN[F_ARR,F_AB,F_I,F_D,F1,F2,F3,F5,F6,F4,F7,F8,F9, PU,PD,INS,FIN,DEL,HOME]) AND SECUNDARIO; IF DISP THEN DIBUJO[K,J]:=I; IF DIBUJO[K,J]<16 THEN ES2:=0 ELSE ES2:=$AAAA; CO21:=DIBUJO[K,J] DIV 16; CAJA(X+1,Y+1,X+5,Y+5,ES2,DIBUJO[K,J],CO21); IF SECUNDARIO THEN CASE OP OF F_ARR:K:=INN(51,K-1,0); F_AB:K:=INN(51,K+1,0); F_I:J:=INN(87,J-1,0); F_D:J:=INN(87,J+1,0); INS:BEGIN J:=INN(87,J-1,0);K:=INN(51,K-1,0) END; FIN:BEGIN J:=INN(87,J+1,0);K:=INN(51,K+1,0) END; DEL:BEGIN J:=INN(87,J-1,0);K:=INN(51,K+1,0) END; HOME:BEGIN J:=INN(87,J+1,0);K:=INN(51,K-1,0) END; F1:DISP:=NOT(DISP); F2:I:=INN(255,I+1,0); F3:I:=INN(255,I-1,0); PD:I:=INN(255,I+16,0); PU:I:=INN(255,I-16,0); F6:BEGIN VENTANA_DISCO('G',DIBUJO);Rejilla(100,10);DIBUJA3 END; F7:BEGIN VENTANA_DISCO('L',DIBUJO);Rejilla(100,10);DIBUJA3 END; F4:DIBUJA_CH; F8:DIBUJA4; F9:BEGIN FILLCHAR(DIBUJO,SIZEOF(DIBUJO),15);DIBUJA3 END; END; X:=X1+(J*6);Y:=Y1+(K*6); UNTIL (OP=F5); END; PROCEDURE INICIA_GRAFICOS; VAR MONITOR,MODO:INTEGER; BEGIN DETECTGRAPH(MONITOR,MODO); INITGRAPH(MONITOR,MODO,'K:\APPS\TP\BGI'); IF (MONITOR=VGA) THEN SETGRAPHMODE(VGAMED); IF GRAPHRESULT<>GROK THEN HALT END; BEGIN INICIA_GRAFICOS;J:=0;K:=0; DIRECTVIDEO:=FALSE; BOX(1,1,GETMAXX,GETMAXY,1,15); Rejilla(100,10);I:=0; CREA_IMAGEN(100,10); ALGO:=READKEY; END. Volver al indice

AUTOEVALUACION: 1. Qu es manipulacin de imagenes? 2. Qu es animacin?

3. Cuntas tcnicas de animacin existen y mencionelas? 4. Trate de hacer un programa que haga diseos tipo Paintbrush

Los programas a qui incluidos son los que se usan con el proposito de ilustar mejor la explicacion de la seccion de tutoriales, estos programas estan documentados para un mayor entendimiento. PROGRAMAS:

MODULO 1 Programa Modotexto


Programa ejemplo Programa pcxx

MODULO 2
Programa LineaHoriz Programa LineaVer Programa Linea (usando la inst. putpixel). Programa Linea (usando la funcin Random( )) Programa linea (usando la funcin. Linerel( )) Programa Rectangulo Programa Circulo Programa Circulo_ecuacin Programa Rect_circulo Programa Elipse Programa Barras Programa Barras3 Programa Sectores Programa Pastel_Graph

MODULO 3
Programa Present Programa Avionazo

MODULO 4
Programa Importa_del_PM (* UNIVERSIDAD DE GUADALAJARA Coordinacin de Sistemas Unidad de Cmputo Acadmico El siguiente programa esta echo en modo texto, el cual escribe en el centro de la pantalla la leyenda "UNIVERSIDAD DE GUADALAJARA", en seguida una doble lnea para separar una grfica echa con caracteres ASCII, con dos categorias "PERSONAS" y "MES".

Todo el texto esta en color #7 (Gris Claro), que es el color por defecto en modo texto, ya que no se indico ningun color, con la funcin " TEXTCOLOR ". *) Program ModoTexto; Uses Crt; Var x : integer; (* Procedimiento por el cual se escribe en el centro de la pantalla la leyenda "UNIVERSIDAD DE GUADALAJARA" y en seguida una lnea doble. *) Procedure presentacion; begin gotoxy (25,2); write(' UNIVERSIDAD DE GUADALAJARA '); gotoxy (1,3); for x:=1 to 80 do write(chr(205)); readln end; (* Procedimiento que asigna las categorias a la grfica, las categorias son: "PERSONAS" y "MES" *) Procedure letras; begin gotoxy(1,10); write('PERSONAS'); gotoxy(45,23); write('MES'); end; (* Procedimiento que dibuja la grfica (en modo texto), con los caracteres del cdio ASCII, el caraceter #179 "", el #192 "" y el catacter #196 "" *) Procedure Lineas; Var a,b : integer; begin for b := 10 to 22 do begin gotoxy(9,b); write(chr(179)); end; gotoxy(9,22); write(chr(192)); For a := 10 to 50 do begin gotoxy(a,22); write(chr(196)); end; end; Begin (* Llamada al procedimiento que escribe la leyenda y la doble lnea *) presentacin; (* Llamada al procedimiento que indica las categorias de la grfica *) letras;

(* Llamada al procedimiento que dibuja la grfica *) lineas; end.

(*

UNIVERSIDAD DE GUADALAJARA Coordinacin de Sistemas Unidad de Cmputo Acadmico El siguiente programa realiza un ejemplo de la funcin "RECTANGLE" la cual dibuja un rectangulo o cuadrado en la pantalla, se especifican las coordenadas ( x , y ) del punto superior izquierdo del rectangulo as como el inferior derecho. El color por defecto es el color blanco, si no se especifica otro. *)

Program Rectangulo; Uses CRT, GRAPH; Var Gd, Gm : Integer; begin (* Deteccin del modo grfico *) Gd := Detect; (* inicializacin del modo grfico *) InitGraph(Gd, Gm, 'c:\tp\bgi'); (* Verificacin de error en el modo grfico *) if GraphResult <> grOk then Halt(1); Rectangle(280,150,40,30); Delay (5000); CloseGraph; (* Cerrar modo grfico *) End.

(*

UNIVERSIDAD DE GUADALAJARA Coordinacin de Sistemas Unidad de Cmputo Acadmico Este programa abre archivos "*.PCX", es decir, cualquier archivo de grficos con esa extensin es este programa es capaz de abrirlo y mostrar ese grfico.

*)

program pcxx; uses crt,graph,dos; (* Procedimiento para inicializar grficos*) PROCEDURE INICIAR_GRAFICOS; VAR MONITOR,MODO,ERROR:INTEGER; BEGIN (* Deteccin del tipo de adaprador grfico de su PC *) MONITOR:=DETECT; (* Inicializando el modo grfico *) INITGRAPH(MONITOR,MODO,'c:\tp\bgi '); (* Verificacin de errores en el modo grfico*) ERROR:=GRAPHRESULT; IF ERROR<>GROK THEN BEGIN WRITELN('ERROR EN GRAFICOS ');DELAY(3000);

HALT; END; CLEARDEVICE; END; (* Procedimiento para contener los colores en los registros de proposito general de su PC*) Procedure SetRGBPalette(Col,R,G,B:byte); Var Regs:registers; begin Fillchar(Regs,sizeof(Regs),0); Regs.AX:=$1010; Regs.BX:=col; Regs.Dh:=R; Regs.Ch:=G; Regs.Cl:=B; Intr ($10,Regs); end; Procedure Graba_Pcx(xmin,ymin,xmax,ymax:integer;nombre:string); type maping=arraY[0..15,1..3] of byte; pcxinit=record manufactura,version,codigofin,bitsporpixel:byte; xmin,ymin,xmax,ymax,hres,vres:integer; mapacolor:maping; reservado,nplanes:byte; bytesporlinea,typopaleta:integer; sheet:array[1..58] of byte; end; const Colors:maping= ( (0,0,0),(0,0,2),(0,2,0), (0,2,2),(2,0,0),(2,0,2), (2,2,0),(2,2,2),(1,1,1), (1,1,3),(1,3,1),(1,3,3), (3,1,1),(3,1,3),(3,3,1), (3,3,3) ); Var archi1:file of pcxinit; archi:file of byte; Hdr:pcxinit; punto,contador,l:byte; i,j,k,x,y:integer; (* Esta funcin lee el color de una coordenada especfica del archivo *.PCX y debuelve el valor del color. *) Function Lee_color(var x,y:integer):byte; var co:byte; begin if y<=ymax then co:=Getpixel(x,y); inc(x); if x>xmax then begin x:=xmin; inc(y) end; Lee_color:=co end; Function Lee_byte:byte; var l:byte; begin l:=Lee_color(x,y); l:=l mod 16; l:=Lee_color(x,y)+(16*l);

Lee_byte:=l end; Begin Hdr.manufactura:=10; Hdr.version:=5; Hdr.codigofin:=1; Hdr.bitsporpixel:=4; Hdr.hres:=26; Hdr.vres:=26; Hdr.reservado:=0; Hdr.nplanes:=1; if odd(xmax-xmin+1) then Hdr.bytesporlinea:=(xmax-xmin+1) div 2 else Hdr.bytesporlinea:=((xmax-xmin+1) div 2)+1; Hdr.typopaleta:=0; for i:=0 to 15 do for j:=1 to 3 do Hdr.mapacolor[i,j]:=Colors[i,j]*85; Hdr.xmin:=xmin; Hdr.xmax:=xmax; Hdr.ymin:=ymin; Hdr.ymax:=ymax; {$i-} assign(archi1,nombre); rewrite(archi1); write(archi1,Hdr); close(archi1); {$i+} assign(archi,nombre); reset(archi); seek(archi,128); x:=xmin; y:=ymin; contador:=1; l:=Lee_byte; punto:=Lee_byte; repeat While (l=punto) and (contador<63) do begin inc(contador); punto:=Lee_byte end; if ((contador=1) and (l<192)) then write(archi,l) else begin contador:=contador+192; write(archi,contador); write(archi,l); end; l:=punto; contador:=1; punto:=Lee_byte; Until (y>ymax); close(archi); {$i+} end; Procedure Lee_Pcx_16(nombre:string); {$r-}{$v-} type plano=^tplano; tplano=array[0..38399] of byte; maping=Array[0..15,1..3] of byte; pcxinit=record manufactura,version,codigofin,bitsporpixel:byte;

Var

xmin,ymin,xmax,ymax,hires,vres:integer; mapacolor:maping; reservado,nplanes:byte; bytesporlinea,typopaleta:integer; sheet:array[1..58] of byte; end;

p:Array[0..5] of word; archi1:file of pcxinit; archi:file of byte; Hdr:pcxinit; punto,contador,l,npl:byte; i,j,k,x,y:integer; xmax,ymax,xmin,ymin,bpl:integer; plane,color:word; count,cuantos:longint; plano0,plano1,plano2,plano3:plano; Procedure Configura_Paleta(Colors:maping); var i:byte; Begin for i:=0 to 5 do SetRgbPalette(i,Colors[i,1] div 4,Colors[i,2] div 4,Colors[i,3] div 4); for i:=6 to 15 do begin SetRgbPalette(21+i,Colors[i,1] div 4,Colors[i,2] div 4,Colors[i,3] div 4); SetPalette(i,21+i); end; end; Procedure Pon_Punto(var x,y:integer;co:byte); begin if y<=ymax then Putpixel(x,y,co); inc(x); if x>xmax then begin x:=xmin; inc(y) end; end; Begin {$i-} assign(archi1,nombre); reset(archi1); read(archi1,Hdr); close(archi1); {$i+} {$i-} xmin:=Hdr.xmin; ymin:=Hdr.ymin; xmax:=Hdr.xmax; ymax:=Hdr.ymax; assign(archi,nombre); reset(archi); seek(archi,128); { Configura_Paleta(Hdr.mapacolor);} x:=0; y:=0; case Hdr.bitsporpixel of 4: begin repeat contador:=1; read(archi,l); if (l and $c0)=$c0 then begin contador:=l and $3f;

read(archi,punto) end else punto:=l; for i:=1 to contador do begin pon_punto(x,y,punto div 16); pon_punto(x,y,punto mod 16) end; until (Eof(Archi)) or (y>=ymax); end; 1:begin new(plano0); new(plano1); new(plano2); new(plano3); count:=0;plane:=0; bpl:=Hdr.bytesporlinea; npl:=Hdr.nplanes; cuantos:=bpl* npl*(1+ymax-ymin); for i:=0 to 3 do p[i]:=0; repeat contador:=1; read(archi,l); if (l and $c0)=$c0 then begin contador:=l and $3f; read(archi,punto) end else punto:=l; for i:=1 to contador do begin while (p[plane]>=38399) do inc(plane); case plane of 0: plano0^[p[0]]:=punto; 1: plano1^[p[1]]:=punto; 2: plano2^[p[2]]:=punto; 3: plano3^[p[3]]:=punto; end; inc(p[plane]); if (p[plane] mod bpl)=(bpl-1) then begin if plane=3 then inc(y); plane:=(plane+1) mod npl; end; end; count:=count+contador; until (Eof(Archi)) or (plane>3) or (count=cuantos); cleardevice; for y:=0 to ymax do for x:=24 to xmax-20 do begin color:=(plano0^[(bpl*y)+(x div 8)] shr (7-(x mod 8))) and 1 ; color:=color+2*((plano1^[bpl*y+(x div 8)] shr (7-(x mod 8))) and 1); color:=color+4*((plano2^[bpl*y+(x div 8)] shr (7-(x mod 8))) and 1); color:=color+8*((plano3^[bpl*y+(x div 8)] shr (7-(x mod 8))) and 1); putpixel(x,y,color); end; dispose(plano0);dispose(plano1);dispose(plano2);dispose(plano3); End; End; close(archi); {$i+} end; Begin iniciar_graficos;

readln; Lee_Pcx_16('btete.pcx');{es importante que el archivo pcx este en el mismo} SETCOLOR(0); {directorio que el programa ejecutable} {CIRCLE(100,100,40); SETFILLSTYLE(1,14); FLOODFILL(100,100,0); SETCOLOR(0); LINE(0,450,150,450);} {SETFILLSTYLE(1,LIGHTCYAN); FLOODFILL(200,100,0);} readln; End.

(*

UNIVERSIDAD DE GUADALAJARA Coordinacin de Sistemas Unidad de Cmputo Acadmico El siguiente ejemplo escribe en la pantalla una lnea horizontal con solo proyectar pixeles mediante la funcin "PUTPIXEL", y sin utilizar alguna funcin tal como: "LINE", "LINETO", "LINEREL" etc. El color por defecto es el color blanco. si no se especifica otro. *)

Program LineaHoriz; uses Crt, Graph; var xi,xf,x,y : integer; Gd, Gm : Integer; begin (* Deteccin del modo grfico de su PC*) Gd := Detect; (* Inicializacin del modo grfico*) InitGraph(Gd, Gm, 'c:\tp\bgi'); (* Verificacin de errores en el modo grfico*) if GraphResult <> grOk then Halt(1); xi:=10; xf:=100; y:=250; For x:= xi to xf do putpixel (x,y,15); (* Aqu, se escriben los pixeles, formando una lnea*) delay(5000); end.

(*

UNIVERSIDAD DE GUADALAJARA Coordinacin de Sistemas Unidad de Cmputo Acadmico El siguiente ejemplo muestra como hacer una lnea solo utiliznado

la funcin "PUTPIXEL", sin utilizar la funcin "LINE","LINETO","LINEREL" etc. El color por defecto es el color blanco, si no se especifica otro. *) Program LineaVer; uses Crt, Graph; var yi,yf,x,y : integer; Gd, Gm : Integer; begin (* Deteccin del adaptador grfico de su PC *) Gd := Detect; (* Inicializacin del modo grfico *) InitGraph(Gd, Gm, 'c:\tp\bgi'); (* Verificacin de errores en el modo grfico *) if GraphResult<>grOk then Halt(1); yi:=10; yf:=100; x:=250; For y:= yi to yf do putpixel (x,y,15); (* Aqu se escriben los pixeles en la pantalla *) delay(5000); end.

(*

UNIVERSIDAD DE GUADALAJARA Coordinacin de Sistemas Unidad de Cmputo Acadmico

Este programa realiza una tarea simple, dibuja una lnea a partir de la unidad grfica bsica, el pixel, hace una llamada a la funcin "PUTPIXEL" la cual coloca un pixel en la pantalla y por medio de un ciclo se colocan pixeles en la pantalla de tal forma que producen una lnea. El color por defecto es el color blanco, si no se especifica otro color. *) Program Linea; Uses Graph, Crt; var x1,y1, x2,y2, i:integer; (* Funcin por la cual se inicializa el modo grfico *) Procedure Iniciar; var gD : Integer; gM : Integer; ErrCode : Integer; begin gD := Detect; (* Deteccin del adaptador grfico de su PC *) InitGraph(gD,gM,'c:\tp\bgi'); (* Inicializacin del modo grfico *) ErrCode := GraphResult; if ErrCode<>grOk then (* Verificacin de error en el modo grfico *) Halt(1);

End; Begin Iniciar; i:=0; x1:=50; y1:=50; x2:=100; y2:= 100; PutPixel(x1,y1,15); (* Se dibujan un par de pixeles *) PutPixel(x2,y2,15); (* Que son el punto inicial y final de la lnea *) while (x1+i <x2) do Begin PutPixel(x1+i,y1+i,15); (* Aqu se dibujan los pixeles *) i:=i+1; (* siguientes para completar una lnea *) End; readln; CloseGraph;

End.

(*

UNIVERSIDAD DE GUADALAJARA Coordinacin de Sistemas Unidad de Cmputo Acadmico El siguiente programa realiza un ejemplo de como dibujar lneas aleatorias en una cierta zona de la pantalla, utilizando al funcin "RANDOMIZE". El color por defecto es el color blanco, si no se dice lo contrario

Program Linea; uses Crt, Graph; var Gd, Gm : Integer; begin (* Deteccin del modo grfico de su PC*) Gd := Detect; (* Inicializacin del modo grfico *) InitGraph(Gd, Gm, 'c:\tp\bgi'); (* Verificacin de errores en el modo grfico*) if GraphResult<>grOk then Halt(1);

*)

Randomize; (* Inicializacin de nmeros aleatorios *) repeat Line (Random(200), Random(200), (* Dibuja aleatoriamente una lnea en *) Random(200), Random(200)); (* en espacio 0-200. tanto para x como*) until KeyPressed; (* para y. *) ReadLn; CloseGraph; end.

(*

UNIVERSIDAD DE GUADALAJARA Coordinacin de Sistemas Unidad de Cmputo Acadmico Este programa dibuja una lnea con la funcin "LINEREL", la

*) Program Linea; uses Graph; var Gd, Gm : Integer; begin Gd := Detect; (* Deteccin del modo grfico de su PC *) InitGraph(Gd, Gm, 'c:\tp\bgi'); (* Inicializacin del modo grfico *) if GraphResult<>grOk then (* Verificacin de error en el modo *) Halt(1); MoveTo(1,2); (* "Nos movemos" hacia la posicin (1,2) *) LineRel(100, 100); (* Se dibuja la lnea a partir de la posicin (1,2) *) ReadLn; (* hasta la posicin (101,102) *) CloseGraph; end.

cual pone la figura a partir de las coordenadas anteriores, es decir las coordenadas que se utilizaron en el ltimo proceso antes de llamar a esta funcin, hasta las coordenadas relativas (dx , dy) que son pasadas como par metro de la funcin. El color por defecto es el color blanco, si no se dice lo contrario.

(*

UNIVERSIDAD DE GUADALAJARA Coordinacin de Sistemas Unidad de Cmputo Acadmico El siguiente programa realiza un ejemplo de la funcin "RECTANGLE" la cual dibuja un rectangulo o cuadrado en la pantalla, se especifican las coordenadas ( x , y ) del punto superior izquierdo del rectangulo as como el inferior derecho. El color por defecto es el color blanco, si no se especifica otro.

Program Rectangulo; Uses CRT, GRAPH; Var Gd, Gm : Integer; begin (* Deteccin del modo grfico *) Gd := Detect; (* inicializain del modo grfico *) InitGraph(Gd, Gm, 'c:\tp\bgi'); (* Verificacin de error en el modo grfico *) if GraphResult<>grOk then Halt(1); Rectangle(280,150,40,30); Delay (5000); CloseGraph; (* Cerrar modo grfico *) End. (* UNIVERSIDAD DE GUADALAJARA

*)

Coordinacin de Sistemas Unidad de Computo Acadmico El siguiente programa realiza un ejemplo de la funcin "CIRCLE" la cual dibuja un crculo con coordenadas especificadas en los par metros de la funcin, as tambin el radio. El color por defecto es el color blanco, si no se especifica otro. Program circulo; uses Graph; var Gd, Gm: Integer; Radius: Integer; begin (* Deteccin del modo grfico de su PC *) Gd := Detect; (* Inicializacin del modo grfico *) InitGraph(Gd, Gm, 'c:\tp\bgi'); (* Verificacin de error en el modo grfico *) if GraphResult<>grOk then Halt(1); for Radius := 1 to 5 do Circle(100, 100, Radius*10); ReadLn; CloseGraph; end. (* UNIVERSIDAD DE GUADALAJARA Coordinacin de Sistemas Unidad de Cmputo Acadmico El siguiente programa dibuja un circulo en la pantalla y dos lneas que atraviezan el circulo por el centro, llama primeramente al procedimiento "Circulo". El procedimiento dibuja un circulo, realizando los calculos necesarios para poder dibujar tal figura. El color por defecto es el color blanco, si no se especifica otro. *) Program circulo_ecuacion; Uses Graph, crt; Var xc, yc, radio : integer; Procedure iniciar; Var Gd, Gm : Integer; *)

begin (* Deteccin del adatpador grfico de su PC *) Gd := Detect; (* Inicializacin del modo grfico *) InitGraph(Gd, Gm, 'c:\tp\bgi'); (* Verificacin de error en el modo grfico *)

if GraphResult<>grOk then Halt(1); end; (* Este procedimiento inicializa primeramente el modo grfico, llamado al procedimiento " iniciar ", posteriormente, realiza los calculos necesarios para dibujar una circunferencia en la pantalla, con dos lneas que pasan por el centro de ella. *) Procedure circulo (xc, yc, radio : integer); Const fi = 1.33; Var dtheta, ct,st,x,y,xtemp : real;

Begin iniciar; radio:=20; dtheta := 1/radio; ct:=cos(dtheta); st:=sin(dtheta); x:=0; xc:=150; yc:=150; y:=radio; while y >= x do begin (* Las lneas siguientes dibujan el circulo *) putpixel(round(xc+x),round(yc+y*fi),15); putpixel(round(xc-x),round(yc+y*fi),15); putpixel(round(xc+x),round(yc-y*fi),15); putpixel(round(xc-x),round(yc-y*fi),15); (* Estos cuatro renglones siguientes dibujan las lneas*) putpixel(round(xc+y),round(yc+y*fi),15); putpixel(round(xc-y),round(yc+y*fi),15); putpixel(round(xc+y),round(yc-y*fi),15); putpixel(round(xc-y),round(yc-y*fi),15); xtemp:=x; x:=(x*ct-y*st); y:=(y*ct+xtemp*st)

end; end; Begin

Circulo(xc,yc,radio); (* Llamada al procedimiento *) readln; closegraph; end. (* UNIVERSIDAD DE GUADALAJARA Coordinacin de Sistemas Unidad de Cmputo Acadmico Este programa dibuja en la pantalla un crculo, a partir de pixeles que se desplazan por el permetro del crculo hasta llegar a completar la figura. El color por defecto es el blanco, si no se especifica otro. *)

Program Rect_Circulo; Uses Graph,Crt; Var xc,yc,radio : real; Procedure Iniciar; var Gd,Gm:Integer; begin (* Deteccin del adaptador grfico de su PC *) Gd := Detect; (* Inicializacin del modo grfico *) InitGraph(Gd, Gm, 'c:\tp\bgi'); (* Verificacin de error en el modo grfico *) if GraphResult<>grOk then Halt(1); end; Procedure Trazar_Circ(xc,yc,radio:real); Const dos_Pi = 6.28318; fi = 1.33; Var dtheta,ct,st,x:real; y,xtemp:real; cont:integer; Begin (* Se realizan los calculos suficientes para definir la figura*) radio:=50; xc:=300; yc:=250; dtheta:=dos_Pi/21*radio; ct:=cos(dtheta); st:=sin(dtheta); x:=0; y:=radio; moveto(round(xc+x),round(yc+y*fi)); for cont:= 1 to round(591*radio) do begin xtemp:=x; x:=(x*ct-y*st); y:=(y*ct+xtemp*st); (* Dibujar los pixeles en el permetro del crculo *) putpixel(round(xc+x),round(yc+y*fi),15) end; end; begin iniciar; (* Inicializar grficos *) Trazar_circ(xc,yc,radio); (* dibujar el crculo*) readln; end. (* UNIVERSIDAD DE GUADALAJARA Coordinacin de Sistemas Unidad de Cmputo Acadmico Este programa da un ejemplo de la funcin grfica "ELLIPSE", la cual dibuja una elipse los par metros de esta funcin son: coordenadas ( x , y ), ngulo inicial y final, foco1 y foco2. El color por defecto el el color blanco, si no se especifica otro. Program Elipse;

*)

uses Graph; var Gd, Gm: Integer; begin (* Deteccin del modo grfico de su PC *) Gd := Detect; (* Inicializacin del modo grfico *) InitGraph(Gd, Gm, 'c:\tp\bgi'); (* Verificacin de error en el modo grfico *) if GraphResult<>grOk then Halt(1); Ellipse(100,100,0,360,30,50); Ellipse(100,100,0,180,50,30); ReadLn; CloseGraph; (* Cierre de modo Grfico *) end. (* UNIVERSIDAD DE GUADALAJARA Coordinacin de Sistemas, Unidad de Cmputo Acadmico *) El siguiente programa es un ejemplo del funcionamiento la funcin grfica "BAR",la cual dibuja una barra de Histograma en las coordenadas indicadas a la funcin. El color por defecto si no se indica es el color blanco. *)

(*

Program Barras; (* Ejemplo de Bar *) uses Graph; var Gd, Gm, I, Width: Integer; begin (* Se detecta el tpo de adaptador grfico de su PC *) Gd := Detect; (* Se inicializa el modo grfico *) InitGraph(Gd, Gm, 'C:\TP\BGI'); (* Verificacin de error al inicializar el modo grfico *) if GraphResult<>grOk then Halt(1); Width := 10; (* Dibujo del Histograma *) for I := 1 to 5 do Bar(I*Width, I*10, Succ(I)*Width, 200); ReadLn; CloseGraph; end. (* UNIVERSIDAD DE GUADALAJARA Coordinacin de Sistemas Unidad de Computo Acadmico El siguiente programa es un ejemplo de la funcin "BAR3D" la cual dibuja una barra de Histograma en 3 dimensiones, las coordenadas son especificadas en los par metros de la funcin, as como la profundidad de la barra y si deve estar abierta o cerrada en la parte superior de la barra. Este ltimo par metro es booleano, puede expresarse con las constantes TopOn y TopOff, que indican uno y cero respectivamente.

El color por defecto es el color blanco, si no se especifica lo contrario. Program Barras3; uses Graph; var Gd, Gm: Integer; y0, y1, y2, x1, x2: Integer; begin (* Deteccin del modo grfico *) Gd := Detect; (* Inicializacin del modo grfico *) InitGraph(Gd, Gm, 'c:\tp\bgi'); (* Verificacin de error al inicializar el modo grfico *) if GraphResult<>grOk then Halt(1); y0 := 10; y1 := 60; y2 := 110; x1 := 10; x2 := 50; Bar3D(x1, y0, x2, y1, 10, TopOn); (* Este Histograma es cerrado *) Bar3D(x1, y1, x2, y2, 10, TopOff);(* Este Histograma es abierto *) ReadLn; CloseGraph; end. (* UNIVERSIDAD DE GUADALAJARA Coordinacin de Sistemas Unidad de Cmputo Acadmico El siguiente programa realiza un ejemplo de la fucin "PIESLICE" la cual dibuja un sector, los par metros de esta funcin son: las coordenadas del centro del sector, el ngulo inicial y el ngulo final del sector, y finalmente el radio del sector. El color por defecto es el color blanco, si no se especifica otro.

*)

*) Program Sectores; uses Graph; const Radius = 30; var Gd, Gm : Integer; begin (* Deteccin del modo grfico de su PC *) Gd := Detect; (* Inicializacin del modo grfico *) InitGraph(Gd, Gm, 'c:\tp\bgi'); (* Verificacin de error en la inicializacin de los grficos *) if GraphResult<>grOk then Halt(1); (* Dibuja un sector con centro en 100, 100 con un ngulo inicial de 0 grados hasta 270 grados, y el radio de 30 pixeles de ancho. *) PieSlice(100, 100, 0, 270, Radius); ReadLn; CloseGraph; end.

(*

UNIVERSIDAD DE GUADALAJARA Coordinacin de Sistemas Unidad de Cmputo Acadmico

El siguiente programa realiza un ejemplo de la utilizacin de la funcin "PIESLICE", para ver como se realiza una grfica Estadistica de Pastel, cada sector ( PIESLICE ),es representado con un relleno distinto para poder distinguir cada uno de los sectores. Program pastel_Graph; Uses Graph, Crt; type STR5 = string[5]; const { En este arreglo estan contenidas todas las 8 categorias de la grfica de pastel, ademas de que cada grfica representa un ao desde 1986 hasta 1989 } Accounts : array[1..4,1..9] of integer = (( 1986, 133, 35, 33, 17, 29, 15, 17, 32 ), ( 1987, 122, 41, 30, 25, 18, 24, 43, 21 ), ( 1988, 111, 65, 57, 14, 17, 39, 32, 17 ), ( 1989, 100, 60, 70, 12, 16, 13, 17, 12 ) ); { Este arreglo contiene el nombre de las 8 categorias de la grfica } AccTypes : array[1..9] of STR5 = ( ' ', 'Motor', 'Acsry', 'Reprs', 'Govmt', 'Lease', 'Tires', 'Paint', 'Misc'); Var GraphDriver, GraphMode, MaxColors, ErrorCode, XWidth, YHeight, ZDepth, XAxis, YAxis, ZAxis, XOrg, YOrg, MaxX, MaxY : integer; Scale, AspR : Real; (* Procedimiento de inicializacin de grficos *) Procedure initialize; Var Xasp, yasp : Word; Begin (* Deteccin del adaptador grfico de su PC *) GraphDriver := DETECT; (* Inicializacin del modo grfico *) InitGraph (GraphDriver, GraphMode, 'c:\tp\bgi' ); ErrorCode:=GraphResult; (* Verificacin de algn error en el modo grfico *) If ErrorCode<>grOK then begin writeln('Error de graficos: ', GraphErrorMsg(errorCode) ); halt(1); end; MaxColors := GetMaxColor + 1; GetAspectRatio(xasp, yasp); AspR:=xasp / yasp; MaxX := GetMaxX; MaxY := GetMaxY; end; (* Procedimiento por el cual se espera hasta que el usuario teclee algo*) *)

procedure pause; Var Ch : Char; Begin While keypressed do ch:= ReadKey; Ch := readKey; end; (* Funcin que convierte cualquier entero en una cadena, y esta es retornada*) function I2S (Value : integer) :string; var buffer : string[10]; begin str(value, Buffer); I2S := Buffer; end; { El siguiente procedimiento dibuja toda una grfica de pastel, con sus 8 categoras, y la divisn de cada una de ellas } procedure PieGraph( DataSet, x, y : integer); Const BlankLine = $0000; Var i, m, r, s, t, HJust, VJust, Total, CapColor : integer; ArcRec : ArcCoordsType; Begin m := 135; Total := 0; for i := 2 to 9 do inc( Total, Accounts[ DataSet, i ] ); r:=Total div 4; { Se define el tipo de lnea para dibujar los sectores } SetLineStyle ( UserBitLn, BlankLine, NormWidth); { Se define el tipo de relleno para el sector } SetFillStyle ( 0, 0 ); { Se dibuja el sector } PieSlice ( x, y, m, m+1, r+10 ); { Se capturan la coordenadas del sector } GetArcCoords ( ArcRec ); if MaxColors > 4 then SetColor (White); { Se especifica el tipo de texto para escribir el ao } SetTextStyle (SansSerifFont, HorizDir, 2 ); { Si indica la justificacin del texto } SetTextJustify (RightText, BottomText ); { Y por ultimo se escribe el texto deceado, en este caso el ao } OutTextXY (ArcRec.xEnd, ArcRec.yEnd, I2S (Accounts[ DataSet, 1 ] ) ); { Nuevamente se cambia de tipo de letra por el tipo "DefaultFont" } SetTextStyle( DefaultFont, HorizDir, 1 ); if maxColors > 4 then SetColor (EGAYellow); s := 0; t := 0; { En este ciclo se dibujan sector por sector de la grfica de pastel } for i := 2 to 9 do begin { Se obtine cada vez un tipo distinto de rellenado para diferenciar un sector de otro } SetFillStyle( i-1, i-1 ); if MaxColors > 4 then SetColor( white );

{ Se especifica un tipo de lnea solida para dibujar los sectores } SetLineStyle ( SolidLn, 0, NormWidth ); { Se realizan los calculos necesarios para completar el circulo } inc( t, round( 360 * ( Accounts[ DataSet, i ] / Total ) + 0.5 ) ); if t > 360 then t := 360; if ( i = 9 ) AND ( t<360 ) then t := 360; { Y finalmente se dibuja la grfica } PieSlice ( x, y, s, t, r ); { Nuevamente se define el tipo de lnea para dibujar } SetLineStyle ( UserBitLn, BlankLine, NormWidth ); { Y tambin se define el tipo de relleno } SetFillstyle( 0, 0 ); CapColor := i+8; { Si el valor de colores es m s de 15, es decir el m ximo de colores se inicializa nuevamente en 7 } if CapColor > 15 then capcolor := 7; if MaxColors > 4 Then SetColor ( CapColor ); m := round ( ( t-s ) / 2 + s ); { Se dibuja el sector } PieSlice( x, y, m, m+1, r+5 ); GetArcCoords( ArcRec ); if ArcRec.xEnd > x then HJust := LeftText else HJust := RightText; if ArcRec.yEnd > y then VJust := TopText else VJust := BottomText; { Finalmente se define la justificacin del texto y el texto que corresponde a cada sector de la grfica } SetTextJustify( HJust, VJust ); OutTextXY( ArcRec.xEnd, ArcRec.yEnd, AccTypes[i] ); s := t; end; end; { Este procedimeinto es el encargado de presentar las grficas con todos los datos necesarios } procedure DrawGraphs; Var i : integer; begin ClearDevice; { Se limpia la pantalla } GraphDefaults; { Se dibuja el marco la grfica } Rectangle( 0, 0, MaxX, MaxY); { Se dibuja la primera grfica } PieGraph( 1, GetMaxX div 4, GetMaxY div 4 ); { Se dibuja la segunda grfica } PieGraph( 2, GetMaxX div 4, 3*GetMaxY div 4 ); { Se dibuja la tercera grfica } PieGraph( 3, 3*GetMaxX div 4, GetMaxY div 4 ); { Se dibuja la cuarta grfica } PieGraph( 4, 3*GetMaxX div 4, 3*GetMaxY div 4 ); end; begin Initialize; { Inicializacin de grficos } DrawGraphs; { Se manda llamar el procedimiento para dibujar las grficas } Pause; { Espera una pausa antes de terminar el programa } CloseGraph; end. { UNIVERSIDAD DE GUADALAJARA

Coordinacin de Sistemas Unidad de Cmputo Acadmico El siguiente programa muestra como se pueden realizar programas para dibujos de tercera dimensin, este programa muestra un modelo de automovil, el cual puede ser rotado para ser visto en varias perspectivas, para poder ver estas perspectivas se utilza el teclado numerico, la tecla 8 mueve hacia arriba el modelo, la tecla 2 mueve el modelo hacia abajo, la tecla 4 mueve el modelo a la izquierda y la tecla 6 mueve el modelo a la derecha. Para salir del programa presione la tecla " Q ". PROGRAM PRESENT; uses Crt, Graph; var BE,ba,bi, GD,t, GM: Integer; C: CHAR; Xasp, Yasp: word; rxasp, ryasp, p: real; x,y,z: real; ratio, Angular,prof: real; switch: integer; xa,ya,za: real; R1,R2,R3: REAL; CR1,CR2,CR3: REAL; SR1,SR2,SR3: REAL; s : string; { Este procedimiento es el que realiza el movimiento en 3D, utiliza las variables en donde se guardan los datos de los c lculos de Cosenos y Senos y obtiene la coordenada cartesiana en "X", "Y" y "Z" } procedure move3d(x,y,z: real); begin xa:=cr1* x-sr1* z; za:=sr1* x+cr1* z; x:=cr2*xa+sr2* y; ya:=cr2* y-sr2*xa; z:=cr3*za-sr3*ya; y:=sr3*za+cr3*ya; moveto(round(angular* x/(prof-z))+320 ,175-round(Ratio*angular* y/(prof-z)) ); end; { Este procedimeinto junto con "MOVE3D" realizan el c lculo de la coordenada y dibujo de la lnea en esa posicin } procedure join3d(x,y,z: real); var x1,y1,x2,y2:integer; begin x1:=getx; y1:=gety; move3d(x,y,z); x2:=getx; y2:=gety; line(x1,y1,x2,y2); { Se dibuja la lnea ya en 3D } end; { Este procedimeinto utiliza los las propiedades de los otros procedimeintos para calcular la posicin en 3D y dibujar una lnea en tal posicin } procedure lini(x1,y1,z1,x2,y2,z2:real);

begin move3d(x1,y1,z1); join3d(x2,y2,z2); end; { El siguinete procedimiento obtiene el c lculo con las funciones trigonometricas "Seno" y "Coseno", y de los nmeros enviados como par metros, y este c lculo se deposita en las variables globales "SR1","SR2","SR3","CR1","CR2" y "CR3" } procedure setupang(a1,a2,a3: real); begin SR1:=sin(a1); CR1:=cos(a1); SR2:=sin(a2); CR2:=cos(a2); SR3:=sin(a3); CR3:=cos(a3); end; { Esta funcin obtiene el angulo dado en radianes } function radian( th: integer ): real; begin radian:=(pi/180.0*th); end; { Este procedimiento obtiene las coordenadas cartesianas en 3D para el eje Z en el dibujo de un circulo, y dibuja la lnea corespondiente a este punto para el circulo } procedure circuloz(x1,y1,z1,r :real ); var ang,inc : real; begin move3d(x1+r,y1,z1); ang:=0.0; inc:=pi/18; while ang<= 2*pi+0.1 do begin join3d(x1+r*cos(ang),y1+r*sin(ang),z1); ang:=ang+inc; end; end; { Este procedimiento obtiene las coordenadas cartesianas en 3D para el eje Y en el dibujo de un circulo, y dibuja la lnea corespondiente a este punto para el circulo } procedure circuloy(x1,y1,z1,r :real ); var ang,inc : real; begin move3d(x1,y1,z1+r); ang:=0.0; inc:=pi/18; while ang<= 2*pi+0.1 do begin join3d(x1+r*sin(ang),y1,z1+r*cos(ang)); ang:=ang+inc; end; end; { Este procedimiento obtiene las coordenadas cartesianas en 3D para el eje X en el dibujo de un circulo, y dibuja la lnea corespondiente a este punto para el circulo } procedure circulox(x1,y1,z1,r :real ); var ang,inc : real; begin

move3d(x1,y1+r,z1); ang:=0.0; inc:=pi/18; while ang<= 2*pi+0.1 do begin join3d(x1,y1+r*cos(ang),z1+r*sin(ang)); ang:=ang+inc; end; end; { Este procedimiento obtiene las coordenadas cartesianas en 3D para el eje Z en el dibujo de una elipse, y dibuja la lnea corespondiente a este punto para la elipse } procedure ellipsez(x1,y1,z1,r,ex,ey,ani,anf :real ); var ang,inc,r1,r2 : real; begin r1:=r*ex; r2:=r*ey; move3d(x1+r1*cos(ani),y1+r2*sin(ani),z1); ang:=ani; inc:=pi/18; while ang<= anf+0.1 do begin join3d(x1+r1*cos(ang),y1+r2*sin(ang),z1); ang:=ang+inc; end; end; { Este procedimiento obtiene las coordenadas cartesianas en 3D para el eje Y en el dibujo de una elipse, y dibuja la lnea corespondiente a este punto para la elipse } procedure ellipsey(x1,y1,z1,r,ex,ez,ani,anf :real ); var ang,inc,r1,r2 : real; begin r1:=r*ex; r2:=r*ez; move3d(x1+r1*sin(ani),y1,z1+r2*cos(ani)); ang:=ani; inc:=pi/18; while ang<= anf+0.1 do begin join3d(r1*sin(ang),y1,r2*cos(ang)); ang:=ang+inc; end; end; { Este procedimiento obtiene las coordenadas cartesianas en 3D para el eje X en el dibujo de una elipse, y dibuja la lnea corespondiente a este punto para la elipse } procedure ellipsex(x1,y1,z1,r,ey,ez,ani,anf :real ); var ang,inc,r1,r2 : real; begin r1:=r*ey; r2:=r*ez; move3d(x1,y1+r1*cos(ani),z1+r2*sin(ani)); ang:=ani; inc:=pi/18; while ang<= anf+0.1 do begin join3d(x1,y1+r1*cos(ang),z1+r2*sin(ang)); ang:=ang+inc; end; end;

{---------------------------- Programa principal--------------------------- } begin GD := 9; GM := 1; { Inicializacin de grficos } InitGraph(GD, GM, 'c:\tp\bgi'); { } if GraphResult<>grOk then Halt(1); Angular:=600.0; Prof:=1000; { Se tiene una profundidad de 1000 para ser visto mejor } p:=-1; switch := -1; r1:=radian(0); r2:=radian(0); r3:=radian(0); { Se obtienen los grados radianes de cierto nmero }

setupang(r1,r2,r3); { Se obtienen los angulos en radianes de dichos nmeros} GetAspectRatio(Xasp, Yasp); RXasp:=xasp; RYasp:=yasp; Ratio:=rXasp/rYasp; c:='m'; prof:=prof+3; x:=0.0; y:=100.0; setcolor(15); { Se toma el color Blanco para dibujar el modelo } s:='-+64.028'; while c<>'Q' do begin case c of { Si se presiona la tecla "-" el modelo es reducido } '-' : prof:=prof+50; { Si se presiona la tecla "+" el modelo si amplia } '+' : prof:=prof-50; { Si se presiona "0, 6, 4, 2, 8, ." el model solo rotar } '0' : r1:=r1+radian(10); '.' : r1:=r1-radian(10); '6' : r2:=r2+radian(10); '4' : r2:=r2-radian(10); '2' : r3:=r3+radian(10); '8' : r3:=r3-radian(10); end; setupang(r1,r2,r3); { Nuevamente se obtienen los angulos de los nmeros } setcolor(15); { Enseguida se dibuja cada lnea que conforma el modelo, as como los circulos y elipses del mismo en 3D } lini(-200,100,400,200,100,400); lini(200,100,400,200,100,-400); lini(-200,100,-400,200,100,-400 ); lini(-200,100,400,-200,100,-400); lini(200,100,100,-200,100,100); lini(-200,100,100,-200,180,100); lini(-200,180,100,200,180,100); lini(200,180,100,200,100,100); circuloz(-100,50,400,30); circuloz(100,50,400,30); lini(-200,100,400,-200,0,400); lini(-200,0,400,200,0,400);

lini(200,0,400,200,100,400); lini(200,0,400,200,0,300); ellipsex(200,0,250,50,1,1,-pi/2,pi/2); { En seguida se muestra una pagina de memoria en la que se guarda el dibujo del modelo para posteriormente modificarlo y crear as un efecto de animacin sobre dicho modelo } if switch<0 then SetVisualPage(0) else SetVisualPage(1); switch:=switch*-1; C:=upcase(READKEY); if Pos(C,s)>0 then begin { En este caso se selecciona la p gina en la que se dibujara el modelo, en esta pagina se redibuja con unas nuevas coordenadas y despues sera mostrado y se apreciar el efecto de animacin } if switch > 0 then SetActivePage(1) { Va a pagina oculta } else SetActivePage(0); cleardevice; { Se limpia la pantalla } end; end; CLOSEGRAPH; { Se cierra el modo grfico } CLRSCR; { Y se vuelve al modo ASCII, entonces se limpia la pantalla } END. (* UNIVERSIDAD DE GUADALAJARA Coordinacin de Sistemas Unidad de Cmputo Acadmico El siguiente programa es un ejemplo de una animacin simple, abre un archivo, y comienza a hacer un desplazamiento de este junto con una barra.

*) Program avionazo; uses crt{,dos,},graph; type dibujillo=array[0..51,0..87] of byte; var Dibujo:Dibujillo; (* Buffer para el archivo, aqu se guardar n *) Fd:file of dibujillo; (* los bits del archivo leido.*) k,m,i,j:integer; G:Pointer; modo,a,b:word; gm,gd:integer; begin {detectgraph(monitor,modo);} Gd := Detect; (* Se inicializa el modo grfico *) InitGraph(Gd, Gm, 'C:\TP\BGI'); (* Verificacin de error en el modo grfico*) if graphresult<>grOK then halt; {$i-} (* Directiva de Compilacin de desctiva la verificacin de erroes*) Assign(Fd,'c:\windows\arbol.pcx'); (* Se asigna el archivo *)

Reset(Fd); if ioresult<>0 then (* Si hubo un error al abrir el archivo el *) halt (* programa termina*) else Read(Fd,Dibujo); (* Se lee el archivo y se cierra*) Close(Fd); {$i+} randomize; setfillstyle(1,lightcyan); Bar(0,0,639,479); (* Se dibuja una barra de toda la pantalla*) for m:=1 to 20 do for i:=0 to 51 do for j:=0 to 87 do (* Segun el bit correspondiente *) (* se comienza a dibujar el color*) (* de ese bit.*) putpixel(j,100+i,dibujo[i,j]); (* Aqu, comienza el primer paso para la animacin, se reserva memoria*) Getmem(G,Imagesize(0,0,87,51)); (* Una vez reservada la memoria de graba o se trae la imagen*) Getimage(0,100,87,151,G^); (* Y ya la imagen en la memoria se imprime en pantlla*) Putimage(0,100,G^,NormalPut); modo:=Normalput; setfillstyle(1,15); (* En este ciclo se comienza el corrimiento *) for i:=0 to 270 do begin bar(i*2,90,i,140); (* Se dibuja una barra variable *) setcolor(0); line(i*2,90,i,90); (* Unas lneasa que son el contorno de la barra*) line(i*2,140,i,140); setcolor(15); line(i*2,115,i,115); bar(i*2,90,i*2,140); Putimage(i*2,100,G^,modo); (* Y finalmente se proyecta la imagen de memoria, logrando as el corrimiento de la imagen. *) end; readln; end. (* UNIVERSIDAD DE GUADALAJARA Coordinacin de Sistemas Unidad de Cmputo Acadmico El siguiente programa es un editor simple de Iconos en modo grfico su funcionamiento es simple, se tiene un enrejado que es la zona en donde Ud. editar su cono, a la derecha de la pantalla aparece una leyenda "COLOR", y debajo de ella un color especfico, esto indica el color que se tiene actualmente para dibujar el cono, se puede cabiar de color solo con presionar la tecla "F2" si aparece una leyenda "ACTIVO" justo debajo del color seleccionado indica que ese color est activo en este momento para poder dibujar, para activar y desactivar colores se presiona "F1", debajo aparecen las coordenadas en que se encuentra el cursor del editor en ese momento, as como el color del pixel o del recuadro en esas coordenadas. Si presiona "F4", el editor mostrar su diseo de cono reducido, presione

la tecla "Esc" para regresar al editor. Si oprime la tecla "F5" el editor terminar su secin (exit), si presiona la tecla "F6" aparecera una ventana que le pide el nombre de un archivo creado previamente con este editor, si presiona la tecla "F7" tambin aparecer una ventana que indica con que nombre se debe grabar el archivo actual. Si presiona la tecla "F8" aparecer nuevamente su diseo de cono solo que de una escala mayor que la vista con "F4", oprima "Esc" para regresar al editor, si oprime la tecla "F9" el diseo actual es borrado por completo, la forma de desplazar el cursor atravez del enrejado es por medio de las teclas de flechas, la tecla "INSERT" al ser presionada el cursor cambia de posicin a la posicin rumbo nor-este de la ubicacin actual, la tecla "HOME" mueve el cursor hacia la posicin nor-oeste de la posicin actual, la tecla "DELETE" mueve el cursor a la posicin sur-este del punto actual del cursor, la tecla "END" mueve el cursor a la posicin sur-oeste, las teclas "PageUp" sirve para subir la posicin del nmero de color en la que estamos, la tecla "PageDown" es la contraria a "PageUp", nos " mueve " posiciones abajo del nmero de color en el que estamos. El nmero de colores va desde 0-255. *) program importa_del_PM; USES CRT,GRAPH,DOS; CONST { Constantes para detectar las teclas oprimidas } B_ESPACE=#8; ENTER=#13; ESCAPE=#27; F1=';'; F2='<'; F3='='; F4='>'; F5='?'; F6='@'; F7='A'; F8='B'; F9='C'; F10='D'; F_ARR='H'; F_I='K'; F_D='M'; F_AB='P'; DEL='S'; INS='R'; HOME='G';FIN='O';F11='T';F12='U';PU='I';PD='Q'; TYPE ARCH=RECORD INICIO:ARRAY[1..4] OF CHAR; MATRIZ:ARRAY[1..52,1..11] OF BYTE; TERMINO:CHAR;END; CONV=ARRAY[0..51,0..87] OF BYTE; PERMITIDOS=SET OF CHAR; VAR MAT:ARCH; { Buffer del archivo } ARCHIVO:FILE OF ARCH; { Declaracin del archivo } ARCHVGA:FILE OF CONV; DIBUJO:CONV;CAD:STRING; I,J,K,L:INTEGER;ALGO:CHAR; MANO,MANO2:ARRAY[1..9] OF FILLPATTERNTYPE; (* Este procedimiento como su nombre lo dice cambia el color con el que se va a colorear. Cambiando los colores en los registros de proposito general de su PC *) PROCEDURE CAMBIA_COLOR(COLOR,ROJO,VERDE,AZUL:BYTE); VAR RES:REGISTERS; BEGIN FILLCHAR(RES,SIZEOF(RES),0); WITH RES DO BEGIN AH:=$10; AL:=$10; BX:=COLOR; DH:=ROJO; CH:=VERDE; CL:=AZUL; INTR($10,RES); END; END; { Este precedimiento cambia el color y la trama en una cierta

zona del enrrejado del dibujo } PROCEDURE BOX(X1,Y1,X2,Y2,TRAMA,COLOR:INTEGER); VAR TRAM:FILLPATTERNTYPE; I:INTEGER; BEGIN FILLCHAR(TRAM,SIZEOF(TRAM),0); CASE TRAMA OF { Se selecciona el modo de relleno para una zona del dibujo } 1..9:SETFILLSTYLE(TRAMA,COLOR); 10:BEGIN FOR I:=1 TO 8 DO BEGIN TRAM[I]:=$AA; { Se selecciona un tpo de paleta definida por el usuario } SETFILLPATTERN(TRAM,COLOR); END; END; 11:BEGIN FOR I:=1 TO 8 DO BEGIN IF ODD(I) THEN TRAM[I]:=$FF ; { Se selecciona un tpo de paleta definida por el usuario } SETFILLPATTERN(TRAM,COLOR); END; END; END; BAR(X1,Y1,X2,Y2); { Una vez que se ha obtenido el color se dibuja la barra de ese color } END; { Este procedimiento dibuja en las coordenadas indicadas, una caja de la trama y colores indicados } PROCEDURE CAJA(X1,Y1,X2,Y2,TRAMA,C1,C2:WORD); VAR I,J:INTEGER; BEGIN { Se obtiene un tpo de lnea especificado por el usuario } SETLINESTYLE(USERBITLN,TRAMA,NORMWIDTH); { En seguida se dibuja una caja con un color especfico } BOX(X1,Y1,X2,Y2,1,C1); SETCOLOR(C2); FOR I:=Y1 TO Y2 DO IF ODD(I) THEN LINE(X1,I,X2,I); IF TRAMA<>0 THEN { Si la trama del dibujo es diferente de 0 se define una lnea por el usuario, y se hace una operacin a nivel de bits con la trama y el nmero hexadecimal FFFF, para determinar la lnea } SETLINESTYLE(USERBITLN,TRAMA XOR $FFFF,NORMWIDTH); FOR I:=Y1 TO Y2 DO IF NOT(ODD(I)) THEN LINE(X1,I,X2,I); END; { La siguiente funcion realiza una simple comparacin de nmeros, en la cual al variable "NUMMAY" debe ser menor o igual a "NUMMEN" e igual a "NUMMAY"} FUNCTION INN(NUMMAY,NUMERO,NUMMEN:INTEGER):INTEGER; BEGIN IF NUMERO<NUMMEN THEN NUMERO:=NUMMEN ELSE

IF NUMERO>NUMMAY THEN NUMERO:=NUMMAY; INN:=NUMERO; END; { Esta funcin devuelve la tecla presionada } FUNCTION INKEY(VAR SECUNDARIO:BOOLEAN):CHAR; VAR CAR:CHAR; BEGIN SECUNDARIO:=FALSE; CAR:=READKEY; IF (CAR=CHAR(0)) AND KEYPRESSED THEN BEGIN CAR:=READKEY; SECUNDARIO:=TRUE; END; INKEY:=CAR; END; (* Rellena una zona del enrejado "X","Y" con color "CF", y el tipo de relleno se define por "TRAMA".*) PROCEDURE PAINT(X,Y,TRAMA,CF,CB:INTEGER); BEGIN SETFILLSTYLE(TRAMA,CF); FLOODFILL(X,Y,CB); END; (* Este procedimiento dibuja el texto enviado por "CHAR4X8" dibuja pixel por poxel las letras, no utiliza las funciones grficas para proyectar texto en la pantalla, sino que es manualmente el dibujo del texto.*) PROCEDURE DIBUJ(X,Y,ESTILO,COLOR:INTEGER;FIGURA_C:FILLPATTERNTYPE); VAR I,J,NUM1,NUM2,RES,IT:BYTE;D_L,ITALICS:BOOLEAN; BEGIN RES:=0;SETCOLOR(0);D_L:=FALSE;ITALICS:=FALSE;IT:=0; IF ESTILO=3 THEN BEGIN D_L:=TRUE; ESTILO:=2 END; IF ESTILO=4 THEN BEGIN IT:=1; ESTILO:=2 END; IF ESTILO=5 THEN BEGIN IT:=1;D_L:=TRUE; ESTILO:=2 END; FOR J:=0 TO (ESTILO*4-1) DO BEGIN I:=0; NUM1:=FIGURA_C[J+1]; WHILE (NUM1>=1) DO BEGIN NUM2:=NUM1 DIV 2; RES:=NUM1-(NUM2 *2); NUM1:=NUM2; IF RES=1 THEN BEGIN IF D_L THEN BEGIN (* Aqu se dibujan pixel por pixel*)

(J*2),COLOR); 2)),Y+(J*2)+1,COLOR);

(* los caracteres de texto.*) PUTPIXEL(X+8-I+(IT*((7-J) DIV 2)),Y+ PUTPIXEL(X+8-I+(IT*((7-J) DIV END ELSE PUTPIXEL(X+8-I+(IT*((7-J) DIV

2)),Y+J,COLOR);END; I:=I+1; END; END; END; (*_______________________________________________________________________*) (* Este procedimiento es llamado por "TEXT4X8" el cual le manda un caracter y a su vez este procedimiento llama a "DIBUJ", para que este caracter sea impreso en la pantalla .*) PROCEDURE CHAR4X8(CARACTER:CHAR;XCOR,YCOR,COLOR,ESTILO:INTEGER); VAR COUNT,MASCARA,I,NIBBLE1,ASCII:BYTE; SEGMENTO,PRINCIPIO:LONGINT; FIGURA_C:FILLPATTERNTYPE;STYLE:INTEGER; BEGIN FILLCHAR(FIGURA_C,SIZEOF(FIGURA_C),0); ASCII:=ORD(CARACTER); SEGMENTO:=$F000; PRINCIPIO:=$FA6E+(ASCII*8); COUNT:=0; STYLE:=ESTILO; IF ESTILO>2 THEN ESTILO:=2; CASE ESTILO OF 1:BEGIN FOR I:=0 TO 3 DO BEGIN COUNT:=I*2; NIBBLE1:=MEM[SEGMENTO:PRINCIPIO+COUNT] ; FIGURA_C[I+1]:=NIBBLE1; END; FIGURA_C[8]:=(MEM[SEGMENTO:PRINCIPIO+7]); IF (CARACTER IN['3','8','F','E','B','K','H','b','d','f']) THEN FIGURA_C[5]:=FIGURA_C[4] OR 28; IF (CARACTER IN['E','F']) THEN FIGURA_C[6]:=FIGURA_C[6] AND 239; IF (CARACTER='p') THEN FIGURA_C[7]:=FIGURA_C[7] OR 24; IF (CARACTER IN['q','g']) THEN FIGURA_C[7]:=FIGURA_C[7] OR 12; END; 2: BEGIN FOR I:=0 TO 7 DO FIGURA_C[I+1]:=(MEM[SEGMENTO:PRINCIPIO+I]); END; END; (* Llamada al procedimiento para que dibuje el caracter.*) DIBUJ(XCOR,YCOR,STYLE,COLOR,FIGURA_C); END; (*_______________________________________________________________________*) (* Este procedimiento manda llamar a sus hijos para que sea impreso en la pantalla el texto pasado como par metro, este texto es escrito pixel por pixel, no se utilizan funcines grficas de texto. *) PROCEDURE TEXTO4X8(TEXTO:STRING;XCOR,YCOR,COLOR,ESTILO:INTEGER); VAR COLUM,I:INTEGER;

BEGIN COLUM:=XCOR; FOR I:=1 TO LENGTH(TEXTO) DO BEGIN (* Llamada al procedimiento para que escriba el caracter.*) CHAR4X8(TEXTO[I],COLUM,YCOR,COLOR,ESTILO); COLUM:=COLUM+8; END; END; (*_______________________________________________________________________*) { El siguiente procedimiento escribe en la pantalla (con texto especificado por el programador no con funciones grficas de texto), en la parte de la patalla especificada por "COLUMNA" } PROCEDURE CENT(FRASE:STRING;Y,XMEN,XMAY,COLOR,ESTILO:INTEGER); VAR COLUMNA:INTEGER; BEGIN COLUMNA:=XMEN+(((XMAY-XMEN)-(LENGTH(FRASE)*8)) DIV 2); TEXTO4X8(FRASE,COLUMNA,Y,COLOR,ESTILO); END; (*_______________________________________________________________________*) { Este procedimiento es usado cada vez que se intenta grabar o abrir un archivo, porque es capaz de escribir en modo grfico y la cadena escrita se obtiene en la variable "CAD" } PROCEDURE LEE_CADENA(VAR CAD:STRING;NUM:INTEGER;DAT:PERMITIDOS); VAR I,J,K,X,Y:INTEGER; CAR:CHAR; BEGIN I:=1; CAR:=' '; X:=GETX; Y:=GETY; { Escribir texto en las coordenadas "X", "Y", y de colr rojo } TEXTO4X8(CAD,X,Y,RED,2); MOVETO(X,Y); CAR:=UPCASE(READKEY); { Verifica la primera tecla presionada } { Si la tecla presionada fue "ENTER" se mueve de posicin, y dibuja una caja de color blanco y la variable "CAD" toma el valor de ENTER } IF CAR<>#13 THEN BEGIN BOX(X,Y,X+(LENGTH(CAD)*8),Y+8,1,WHITE); FILLCHAR(CAD,SIZEOF(CAD),0); MOVETO(X,Y); END; { Si la tecla presionada es diferente de "ENTER" se inserta en la variable "CAD" } WHILE (CAR<>#13) DO BEGIN IF (CAR IN DAT) AND (I<=NUM) THEN INSERT(CAR,CAD,I); { Si la tecla presionada es "BACKSPACE" se recorre una posicin y borra el caracter anterior con una barra blanca } IF (CAR=#8) AND (I>1) THEN BEGIN DELETE(CAD,I-1,1); MOVETO(X+((I-2)*8),Y); BOX(GETX,GETY,GETX+8,GETY+8,1,WHITE); END; { En caso de que la tecla oprimida haya sido "ESC" la variable "CAD" no toma valor alguno } IF CAR=#27 THEN BEGIN

BOX(X,Y,X+(LENGTH(CAD)*8),Y+8,1,WHITE); MOVETO(X,Y);CAD:=''; END; I:=LENGTH(CAD)+1; MOVETO(X,Y); TEXTO4X8(CAD,GETX,GETY,RED,2); { Si la tecla presionada es algn caracter este se imprime en la pantalla } CAR:=UPCASE(READKEY); { Y espera a que presione la siguiente tecla } END; MOVETO(X,Y+1); END; (*_______________________________________________________________________*) (* Este procedimiento crea el enrajado de la zona donde se dibuja el cono *) PROCEDURE Rejilla(X,Y:INTEGER); VAR I,J:INTEGER; BEGIN SETLINESTYLE(USERBITLN,$FFFF,NORMWIDTH); SETCOLOR(BLUE); FOR I:=0 TO 87 DO FOR J:=0 TO 51 DO RECTANGLE(X+(I*6),Y+(J*6),X+(I*6)+6,Y+(J*6)+6); END; { Este procedimiento rellena una zona del dibujo de un cierto color } PROCEDURE DIBUJA2(X,Y:INTEGER); VAR I,J,K,H,COLOR:INTEGER; COMODIN:BYTE; BEGIN WITH MAT DO BEGIN FOR I:=0 TO 51 DO FOR J:=0 TO 10 DO FOR K:=7 DOWNTO 0 DO BEGIN { Primero se obtiene el color para dibujar en la variable "COMODIN" } COMODIN:=(MATRIZ[I+1,J+1] AND (1 SHL K)) DIV (1 SHL K) XOR 1; COMODIN:=COMODIN*15; { Comienza a dibujar la zona del color determinado por "COMODIN" } PAINT(X+2+((J*8)+7-K)*6,Y+((I)*6)+2,1,COMODIN,BLUE); DIBUJO[I,(7-K)+(J*8)]:=COMODIN; END; END; END; PROCEDURE DIBUJA(X,Y,INC,DEC:INTEGER); VAR I,J,K,H,MONITOR,MODO,COLOR:INTEGER; COMODIN:BYTE; BEGIN DETECTGRAPH(MONITOR,MODO); IF (MONITOR=VGA) THEN COLOR:=yellow ELSE COLOR:=1; WITH MAT DO BEGIN FOR I:=1 TO 52 DO FOR J:=1 TO 11 DO FOR K:=7 DOWNTO 0 DO BEGIN COMODIN:=(MATRIZ[I,J] AND (1 SHL K)) DIV (1 SHL K) XOR 1; COMODIN:=COMODIN*COLOR; SETCOLOR(COMODIN);

LINE(X+((J*8*INC DIV DEC)-(K*INC DIV DEC)),Y+I, X+((INC-1) DIV DEC)+((J*8*INC DIV DEC)-(K*INC DIV DEC)),Y+I); END; END; END; { El siguiente procedimiento dibuja en la pantalla el dibujo que ha creado en una escala menor } PROCEDURE DIBUJA_CH; VAR I,J:INTEGER; COMODIN:POINTER; SECUNDARIO:BOOLEAN; K:CHAR; BEGIN { Primero se guarda memoria sobre la cual se guardar la imagen } GETMEM(COMODIN,IMAGESIZE(100,80,187,131)); { Posteriormente se guarda la imagen en la memoria } GETIMAGE(100,80,187,131,COMODIN^); K:=' '; FOR I:=0 TO 51 DO FOR J:=0 TO 87 DO { Se presenta el dibujo en una escala menor } PUTPIXEL(100+J,80+I,DIBUJO[I,J]); REPEAT K:=INKEY(SECUNDARIO); { No se hace otra accin hasta presionar "ESC" } UNTIL (K=CHR(27)); { Despues de imprime la imagen guardada en memoria } PUTIMAGE(100,80,COMODIN^,NORMALPUT); { Y se libera la memoria en la que se guardo el imagen } FREEMEM(COMODIN,IMAGESIZE(100,80,187,131)); END; { El siguente procedimiento dibuja una serie de cajas con un color y un trama } PROCEDURE DIBUJA3; VAR I,J,X,Y,CO:INTEGER; ES:WORD; BEGIN X:=100; Y:=10; FOR I:=0 TO 51 DO FOR J:=0 TO 87 DO BEGIN CO:=DIBUJO[I,J] DIV 16;{ Se obtiene el color de las lneasa de la caja } IF DIBUJO[I,J]>15 THEN { Esta sentencia obtine el trama de la caja } ES:=$AAAA ELSE ES:=0; { Una vrez obtenidos los datos se dibuja la caja } CAJA(X+(J*6)+1,Y+(I*6)+1,X+(J*6)+5,Y+(I*6)+5,ES,DIBUJO[I,J],CO); END; END; { Este procedimiento realiza una operacin parecida a la efectuada por el procedimiento "DIBUJA_CH" proyecta el dibujo creado en una escala menor } PROCEDURE DIBUJA4; VAR I,J:INTEGER; SECUNDARIO:BOOLEAN; K:CHAR; COMODIN:POINTER; BEGIN

{ Primero se reserva memoria para guardar la imagen } GETMEM(COMODIN,IMAGESIZE(100,80,296,184)); { Posteriormente se gurada la imagen en la memoria reservada } GETIMAGE(100,80,296,184,COMODIN^); K:=' '; FOR I:=0 TO 51 DO FOR J:=0 TO 87 DO BEGIN { Y finalmente se dibuja la imagen } BOX(100+(J*2),80+(I*2),101+(J*2),81+(I*2),1,DIBUJO[I,J]); IF DIBUJO[I,J]>15 THEN PUTPIXEL(101+(J*2),81+(I*2),DIBUJO[I,J] DIV 16); END; REPEAT K:=INKEY(SECUNDARIO); { El programa no realiza otra accin hasta no presionar "ESC" } UNTIL (K=CHR(27)); { Una vez precionado "ESC" se proyecta la imagen guardada en memoria } PUTIMAGE(100,80,COMODIN^,NORMALPUT); { Y se libera esa memoria } FREEMEM(COMODIN,IMAGESIZE(100,80,296,184)); END; (* Este procedimiento graba en disco el archivo o dibujo ya echo. *) PROCEDURE GRABA_EN_DISCO; BEGIN WRITE(ARCHVGA,DIBUJO); CLOSE(ARCHVGA); END; (* Este procedimiento abre un archivo de disco creado previamente con el editor. *) PROCEDURE LLAMA_DE_DISCO; BEGIN READ(ARCHVGA,DIBUJO); CLOSE(ARCHVGA); END; (* Este procedimiento actua segun sea "OPCION", si fue "F6", pide el nombre del archivo para guardarlo en el disco, si fue "F7", pide el nombre del archivo para abrirlo desde el disco. *) PROCEDURE VENTANA_DISCO(OPCION:CHAR;VAR DIBUJO:CONV); VAR I,J:INTEGER;WIN:POINTER;NOMBRE:STRING; BEGIN {$I-} { Primero se guarda la imagen donde se dibujara sobre ella } GETMEM(WIN,IMAGESIZE(100,30,440,70)); GETIMAGE(100,30,440,70,WIN^); { Y posteriormente se dibuja la ventana de di logo } CAJA(120,30,440,70,$CCCC,BLUE,BLACK); BOX(140,40,420,60,1,WHITE);NOMBRE:=''; CASE OPCION OF 'G':BEGIN { Si la tecla fu F6 se grabar un archivo} TEXTO4X8(' NOMBRE DEL ARCHIVO A GRABAR:',122,42,GREEN,4); MOVETO(142,52); { Se lee el nombre del archivo } LEE_CADENA(NOMBRE,25,['A'..'Z','.','\',':','0'..'9']); IF NOMBRE<>'' THEN BEGIN ASSIGN(ARCHVGA,NOMBRE);{ Se asigna el archivo } REWRITE(ARCHVGA); { Se borra lo que tenga } WRITE(ARCHVGA,DIBUJO) { Y finalmente se guarda el dibujo } END END;

'L':BEGIN { Si la tecla fu F7 se abrir un archivo de disco } TEXTO4X8(' NOMBRE DEL ARCHIVO A LLAMAR:',122,42,GREEN,4); MOVETO(142,52); { Se lee el nombre del archivo } LEE_CADENA(NOMBRE,25,['A'..'Z','.','\',':','0'..'9']); IF NOMBRE<>''THEN { Si el nombre del archivo es diferente de '' este archivo es guardado } BEGIN ASSIGN(ARCHVGA,NOMBRE); { Se asigna el archivo } RESET(ARCHVGA); { Se borra el contenido } READ(ARCHVGA,DIBUJO) { Y se lee el archivo de disco } END END; END; IF IORESULT<>0 THEN WRITE(CHR(7)); { Finalmente se restablece la imagen } PUTIMAGE(100,30,WIN^,NORMALPUT); {$I+} END; { Este procedimiento es el encargado de todo el trabajo ya que desde aqu son llamdos todos los demas porcedimientos para la creacin del dibujo, segn desee el usuario } PROCEDURE CREA_IMAGEN(X1,Y1:INTEGER); VAR X,Y,I,J,K,CO2,CO21:INTEGER; DISP,SECUNDARIO:BOOLEAN; OP:CHAR; ESTILO,ES2:WORD; CI2:STRING[20]; BEGIN K:=0; J:=0; X:=X1; Y:=Y1; I:=0; DISP:=FALSE; SECUNDARIO:=FALSE; { Escribe el texto sobre el lugar en el que se visualizan los diferentes colores } TEXTO4X8('COLOR',30,100,BLUE,3); REPEAT IF I>16 THEN ESTILO:=$AAAA ELSE ESTILO:=0; CO2:=I DIV 16; { Se crea la caja o ventana donde se visualizan los colores } CAJA(30,125,70,135,ESTILO,I,CO2); { Se dibuja l acaja donde se especifica el nmero de color y posicin } BOX(36,280,98,320,1,WHITE);STR(I,CI2); { Imprime en la pantalla la palabra "COLOR" que indica el nmero de color que se esta usando } TEXTO4X8('COLOR: '+CI2,10,300,RED,2); STR(J,CI2); { Imprime la letra "X" para indicar la coordenada en x del cursor del editor } TEXTO4X8('X: '+CI2,20,280,BROWN,2); STR(K,CI2); { Imprime la letra "Y" para indicar la coordenada en y del cursor del editor } TEXTO4X8('Y: '+CI2,20,290,BROWN,2);

STR(DIBUJO[K,J],CI2); { Imprime la palabra "PIXEL" que indica la posicin en "X", "Y" del cursor del editor } TEXTO4X8('PIXEL :'+CI2,10,310,GREEN,2); { Si se presioneo la tecla F1 entonces se cumplira est condicin y aparecer en la pantalla la leyenda "ACTIVO" que significa que eses color en particular esta siendo utilizado para dibujar } IF DISP THEN BEGIN BOX(30,230,80,240,1,CYAN); TEXTO4X8('ACTIVO',30,231,RED,4); END { En otro caso se dibujara una caja de color blanco } ELSE BOX(30,230,80,240,1,WHITE); { Este ciclo se asegura de que cuando se salga de l se tenga la tecla presionada y ademas sea una tecla de instruccin para el editor, ademas dibuja una caja que hace el efecto de cursor pulsante } REPEAT REPEAT BOX(X+1,Y+1,X+5,Y+5,1,I); BOX(X+1,Y+1,X+5,Y+5,1,I XOR 15); UNTIL KEYPRESSED; OP:=INKEY(SECUNDARIO); UNTIL (OP IN[F_ARR,F_AB,F_I,F_D,F1,F2,F3,F5,F6,F4,F7,F8,F9, PU,PD,INS,FIN,DEL,HOME]) AND SECUNDARIO; IF DISP THEN DIBUJO[K,J]:=I; IF DIBUJO[K,J]<16 THEN ES2:=0 ELSE ES2:=$AAAA; CO21:=DIBUJO[K,J] DIV 16; CAJA(X+1,Y+1,X+5,Y+5,ES2,DIBUJO[K,J],CO21); { Si la variable secundario es verdadera quiere decir que se ha oprimido una tecla y verificar que accin corresponde a dicha tecla } IF SECUNDARIO THEN CASE OP OF F_ARR:K:=INN(51,K-1,0);{ Flecha hacia arriba } F_AB:K:=INN(51,K+1,0); { Flacha hacia abajo } F_I:J:=INN(87,J-1,0); { Flecha a la izquierda } F_D:J:=INN(87,J+1,0); { Flecha a la derecha } INS:BEGIN J:=INN(87,J-1,0);K:=INN(51,K-1,0) END; { Tecla "INS" } FIN:BEGIN J:=INN(87,J+1,0);K:=INN(51,K+1,0) END; { Tecla "FIN" } DEL:BEGIN J:=INN(87,J-1,0);K:=INN(51,K+1,0) END; { Tecla "DEL" } HOME:BEGIN J:=INN(87,J+1,0);K:=INN(51,K-1,0) END; { Tecla "HOME"} F1:DISP:=NOT(DISP); { Tecla "F1"} F2:I:=INN(255,I+1,0); { Tecla "F2"} F3:I:=INN(255,I-1,0); { Tecla "F3"} PD:I:=INN(255,I+16,0); { Tecla "Page Down"} PU:I:=INN(255,I-16,0); { Tecla "Page Up"} { Tecla "F6"} F6:BEGIN VENTANA_DISCO('G',DIBUJO);Rejilla(100,10);DIBUJA3 END; { Tecla "F7"} F7:BEGIN VENTANA_DISCO('L',DIBUJO);Rejilla(100,10);DIBUJA3 END; F4:DIBUJA_CH; { Tecla "F4"} F8:DIBUJA4; { Tecla "F8"} { Tecla "F9"}

END; (* Procedimiento para inicializar grficos *) PROCEDURE INICIA_GRAFICOS; VAR MONITOR,MODO:INTEGER; BEGIN (* Funcion que regresa el tipo de adaptador grfico de su PC *) DETECTGRAPH(MONITOR,MODO); (* Inicializar los grficos una vez encontrado el tipo de adaptador *) INITGRAPH(MONITOR,MODO,'c:\TP\BGI'); IF (MONITOR=VGA) THEN SETGRAPHMODE(VGAMED); (* Verificacin de error en el modo grfico *) IF GRAPHRESULT<>GROK THEN HALT END; (*-------------------------------------------------------------------------*) (* Programa Principal*) BEGIN INICIA_GRAFICOS;J:=0;K:=0; (* Inicializar grficos *) DIRECTVIDEO:=FALSE; BOX(1,1,GETMAXX,GETMAXY,1,15); (* Dibuja una caja de color blanco *) Rejilla(100,10);I:=0; CREA_IMAGEN(100,10); ALGO:=READKEY; END.

F9:BEGIN FILLCHAR(DIBUJO,SIZEOF(DIBUJO),15);DIBUJA3 END; END; X:=X1+(J*6);Y:=Y1+(K*6); UNTIL (OP=F5);

Arc

Arc dibuja un crculo alrededor de las coordenadas x, y con un radio de valor radio. El crculo se empieza a dibujar en el sentido de las agujas del reloj a partir de AngInicio y termina en AngFinal. Su sintaxis es la siguiente: Arc(x,y, AngInicio, AngFinal, radio);

Bar Bar dibuja en la pantalla un rea rectangular rellena. Su sintaxis es la siguiente: Bar(x1,x2,y1,y2); Bar3D Bar3D dibuja en la pantalla un rea rectangular rellena en tres dimensiones. El rectngulo tiene un profundidad en pixeles de profundidad. Si la altura es True, el procedimiento dibuja la parte superior del rectngulo en tres dimensiones. Su sintaxis es la siguiente: Bar3D(x1,x2,y1,y2, profundidad, altura); Circle Circle dibuja un crculo con un determinado radio alrededor de las coordenadas x, y. Su sintaxis es la siguiente: Circle(x,y,radio); ClearDevice ClearDevice borra la pantalla de grficos. Su sintaxis es la siguiente: Cleardevice( ); ClearViewPort ClearViewPort borra la ventana grfica actual. Su sintaxis es la siguiente: ClearViewPort( ); CloseGraph CloseGraph restaura el monitor de vdeo al modo en que se encontraba antes de entrar en el modo grfico. El procedimiento tambin libera la memoria usada por el sistema de grficos. Su sintaxis es la siguiente: Closegraph( );

DetectGraph DetectGraph devuelve el controlador de grficos detectado (CG) y el mdo grfico (MG) de la tarjeta de grficos de la computadora. Su sintaxis es la siguiente: DetectGraph(Variable CG, MG); DrawPoly DrawPoly dibuja un polgono de NmPuntos vrtices. El array PuntosPoly contiene las coordenadas de los vrtices del polgono. Su sintaxis es la siguiente: DrawPoly(NmPuntos, Var PuntosPoli); FillEllipse FillEllipse dibuja una elipse con centro en las coordenadas x,y, con un radio vertical de YRadio y un radio horizontal de XRadio. La elipse se rellena con el color y estilo de relleno actual, y el borde se dibuja con el color actual. Su sintaxis es la siguiente: FillEllipse(x,y,XRadio,YRadio); FillPoly FillPoly dibuja un polgono relleno de NmPontos vrtices. El array PuntosPoli contien las coordenadas de los vrtices del polgono. Su sintaxis es la siguiente: FillPoly(NmPuntos, Var PuntosPoli); FloodFill FloodFill rellena un rea cerrada del monitor de grficos con el color y patrn actual. El rea tiene que estar encerrada completamente por el color Borde, y las coordenadas x,y deben quedar dentro del rea a rellenar. Su sintaxis es la siguiente: FloodFill(x,y,borde);

GetArcCoords GetArcCoords devuelve las coordenadas utilizadas por la orden Arc o Ellipse usada ms recientemente. La estructura de ArcCoordsType es la siguiente: Type ArcCoordsType = Record x, y : Integer; Xstart, Ystart : Integer; XEnd, YEnd : Integer; End; Su sintaxis es la siguiente: GetArcCoords(Var CoordArc: ArcCoordsType); GetAspectRatio GetAspectRatio devuelve en XAsp y en YAsp la resolucin efectiva de la pantalla de grficos. La razn de aspecto se calcula dividiendo XAsp entre YAsp. Su sintaxis es la siguiente: GetAspectRatio(var XAsp, YAsp); GetBkColor GetBkColor devuelve el ndice en la paleta actual del color de fondo actual. Su sintaxis es la siguiente: GetBkColor(color); GetColor GetColor devuelve el color de dibujo actual en el modo grfico. Su sintaxis es la siguiente: GetColor(color);

GetDefaultPalette GetDefaultPalette devuelve en Pal la paleta por defecto del controlador de grficos Actual. La estructura de PaletteType es la siguiente: Type PaletteType = REcord Size : Byte Colors : Array [0..MaxColor] of ShortInt; End; GetDriverName GetDriverName devuelve el nombre del controlador de grficos actual. Su sintaxis es la siguiente: GetDriverName(Cadena); GetFillPattern GetFillPattern devuelve en FP la definicin del patrn de relleno actual. La estructura de FillPatternType es: Type FillPatternType = Array [1..8] of byte; Su sintaxis es la siguiente: GetFillPattern(Var FP : FillPatternType); GetFillSettings GetFillSettings devuelve en FS el color y el patrn de relleno actual. La estructura de FillSetingsType es: Type FillSettingsType = Record Pattern : Word; Color : Word; End; Su sintaxis es la siguiente: GetFillSettings(Var FS : FillSettingsType);

GraphDriver. Es la constante que indica el adpatador de video que se desea emplear. GetGraphMode GetGraphMode devuelve el modo grfico actual. El valor numerico del modo grfico se tiene que interpretar conjuntamente con la informacin sobre el controlador de grficos usado. Su sintaxis es la siguiente: GetGraphMode : Integer; GetImage GetImage guarda en MapaBits una porcin rectangular de una pantalla grfica, delimitada por x1, y1, x2, y2. Su sintaxis es la siguiente: GetImage(x1,y1,x2,y2,Var MapaBits); GetLinesettings GetLineSettings devuelve en LST los valores actuales de estilo, patrn y grosor de lnea. La estructura de LineSettingsType es: Type LineSettingsType = Record LineStyle : Word; Pattern : Word; Thickness : Word; End; Su sintaxis es la siguiente: GetLineSettings(Var LST : LinesettingType); GetMaxColor GetMaxColor devuelve el valor ms alto correspondiente a un color de la paleta actual. Su sintaxis es la siguiente: GetMaxColor : Word;

GetMaxMode GetMaxMode devuelve un valor que indica el modo grfico de mayor resolucin de la tarjeta grfica que se encuentra instalada. Su sintaxis es la siguiente: GetMaxMode : Word; GetMaxX y GetMaxY GetMaxX devuelve la mxima coordenada horizontal del modo grfico actual. GetMaxY devuelve la mxima coordenada vertical del modo grfico actual. Su sintaxis es la sisguiente: GetMaxX : Integer; GetMaxY : Integer; Estas funciones no tienen parmetros y regresan coordenadas mximas de X y de Y como dos nmeros enteros. GetMem GetMem reserva I bytes de la memoria y pone la direccin de comienzo en la variable P. Su sintaxis es la siguiente: GetMem(Var P : Puntero, I : Integer); GetModeName GetModeName devuelve una cadena que describe el modo grfico indicado por NmModo. Su sintaxis es la siguiente: GetModeName(NmModo : Word):String; GetModeRange GetModeRange devuelve los modos de mayor resolucin (modosup) y de menor resolucin (Modoinf) del controlador de grficos indicado en ContrGrfico. Su sintaxis es la siguiente: GetModeRange(ContrGrfico : Integer; Var ModoInf, ModoSup : Integer);

GetPalette GetPalette devuelve en P la paleta actual. La estructura de PaletteType es: Const MaxColors = 15; Type PaletteType = Record Size : Byte; Colors : Array [0..Maxcolors] of ShortInt; End; GetPaletteSize GetPaletteSize devuelve el nmero mximo de entradas de paleta que puede soportar el modo grfico actual. Su sintaxis es la siguiente: GetPaletteSize : Word; GetPixel GetPixel devuelve el color del pixel de las coordenadas x, y. Su sintaxis es la siguiente: GetPixel(x,y : Integer);

GetTextSettings GetTextSettings devuelve en TS los ajustes actuales del texto . La estructura de TextSettingsType es: Type TextSettings = Record Font : Word; Direction : Word; CharSize : Word; Horiz : Word; Vert : Word; End; Su sintaxis es la siguiente: GetTextSettings(Var TS : TextSettingsType); GetViewSettings GetViewSettings devuelve en VP los valores de la ventana grfica actual. La estructura de ViewPortType es: Type ViewPortType = Record X1,y1,x2,y2 : Integer; Clip : Boolean; End; Su sintaxis es la siguiente: GetViewSettings(Var VP : ViewPortType); GetX y GetY GetX devuelve la coordenada horizontal de la posicin actual. GetY devuelve la Coordenada vertical de la posicin actual. Sus sintaxis son las siguientes: GetX : Integer; GetY : Integer;

GraphDefaults GraphDefaults inicializa los ajustes grficos a sus valores por defecto. Su sintaxis es la siguiente: GraphDefaults; GraphErrorMsg GraphErrorMsg devuelve un cdigo de error correspontiente a la condicion de error indicada por el Cdigo. Su sintaxis es la siguiente: GraphErrorMsg(Cdigo : Integer) : String; GraphMode. Es la constante que indica el modo grafico deseado. GraphResult GraphResult devuelve un cdigo de error relativo al ltimo procedimiento de grficos utilizado. Su sintaxis es la siguiente: GraphResult : Integer; ImageSize ImageSize devuelve el nmero de bytes requerido para almacenar el mapa de bits de la porcin de la pantalla definida por x1, y1, x2, y2. Su sintaxis es la siguiente: ImageSize(x1,y1,x2,y2 : Integer);

InithGraph InithGraph inicializa el entorno de grficos para el controlador grfico ContrGrfico en el modo ModoGrfico es cero, el procedimiento detecta automticamente el adpatador de grficos y ajusta el modo a la mxima resolucin posible. El procedimiento buscar los archivos .BGI en el encaminamiento indicado por EncamContr. Su sintaxis es la siguiente: InitGraph(Var ContrGrfico : Integer; Var ModoGrfico : Integer; EcamContr : String); InstallUserDriver InstallUserDriver instala un controlador grfico que no sea de Borland. Nombre contiene el nombre del archivo que contiene dicho controlador y AutoDetecPunt es un puntero a una funcin de autodeteccin opcional. El controlador tiene que estar en el formato .BGI. Su sintaxis es la siguiente: InstallUserDriver(Nombre:String; AutoDetecPunt:Pointer) : Integer; InstallUserFont InstallUserFont permite instalar al usuario una fuente que no sea de Borland. La informacin de la fuente se encuentra en el archivo indicado por NmArchivoFuente. Line Line dibuja una lnea desde x1, y1, a x2, y2. Su sintaxis es la siguiente: Line(x1,y1,x2,y2 : Integer); LineRel LineRel dibuja una lnea desde la posicin actual a un punto determinado mediante Dx y Dy. Por ejemplo, si la posicin actual es 1, 2, la orden LineRel(100,100) dibujar una lnea desde 1,2 a 101, 102. Su sintaxis es la siguiente: LineRel(Dx, Dy : Integer);

LineTo Lineto dibuja una lnea desde la posicin actual a la posicin x, y. Su sintaxis es la siguiente: LineTo(x, y : Integer); MoveRel MoveRel mueve la posicin actual Dx pixels horizontales y Dy pixels verticales, relativamente a la posicin actual del cursor. Su sintaxis es la siguiente: MoveRel(Dx,Dy : Integer); MoveTo MoveTo sita la posicin actual en el pixel x, y. Su sintaxis es la siguiente: MoveTo(x, y : Integer); OutText OutText muestra la cadena CadenaTexto con los actuales ajustes establecidos de fuente, ajuste, altura y anchura. Su sintaxis es la siguiente: OutText(CadenaTexto : String); OutTextXY OutTextXY muestra la cadena CadenaTexto en la posicin x, y con los actuales ajustes establecidos de fuente, ajuste, altura y anchura. Su sintaxis es la siguiente: OutTextXY(x,y : Integer, CadenaTexto : String);

PathToDriver. Es una ruta que localiza la directiva de graficas (el archivo .BGI) apropiado para la computadora del usuario. Por ejemplo: GraphDriver := CGA: GraphMode := CGAHi: initgraph (GraphDriver, GraphMode, ''); PieSlice PieSlice dibuja un trozo de diagrma de tarta con centro x, y con un radio de radio y que comienza en AngIni y termina en AngFin. Su sintaxis es la siguiente: PieSlice(x,y : Integer;AngIni, AngFin, Radio:Word); PutImage PutImage muestra el contenido de MapaBits comenzando en x,y BitBlt indica el proceso a usar para mostrar el mapa de bits y puede tener valores ya antes mencionados. Su sintaxis es la siguiente: PutImage(x,y:integer; Var MapaBits;BitBlt : Word); Putpixel PutPixel dibuja un punto sencillo en la posicin x, y con el color definido por Pixel. Su sintaxis es la siguiente: PutPixel(x,y : Integer;Pixel : Word); Rectangle Rectangle dibuja un rectngulo con la esquina superior izquierda en x1, y1 y la esquina inferior derecha en x2, y2. Su sintaxis es la siguiente: Rectangle(c1,y1,x2,y2 : integer);

RestoreCRTMode RestoreCRTMode restaura el monitor de vdeo al modo que tena antes de inicializar grficos. Su sintaxis es la siguiente: RestoreCRtMode; Sector Sector dibuja un sector con centro en x, y, que empieza en AngIni, termina en AngFin, con un radio horizontal RadioX y un radio vertical RadioY. Su sintaxis es la siguiente: Sector(x,y : Integer; AngIni, AngFin, RadioX, RadioY: Word); SetActivePage SetActivePage selecciona la pgina de vdeo de grficos y la activa. Su sintaxis es la siguiente: SetActivePage(Pagina : Word); SetAllPalette SetAllPalette cambia todas las paletas a la definicin indicada por paleta. Su sintaxis es la siguiente: var palette palettetype; beign .... SetAllPalette( var Palette); ... end.

SetAspectRatio SetAspectRatio cambia la razn de aspecto usada para mostrar grficos, por AspX dividido por AspY. Su sintaxis es la siguiente: SetAspectRatio(AspX,AspY : Word); SetBkColor Se puede establecer tambien el color del fondo mediante el enunciado Setbkcolor. Para que el fondo sea blanco se utiliza en enunciado: Setbkcolor (white). Su sintaxis es la siguiente: SetBkColor(Color : Word); Setcolor SetColor establece el color de dibujo actual con la entrada Color de la paleta. Esta instruccion establece el color activo, el cual permanece hasta que se cambie explicitamente. Por ejemplo el azul claro, se utiliza asi: Setcolor(LightBlue); Su sintaxis es la siguiente: SetColor(Color : Word); SetFillPattern SetFillPattern define el patrn de grficos usado para rellenar reas de la pantalla con rdenes como FillPoly y FloodFill. Su sintaxis es la siguiente: SetFillPattern(Patron: FillPaternType; Color : Word); SetFillStyle Setfillstyle establece el patrn usado para rellenar reas de grficos. Su sintaxis es la siguiente: SetFillStyle(Patrn : Word; Color : Word);

SetGraphBufSize SetGraphBufSize establece el tamao del buffer de grficos. Su sintaxis es la siguiente: SetGraphBufSize(TamBuf : Word); SetGraphMode SetGraphMode establece el modo grfico actual al especificado en Modo. Su sintaxis es la siguiente: SetGraphMode(mode : Integer); SetLineStyle SetLineStyle determina el estilo, patrn y grosor de las lneas dibujadas en el modo grfico. Su sintaxis es la siguiente: SetLineStyle(EstiloLinea : Word; Patrn : Word; Grosor : Word); SetPalette SetPalette establece el nmero de color NmColor de la paleta actual a color. Su sintaxis es la siguiente: SetPalette(NmColor : Word; Color : ShortInt); SetRGBPalette SetRGBPalette establece la entrada de la paleta NmColor a cualquier combinacin de rojo, verde y azul. Su sintaxis es la siguiente: SetRGBPalette(NmColor, ValorRojo, ValorVerde, ValorAzul : Integer);

SetTextJustify SetTextJustify define el formato de salida usado por Outtext y OutTextXY. Su sintaxis es la siguiente: SetTextJustify(Horiz, Vert : Word); SetTextStyle SetTextStyle determina la forma en que se muestran los caracteres en el modo grfico. Las caractersticas incluyen la fuente, la direccin en la que se produce la escritura y el tamao de los caracteres. Su sintaxis es la siugiente: SettextStyle(Fuente : Word; Direccin : Word; TamCar : Word); SetUserCharSize SetUserCharSize cambia las proporciones de altura y anchura de las fuentes de trazo. Por ejemplo, si MultX es 1 y DivX es 2, entonces los caracteres se mostrarn con la mitad de la anchura con la que se muestran normalmente. Su sintaxis es la siguiente: SetUserCharSize(MultX, DivX, MultY, DivY : Word); SetViewPort SetViewPort selecciona un rea rectangular de la pantalla de grficos para usarla como pantalla activa. Cuando Clip es TRUE, los dibujos se solapan con los bordes de la ventana grfica. Su sintaxis es la siguiente: SetViewPort(x1,y1,x2,y2 : Integer; Clip : Boolean); SetVisualPage SetVisualPage selecciona la pgina grfica que se quiere mostrar. Su sintaxis es la siguiente: SetVisualPage(Pgina : Word);

SetWriteMode SetWriteMode selecciona uno de los dos modos de dibujo de lneas. En el modo CipyPut (0), las lneas se dibujan mediante la orden de ensamblador MOV. En el modo XORPut (1) las lneas se dibujan mediante la orden XOR. Su sintaxis es la siguiente: SetWriteMode(ModoEscrit : Integer); TextHeight TextHeight determina el espacio vertical que va a requerir CadenaTexto, dados la fuente y el factor de multiplicacin actuales. Su sintaxis es la siguiente: TextHeight(CadenaTexto : String) : Word;

S-ar putea să vă placă și