miércoles, 7 de diciembre de 2016

Instituto Tecnológico de Matamoros




Instituto Tecnológico de Matamoros 

 Ing. en Sistemas Computacionales


Ingeniería en Sistemas Computacionales



Materia: Graficación
Profesor: Ing. María Yolanda Rodriguéz Loya 
Alumna: Jessica Janet Alanis Ruvalcaba



Objetivo de la materia: Conocer técnicas para el trazado, manipulación y visualización de elementos en 2D y 3D, las cuales, servirán de base para desarrollar software basado en gráficos, como interfaz hombre-máquina y software gráfico para el diseño de diversas aplicaciones, enfocadas al arte, diseño, capacitación y entretenimiento.


Temario de la materia: Enlace directo al temario.


Unidades

Unidad 1: Introducción a los ambientes de graficación
Unidad 2: Graficación 2D
Unidad 3: Graficación 3D
Unidad 4: Iluminación y sombreado
Unidad 5: Áreas relacionas a la graficación




Unidad#4: Programa 13



Programa: ElGlobo


Página 350 del libro "Java para estudiantes" sexta edición, de Douglas Bell y Mike Parr. 


Código:





Programa en ejecución:



Unidad#4: Programa 12



Programa: ArregloGlobos


Página 256 del libro "Java para estudiantes" sexta edición, de Douglas Bell y Mike Parr. 


Código:



Programa en ejecución:




Java 3D



El API Java 3D es una interfaz de programación de aplicación que se utiliza para escribir aplicaciones y applets de gráficos tridimensionales. Se ofrece a los desarrolladores construcciones de alto nivel para crear y manipular la geometría 3D y para la construcción de las estructuras utilizadas en la prestación de dicha geometría. Los desarrolladores de aplicaciones pueden describir muy grandes mundos virtuales utilizando estas construcciones, que proporcionan de Java 3D con suficiente información para hacer que estos mundos de manera eficiente.

Java 3D ofrece el beneficio de Java "escribir una vez, ejecutar en cualquier lugar" a los desarrolladores de aplicaciones gráficas en 3D. Java 3D es parte de la suite de APIs JavaMedia, por lo que es disponible en una amplia gama de plataformas. También se integra bien con Internet, ya que las aplicaciones y applets que utilizan la API de Java 3D tienen acceso a todo el conjunto de clases Java.

El API Java 3D toma sus ideas de APIs gráficas existentes y de las nuevas tecnologías. construcciones gráficas de bajo nivel de Java 3D sintetizan las mejores ideas que se encuentran en las API de bajo nivel, como Direct3D, OpenGL, QuickDraw3D, y XGL. Del mismo modo, sus construcciones de nivel superior sintetizan las mejores ideas que se encuentran en los sistemas basados ​​en el gráfico varias escenas.Java 3D introduce algunos conceptos que normalmente no se considera parte del entorno gráfico, como por ejemplo el sonido espacial 3D. capacidades de sonido de Java 3D ayudan a proporcionar una experiencia más envolvente para el usuario.

Modelo de programación 

Modelo de programación gráfico de la escena

basado en un escenario gráfico Java 3D proporciona un mecanismo sencillo y flexible para representar y escenas. El gráfico de la escena contiene una descripción completa de toda la escena, o universo virtual. Esto incluye los datos geométricos, la información de atributos, y la información de visualización necesaria para renderizar la escena desde un punto de vista particular.

Modos de representación


  • Modo inmediato

el modo inmediato deja poco espacio para la optimización global a nivel del escenario gráfico. A pesar de ello, Java 3D ha elevado el nivel de abstracción y acelera la prestación modo inmediato en un objeto por objeto. Una aplicación debe proporcionar un método de sorteo de Java 3D con un conjunto completo de puntos, líneas o triángulos, que luego son prestados por la alta velocidad de procesador de Java 3D.Por supuesto, la aplicación puede construir estas listas de puntos, líneas, triángulos o en cualquier manera que desee.

  • Conservar Modo
Modo retenido requiere una aplicación para construir un escenario gráfico y especificar qué elementos de ese escenario gráfico se pueden cambiar durante la representación. El gráfico de la escena se describen los objetos en el universo virtual, la disposición de dichos objetos, y cómo la aplicación anima esos objetos.

  • Modo compilado-Retenido
modo compilado retenidas, al igual que el modo retenido, requiere la aplicación de construir un escenario gráfico y especificar qué elementos del escenario gráfico se pueden cambiar durante la representación. Además, la aplicación puede compilar algunos o todos los subgraphs que componen un gráfico de la escena completa. Java 3D compila estos gráficos en un formato interno. La representación compilada del escenario gráfico puede alejarse mucho de la estructura de árbol original proporcionado por la aplicación, sin embargo, es funcionalmente equivalente. Modo retenido-compilado ofrece el más alto rendimiento.

Árbol de Clases de Alto Nivel del API Java 3D

SceneGraphObject es la superclase de casi todas las clases corazón y de utilidad de Java 3D. Tiene dos subclases: Node y NodeComponent. Las subclases de Node proporcionan la mayoría de los objetos de un escenario gráfico. Un objeto Node es un objeto nodo Group o un objeto nodo Leaf.
Clase Node 

La clase Node es una superclase abstracta de las clases Group y Leaf. Esta clase define algunos de los métodos importantes de sus subclases. Las subclases de Node componen escenarios gráficos.
La clase Group es la superclase usada en especificación de localización y orientación de objetos visuales en el universo virtual. Dos de las subclases de Group son: BranchGroup y TransformGroup. En la representación gráfica de un escenario gráfico, los simbolos de Group (círculos) normalmente se anotan con BG para BranchGroupsTG para TransformGroups, etc. La Figura 1-2 muestra algunos ejemplos de esto.
La clase Leaf es la superclase usada para especificar la forma, el sonido y comportamiento de los objetos visuales en el universo virtual. Algunas de las subclases de Leaf son: Shape3DLightBehavior, y Sound. Estos objetos podrían no tener hijos pero podrían referenciar a NodeComponents.
La clase NodeComponent es la superclase usada para especificar la geometría, la apariencia, la textura y las propiedades de material de un nodo Shape3D (Leaf). Los NodeComponents no forman parte del escenario gráfico, pero son referenciados por él. un NodeComponent podría ser referenciado por más de un objeto Shape3D.


Clase Group 
Clase Leaf 
Clase NodeComponent 

La especificación del API de Java 3D presenta una serie de pasos para la
programación en este lenguaje:

1. Creación de un objeto Canvas3D.
2. Creación de un objeto VirtualUniverse.
3. Creación de un objeto Locale y unirlo al objeto VirtualUniverse.
4. Construir la rama de Vista Gráfica (con BranchGroup y TransformGroup)
     a. Creación de un objeto View.
     b. Creación de un objeto ViewPlatform.
     c. Creación de un objeto PhysicalBody.
     d. Creación de un objeto PhysicalEnvironment.
   e. Unir los objetos ViewPlatform, PhysicalBody, PhysicalEnvironment y Canvas3D al objeto View.
5. Construir las ramas de Contenido Gráfico (con Branch Group y Shape3D).
6. Compilar las ramas de Contenido Gráfico.
7. Insertar los gráficos a de Locale.

VirtualUniverse es la raíz de un escenario gráfico. SE refiere al espacio virtual de tres dimensiones en donde cada objeto Locale establece un sistema de coordenadas cartesianas. El eje X es positivo hacia la derecha, el Y es positivo hacia arriba y el eje Z es
positivo hacia el espectador. Las unidades están dadas en metros.

Shape3D define un objeto visual. Sus objetos solo pueden ser hojas en un escenario gráfico y por lo tanto no contiene información sobre la forma o el color de un objeto. Esta información está contenida en el NodeComponent al que hace referencia el Shape3D y el cual contiene las especificaciones exactas de los atributos de un objeto visual.


Clases Geométricas

- Box: Crea cubos de 3 dimensiones. Con valores por default de 2 metros en cada dimensión y centro en el origen. El usuario puede especificar los valores de longitud, anchura y altura y utilizar TransformGroup para cambiar la localización o la orientación.
- Cone: Define conos con centro en el origen y sobre el eje Y. El radio es de 1m y la altura 2m.
- Cylinder: Objetos cilíndricos sobre el eje Y con radio 1m y altura 2m.
- Sphere: Esferas con centro en el origen y radio 1m.

El color por defecto para todos estos objetos es Blanco.

Clases Matemáticas

Están en el paquete javax.vecmath.* y representan coordenadas, colores, superficies normales y coordenadas de textura.

- Point: Representan coordenadas de un vértice, la posición de una imagen, fuente de luz, localización espacial de un sonido.
- Color: Representan un color para un vértice, propiedad de un materia, niebla u otro objeto visual. Se especifican con Color3 (con RGB) o Color4 (valor de transparencia).
- Vector: Representan superficies normales en vértices o la dirección de una fuente de luz o sonido.
- TexCoord: Representan las coordenadas de textura de un vértice.

Clases de Arreglos Geométricos

La clase GeometryArray se utiliza para especificar puntos, líneas y polígonos rellenos como triángulos y cuadriláteros. Si se define un GeometryArray para un triángulo, se define un arreglo de tres elementos en el cual cada uno representa un vértice (localización y coordenadas). También se puede almacenar el color, la superficie normal y las coordenadas de textura.

Apariencia

Un objeto Appearence no contiene información sobre cómo debe aparecer un objeto Shape3D, pero si se sabe en dónde encontrar esos datos. Este objeto puede hacer una referencia a uno o varios objetos de otras subclases de la clase abstracta NodeComponent.
A un objeto Appeareance con atributos se le llama paquete de apariencia.

Atributos

- PointAttributes: Manejan el modo en que se redibujan los puntos primitivos. Si un vértice se renderiza como un punto, se rellena un píxel. setPointSize() permite hacer el punto más grande pero parecerá un cuadrado, para esto se utiliza setAntialiasingEnable() y de esta manera parecerá redondeado.
-LineAttributes: Cambian el modo en que se renderizan las líneas primitivas. Algunos métodos importantes son: setLinePattern(), setLineWidth(), setLineAntialiasingEnable().
- PolygonAttributes: Cambian el modo en que se renderizan los polígonos primitivos de tres maneras: la forma en que está rasterizado, si está recortado y si tiene un desplazamiento de profundidad especial.
- ColoringAttributes: Cambian el modo en que colorea cualquier primitivo. El método setColor() selecciona un color y el método setShadeMode() deterimina si el color es interpolado entre primitivos.
- TransparencyAttributes(): Maneja la transparencia de cualquier primitivo. El método setTransparency() determina el valor de opacidad para el primitivo.


Clases Java 3D 

Clase BranchGroup
Los objetos de este tipo se usan para formar escenarios gráficos. Los ejemplares de BranchGroup son la raíz de los sub-gráficos. Los objetos BranchGroup son los únicos que pueden ser hijos de los objetos Locale. Los objetos BranchGroup pueden tener varios hijos. Los hijos de un objeto BranchGroup pueden ser otros objetos Group o Leaf.
Constructor por defecto de BranchGroup
BranchGroup()
Los ejemplares de BranchGroup sirven como raíz para las ramas del escenario gráfico; los objetos BranchGroup son los únicos objetos que pueden insertarse en un conjunto de objetos Locale.
Constructor de Canvas3D
Canvas3D(GraphicsConfiguration graphicsconfiguration)
Construye e inicializa un nuevo objeto Canvas3D que el Java 3D puede renderizar dando un objeto GraphicsConfiguration válido. Es una extensión de la clase Canvas del AWT.
Constructor por Defecto de Transform3D
Un objeto de transformación generalizado se representa internamente como una matriz de 4x4 doubles de punto flotante. La representación matemática es la mejor forma. Un objeto Transform3D no se usa en un escenario gráfico. Se usa para especificar la transformación de un objeto TransformGroup.
Transform3D()
Construye un objeto Transform3D que representa la matriz de identidad (no la transformación).
Lista Parcial de Métodos de Transform3D
Los objetos Transform3D representan transformaciones geométricas como una rotación, traslación y escalado. Transform3D es una de las pocas clases que no se usan directamente en un escenario gráfico. Las transformaciones representadas por objetos Transform3D se usan para crear objetos TransformGroup que si se usan en escenarios gráficos.
void rotX(double angle)
Selecciona el valor de esta transformación a una rotación en contra del sentido del reloj sobre el eje-x. El ángulo se especifica en radianes.
void rotY(double angle)
Selecciona el valor de esta transformación a una rotación en contra del sentido del reloj sobre el eje-y. El ángulo se especifica en radianes.
void rotZ(double angle)
Selecciona el valor de esta transformación a una rotación en contra del sentido del reloj sobre el eje-z. El ángulo se especifica en radianes.
void set(Vector3f translate)
Selecciona el valor transacional de esta matriz al valor del parámetro Vector3f, y selecciona los otros componentes de la matriz como si ésta transformación fuera una matriz idéntica.
Constructores de TransformGroup
Los objetos TransformGroup son contenedores de transformaciones en el escenario gráfico.
TransformGroup()
Construye e inicializa un TransformGroup usando una identidad de transformación.
TransformGroup(Transform3D t1)
Construye e inicializa un TransformGroup desde un objeto Transform3D pasado:
Parámetros:
  • t1 - el objeto transform3D
Método setTransform() de TransformGroup
void setTransform(Transform3D t1)
Selecciona el componente de transformación de este TransformGroup al valor de la transformación pasada.
Parámetros:
  • t1 - la transformación a copiar.
Constructores de Vector3f
Un vector de 3 elementos que es representado por puntos flotantes de precisión sencilla para las coordenadas x, y, y z.
Vector3f()
Construye e inicializa un Vector3f a (0,0,0).
Vector3f(float x, float y, float z)
Construye e inicializa un Vector3f desde las coordenadas x, y, z especificadas.

Clase Canvas3D
La clase Canvas3D deriva de la clase Canvas del AWT. Al menos un objeto Canvas3D debe ser referenciado en la rama de vista gráfica del escenario gráfico.
Clase Transform3D
Los objetos Transform3D representan transformaciones de geometrías 3D como una traslación o una rotación. Estos objetos normalmente sólo se usan en la creacción de un objeto TransformGroup. Primero, se construye el objeto Transform3D, posiblemente desde una combinación de objetos Transform3D. Luego se construye el objeto TransformGroup usando el objeto Transform3D.
Un objeto Transform3D puede representar una traslación, una rotación, un escalado, o una combinación de éstas. Cuando se especifica una rotación, el ángulo se expresa en radianes. Una rotación completa es 2 PI radianes. Una forma de especificar ángulos es usar la constante Math.PI. Otra forma es especificar los valores directamente. Algunas aproximaciones son: 45º es 0.785, 90º es 1.57, y 180º es 3.14.
Clase TransformGroup
Como una subclase de la clase Group, los ejemplares de TransformGroup se usan en la creacción de escenarios gráficos y tienen una colección de objetos nodos como hijos. Los objetos TransformGroup contienen transformaciones geométricas como traslaciones y rotaciones. La transformación normalmente se crea en un objeto Transform3D, que no es un objeto del escenario gráfico.
La transformación contenida en un objeto Transform3D se copia a un objeto TransformGroup o cuando se crea el TransformGroup, o usando el método setTransform().
Clase Vector3f
Vector3f es una clase matemática que se encuentra en el paquete javax.vecmath para especificar un vector usando tres valores de punto flotante. Los objetos Vector se usan frecuentemente para especificar traslaciones de geometrías. Los objetos Vector3f no se usan directamente en la construcción de un escenario gráfico. Se usan para especificar la traslaciones, superficies normales, u otras cosas.
Clase ColorCube
ColorCube es una clase de utilidad que se encuentra en el paquete com.sun.j3d.utils.geometry que define la geometría y colores de un cubo centrado en el origen y con diferentes colores en cada cara. El objeto ColorCube es un cubo que tiene 2 métros de arista. Si un cubo sin rotar se sitúa en el origen (como en HelloJava3Da), se verá la cara roja desde la localización de visión nominal. Los otros colores son azul, magenta, amarillo, verde y cian.
Constructores de ColorCube
Un ColorCube es un objeto visual, un cubo con un color diferente en cada cara. ColorCube extiende la clase Shape3D; por lo tanto, es un nodo hoja. ColorCube es fácil de usar cuando se pone junto a un universo virtual.

Añadir Comportamiento de Animación
  • Crear un TransformGroup fuente. 
  • Selecciona la capacidad ALLOW_TRANSFORM_WRITE.
  • Crear un objeto Alpha (función de tiempo en Java 3D) 
  • Especifica los parámetros de tiempo para el alpha
  • Crear el objeto interpolator
  • Tiene referencias con los objetos Alpha y TransformGroup
  • Personalizar los parámetros del comportamiento.
  • Especificar la región programada. 
  • Configura la región programada para el comportamiento.
  • Hacer el comportamiento como hijo del TransformGroup
 Especificar un Comportamiento de Animación
Lista Parcial de Constructores de RotationInterpolator
Esta clase define un comportamiento que modifica el componente rotacional de su TransformGroup fuente linearizando la interpoalización entre un par de ángulos especificados (usando el valor generado por el objeto Alpha especificado). El ángulo interpolado se usa para generar una transformación de rotación.
RotationInterpolator(Alpha alpha, TransformGroup target)
Este constructor usa valores por defecto de algunos parámetros del interpolador para construir una rotación completa sobre el eje y, usando el TransformGroup especificado.
Parámetros:
  • alpha - la función de variación de tiempo para referencia.
  • target - el objeto TransformGroup a modificar.
 Funciones de Variación de Tiempo: Mapear un Comportamiento en el Tiempo
Constructor de Alpha
La clase Alpha proporciona objetos para convertir la hora en un valor alpha (un valor entre 0 y 1). El objeto Alpha es efectivamente una función de tiempo que genera valores alpha entre cero y uno. La función "f(t)" y las características del objeto Alpha están determinadas por parámetros definidos por el usuario:
Alpha()
Bucle continuo con un periodo de un segundo.
Alpha(int loopCount, long increasingAlphaDuration)
Este constructor toma sólo loopCount e increasingAlphaDuration como parámetros y asigna los valores por derecto a todos los demás parámetros, resultando un objeto Alpha que produce valores desde cero a uno crecientes. Esto se repite el número de veces especificado por loopCount. Si loopCount es -1, el objeto alpha se repite indefinidamente. El tiempo que tarde en ir desde cero hasta uno está especificando en el segundo parámetro usando una escala de milisegundos.
Parámetros:
  • loopCount - número de veces que se ejecuta este objeto alpha; un valor de -1 especifica un bucle indefinido..
  • increasingAlphaDuration - tiempo en milisegundos que tarda el objeto alpha en ir de cero a uno.
 Región Progamada
Método setSchedulingBounds de Behavior
void setSchedulingBounds(Bounds region)
Selecciona la región programada del Behavior a unos límites especificados.
Parámetros:
  • region - Los límites que contienen la región programada del Behavior.
Lista Parcial de Constructores de BoundingSphere
Esta clase define una región de límites esférica que está definida por un punto central y un rádio.
BoundingSphere()
Este constructor crea una límite esférico centrado en el origen (0, 0, 0) con un radio de 1.
BoundingSphere(Point3d center, double radius)
Construye e inicializa un BoundingSphere usando el punto central y el rádio especificados.

Construye un cubo de color del tamaño por defecto. Por defecto, una esquina está situada a 1 metro de cada uno de los ejes desde el origen, resultando un cubo que está centrado en el origen y tiene 2 metros de alto, de ancho y de profundo.
Construye un cubo de color escalado por el valor especificado. El tamaño por defecto es 2 metros de lado. El ColorCube resultante tiene esquinas en (scale, scale, scale) y (-scale, -scale, -scale).

En Java 3D, Behavior es una clase para especificar animaciones o interacciones con objetos visuales. El comportamiento puede cambiar virtualmente cualquier atributo de un objeto visual. Un programador puede usar varios comportamientos predefinidos o especificar un comportamiento personalizado. Una vez que se ha especificado un comportamiento para un objeto visual, el sistema Java 3D actualiza automáticamente la posición, la orientación, el color, u otros atributos del objeto visual.
La distinción entre animación e interacción es si el comportamiento es activado en respuesta al paso del tiempo o en respuesta a actividades del usuario, respectivamente.
Cada objeto visual del universo virtual puede tener sus propio comportamiento predefinido. De echo, un objeto visual puede tener varios comportamientos. Para especificar un comportamiento para un objeto visual, el programador crea objetos que especifiquen el comportamiento, añade el objeto visual al escenario gráfico y hace las referencias apropiadas entre los objetos del escenario gráfico y los objetos Behavior.
En un universo virtual con muchos comportamientos, se necesita una significante potencia de cálculo para calcular los comportamientos. Como tanto el renderizador como el comportamiento usan el mismo procesador, es posible que la potencia de cálculo que necesita el comportamiento degrade el rendimiento del renderizado.
Java 3D permite al programador manejar este problema especificando un límite espacial para que el comportamiento tenga lugar. Este límite se llama región programada. Un comportamiento no está activo a menos que el volumen de activación de ViewPlatformintereseccione con una región progamada del Behavior. En otras palabras, si nadie en el bosque ve el árbol caer, éste no cae. La característica de región programada hace más eficiente a Java 3D en el manejo de universos virtuales con muchos comportamientos.
Un Interpolator es uno de las muchas clases de comportamientos predefinidos en el paquete corazón de Java 3D. Basado en una función de tiempo, el objeto Interpolator manipula los parámetros de un objeto del escenario gráfico. Por ejemplo, para el RotationInterpolator, manipula la rotación especificada por un TransformGroup para afectar la rotación de los objetos visuales que son ancestros de TransformGroup.
La siguiente lista enumera los pasos envueltos para especificar una animación con un objeto interpolator. Los cinco pasos forman una receta para crear un comportamiento de animación con interpolación:
Una acción de comportamiento puede ser cambiar la localización (PositionInterpolator), la orientación (RotationInterpolator), el tamaño (ScaleInterpolator), el color (ColorInterpolator), o la transpariencia (TransparencyInterpolator) de un objeto visual. Como se mencionó antes, los Interpolators son clases de comportamiento predefinidas. Todos los comportamientos mencionados son posibles sin usar un interpolator; sin embargo, los interpolators hacen mucho más sencilla la cracción de comportamientos. Las clases Interpolators existen para proporcionar otras acciones, incluyendo combinaciones de estas acciones.
Clase RotationInterpolator
Esta clase se usa para especificar un comportamiento de rotación de un objeto visual o de un grupo de objetos visuales. Un objeto RotationIterpolator cambia un objeto TransformGroup a una rotación especififca en repuesta a un valor de un objeto Alpha. Como el valor de este objeto cambia cada vez, la rotación también cambia. Un objeto RotationInterpolator es flexible en la especificación del eje de rotación, el ángulo de inicio y el ángulo final.
Para rotaciones constantes sencillas, el objeto RotationInterpolator tiene el siguiente constructor que puede usarse para eso:
El objeto TransformGroup de un interpolador debe tener la capacidad de escritura activada.
Mapear una acción en el tiempo se hace usando un objeto Alpha. La especificación de este objeto puede ser compleja.
Clase Alpha
Los objetos de la clase Alpha se usan para crear una función que varía en el tiempo. La clase Alpha produce un valor entre cero y uno, inclusives. El valor que produce depende de la hora y de los parámetros del objeto Alpha. Los objetos Alpha se usan comunmente con un comportamiento Interpolator para proporcionar animaciones de objetos visuales.
Alpha tiene diez parámetos, haciendo la programación tremendamente flexible. Sin entrar en detalles de cada parámetros, saber que un ejemplar de Alpha puede combinarse fácilmente con un comportamiento para proporcionar rotaciones sencillas, movimientos de péndulo, y eventos de una vez, como la apertura de puertas o el lanzamiento de cohetes.
Como se mencionó anteriormente, cada comportamiento tiene unos límites programados. Estos límites se configuran usando el método setSchedulingBounds de la clase Behavior.
Hay varias formas de especificar una región programada, la más sencilla es crear un objeto BoundingSphere. Otras opciones incluyen BoundingBox y BoundingPolytope.
Clase BoundingSphere
Especificar un límite esférico se consigue especificando un punto central y un rádio para la esfera. El uso normal de este tipo de límites es usar el centro a (0, 0, 0). Entonces el radio se selecciona lo suficientemente grande como para contener el objeto visual, incluyendo todas las posibles localizaciones del objeto.

Unidad#4: Programa 11



Programa: DibujarGrafica


Página 219 del libro "Java para estudiantes" sexta edición, de Douglas Bell y Mike Parr. 


Código:






Programa en ejecución:





Unidad#4: Programa 10



Programa: Globo


Página 172 del libro "Java para estudiantes" sexta edición, de Douglas Bell y Mike Parr. 


Código:



Código clase Globo:




Programa en ejecución:



Unidad#4: Programa 9



Programa: Escalones

Página 167 del libro "Java para estudiantes" sexta edición, de Douglas Bell y Mike Parr. 


Código:






Programa en ejecución:




Unidad#4: Programa 8



Programa: BloqueDeApartamentos


Página 163 del libro "Java para estudiantes" sexta edición, de Douglas Bell y Mike Parr. 


Código:





Programa en ejecución: