Physical Activity Levels by School
CHAPTER FIVE: DISCUSSION
Todo cuerpo geométrico debe contar con elementos que describan su superficie ya sean bidimensionales o tridimensionales, por lo que se deben tener en cuenta estructuras de datos para el almacenamiento de estos elementos de manera que no se desperdicie memoria que pudiera ser útil en el proceso de generación.
Para esto se define una estructura de datos la cual cuenta con una lista de todos los puntos de la geometría y una lista de primitivas que pudieran ser para un espacio bidimensional segmentos y para un espacio tridimensional triángulos, los cuales cuentan con la referencia a los puntos de la geometría.
Figura 7.10. Diagrama de jerarquía de clases para delimitadores.
Las primitivas que se usarán para representar la superficie (Véase Figura 7.10) como se mencionó anteriormente para el caso bidimensional es la clase Segmento y para el tridimensional la clase Face. Ambas primitivas (Face y Segmento) comparten el mismo concepto, es decir son delimitadores (iDelimit) de la superficie que representan. Se decide hacer una abstracción de elementos delimitadores ya que la única representación que existe para un contorno o superficie no tiene que ser
Apéndices.
necesariamente a través de segmentos y triángulos. Por otra parte esta claro que para esto no es necesario agrupar elementos bidimensionales y tridimensionales en una abstracción como ha sido el caso. Esto sucede ya que es conveniente que exista un cuerpo geométrico independiente de la dimensión sobre el cual trabaje el algoritmo de manera que las diferencias de su funcionamiento en el llenado del cuerpo geométrico no dependan de la geometría utilizada sino del propio algoritmo. Para más detalles relacionados véase Apéndice II.
Los puntos que definen la geometría, la lista de primitivas y responsabilidades que tienen que ver únicamente con el cuerpo geométrico se encuentran representadas en la clase iContenedor (Véase Figura 7.11).
Apéndices.
Para el caso bidimensional es la clase Polígono y para el tridimensional la clase Malla. Ambas clases (Polígono y Malla) comparten el mismo concepto, es decir representan la geometría (iContenedor). Para más detalles relacionados se debe consultar el Apéndice III. Especificaciones de la representación de la geometría.
En los subepígrafes que siguen se explicarán las funcionalidades que brinda esta clase en un espacio bidimensional (clase Poligono) y en un espacio tridimensional (clase Malla).
Distancia de un punto a la geometría.
La distancia de un punto a la geometría es necesaria dado que pudiera ser un criterio para ordenar las partículas pivotes, con lo que se lograrían distintos patrones de generación, lo cual es conveniente para la simulación de distintos tipos de materiales. También se utiliza para determinar cuándo una partícula es interior conociendo el estado de su punto centro y su radio. Esta distancia se calcula como la mínima distancia entre el punto y todos los puntos de la geometría.
Función relacionada.
• Nombre de la función: distPuntoCont.
• Tipo de valor de retorno: MY_DOUBLE.
• Tipo del parámetro v de entrada: DVector3.
• Significado del parámetro de retorno: La distancia de un punto de entrada v a la geometría.
• Significado del parámetro v de entrada: Un punto del espacio que puede ser interior a la geometría o exterior.
• Definición: MY_DOUBLE iContenedor::distPuntoCont(DVector3 v) [ virtual pura]. Esta función la implementan las clases Poligono y Malla.
Apéndices.
Limites máximos y mínimos para una geometría.
Los límites máximos y mínimos para una geometría no son más que las coordenadas mínimas y máximas de las proyecciones de todos los puntos sobre los ejes de coordenadas. Estas se calculan tomando las mínimas y las máximas coordenadas x, y, z de todas las proyecciones sobre los ejes.
Función relacionada con los límites mínimos.
• Nombre de la función: GetStart.
• Tipo de valor de retorno: DVector3.
• Significado del parámetro de retorno: Es un vector cuyas coordenadas x, y e z son las mínimas en toda la geometría.
• Definición: DVector3 iContenedor::GetStart () [ virtual pura]. Función relacionada con los límites máximos.
• Nombre de la función: GetEnd.
• Tipo de valor de retorno: DVector3.
• Significado del parámetro de retorno: Es un vector cuyas coordenadas x, y e z son las máximas en toda la geometría.
• Definición: DVector3 iContenedor::GetEnd () [ virtual pura]. Estas funciones las implementan las clases Poligono y Malla.
Punto más interior a la geometría.
El punto más interior a la geometría es exactamente el lugar geométrico a partir del cual comenzará el proceso de generación. Este punto se calcula distribuyendo una gran cantidad de puntos con un intervalo fijo por todos los ejes del espacio a partir de los límites mínimos hasta los límites máximos de cada coordenada. Luego de todos los puntos resultantes obtenidos a partir de las combinaciones entre las coordenadas x, y, z distribuidas anteriormente se busca el que mayor distancia tenga a la geometría, y
Apéndices.
pero se garantiza que el punto esta lo suficientemente alejado de la superficie o contorno como para que no aborte el proceso de generación por esta causa.
Función relacionada con la búsqueda del punto más interior.
• Nombre de la función: getPtMasInterior.
• Tipo de valor de retorno: DVector3.
• Significado del parámetro de retorno: Es el punto que se aproxima a ser el más alejado de todos los delimitadores que representan la geometría.
• Definición: DVector3 iContenedor::getPtMasInterior()[ virtual ].
• Comentario: Esta función no calcula el punto más interior, solo devuelve el valor del atributo relacionado, esto se hace ya que es conveniente realizar este calculo solo una vez y guardar su valor para cuando este pueda necesitarse, razón por la cual dicha función se implementa en la clase abstracta.
Atributo relacionado con el punto más interior:
• Nombre del atributo: pt_m_int.
• Tipo del atributo: DVector3.
• Significado del atributo: Representa el punto que se aproxima a ser el punto mas interior a la geometría.
• Clase a la que pertenece: iContenedor.
• Comentario: Este atributo se calcula en los procedimientos de inicialización de las clases que implementan la clase abstracta. No se hace en el constructor de la clase, ya que no necesariamente se conoce toda la geometría en ese momento. La clase brinda opciones de cargar la geometría en cualquier momento a través de un fichero, también brinda la posibilidad de cargarla interactivamente, por lo que se considera recomendable llamar al procedimiento de inicialización una vez se cargue la geometría.
Procedimiento relacionado con los cálculos de inicialización de la geometría.
• Nombre del procedimiento: inicialice.
Apéndices.
• Significado del parámetro de retorno: Devuelve verdadero si el proceso de
inicialización fue bien, falso en otro caso.
• Definición: bool iContenedor::inicialice()[virtual pura].
Solo la función inicialice se implementan en las clases derivadas Poligono y Malla.
Punto interior a una geometría.
Conocer cuando un punto es interior a una geometría es un aspecto fundamental para alcanzar nuestros objetivos ya que la estructura de un material esta dada con los puntos y partículas que pertenecen a ese material. Para comprender los pasos que siguen en el proceso de determinación de la interioridad de un punto se explican brevemente a continuación los conceptos vectoriales relacionados.
Concepto de área del paralelogramo.
Como ya todos conocen la norma del producto escalar (Véase Ecuación 7.1).
sen
Φ
b
a
b
a
×
=
∗
∗
(7.1)Figura 7.12 Paralelogramo formado por los vectores a y b.
El producto escalar da como resultado el área del paralelogramo formado por los vectores a y b (véase Figura 7.12). En la expresión anterior |a|*|b|*sen ø, cambiará de signo en dependencia del ángulo entre los vectores a y b. Este resultado es útil para determinar si un punto se encuentra por debajo (izquierda) o por encima (derecha) de un segmento.
Apéndices.
Figura 7.13 Clase DMath3.
La clase DMath3 es una clase básica que implementa funciones útiles para el trabajo vectorial. Todos los métodos de esta clase son estáticos, razón por la que no son necesarias instancias de esta clase para hacer uso de sus métodos (Véase Figura 7.13).
Función relacionada con el cálculo del área.
• Nombre de la función: Area3.
• Tipo de valor de retorno: double.
• Tipo del parámetro a de entrada: DVector3.
• Tipo del parámetro b de entrada: DVector3.
• Tipo del parámetro c de entrada: DVector3.
• Significado del valor de retorno: El área del paralelogramo formado por los vectores b-a y c-a.
• Significado del parámetro a de entrada: Un punto del triangulo a analizar.
• Significado del parámetro b de entrada: Un punto del triangulo a analizar.
• Significado del parámetro c de entrada: Un punto del triangulo a analizar.
No todos los métodos de esta clase son importantes para este trabajo. En la medida que se necesite se explicarán los métodos que si lo son.
Apéndices.
Intercepción de dos segmentos.
Se necesita conocer cuándo dos segmentos se interceptan. Por ejemplo evidentemente los segmentos AB y DC (véase Figura 7.14) se interceptan, pero ¿como saberlo de manera computacional? Se puede llegar a deducir, solo es necesario hacer el cálculo de las cuatro áreas de los paralelogramos formados por los vectores BD-BA (a), BC-BA (b), CB-CD (c) y CA-CD (d) para luego comparar sus signos.
Los dos segmentos se interceptan si los siguientes predicados son ciertos.
• Los signos de las áreas calculados para el caso a) y b) son distintos.
• Los signos de las áreas calculados para el caso c) y d) son distintos.
Si alguno de estos predicados es falso entonces los segmentos AB y CD no interceptan.
Figura 7.14. Representación de los cálculos de áreas implicadas en la determinación de la intercepción de dos segmentos.
Apéndices.
Se debe aclarar además que todo lo expuesto hasta aquí es válido siempre que ninguno de los dos segmentos analizados sean colineales con cualquiera de los puntos del otro segmento analizado.
Función relacionada con la intercepción de dos segmentos.
• Nombre de la función: IntercepSegmentos.
• Tipo de valor de retorno: bool.
• Tipo del parámetro p1 de entrada: DVector3.
• Tipo del parámetro p2 de entrada: DVector3.
• Tipo del parámetro p3 de entrada: DVector3.
• Tipo del parámetro p4 de entrada: DVector3.
• Significado del valor de retorno: Devuelve verdadero en caso de que los
segmentos representados por los puntos de entrada p1, p2, p3 y p4 se intercepten, en otro caso el valor de retorno es falso.
• Significado del parámetro p1 de entrada: Primer punto del primer segmento a verificar.
• Significado del parámetro p2 de entrada: Segundo punto del primer segmento a verificar.
• Significado del parámetro p3 de entrada: Primer punto del segundo segmento a verificar.
• Significado del parámetro p4 de entrada: Segundo punto del segundo segmento a verificar.
• Definición: bool PuntoInteriorPoligono::IntercepSegmentos(const DVector3 p1, const DVector3 p2, const DVector3 p3, const DVector3 p4) [protected virtual].
Más detalles relacionados con las clases de interioridad se brindan en los epígrafes a continuación.
Apéndices.
Punto interior a un polígono.
Un punto es interior a un polígono si dado una semirrecta con origen igual al punto analizado intercepta en un numero impar de segmentos al polígono, entonces el punto es interior. Es valido aclarar que se simplificaría mucho los cálculos si esta semirrecta no pasa por ningún vértice del polígono. De esta manera se evitan los casos ambiguos mencionados anteriormente.
Figura 7.15. Diagrama de herencia para la clase PuntoInteriorPoligono.
En esta investigación se decidió utilizar el algoritmo de punto interior descrito anteriormente, por ser uno de los más sencillos, aunque no tan eficiente, debido a esto se recomienda para futuras implementaciones que se tenga en cuenta algún tipo de generalidad con respecto a otros criterios más eficientes que resuelvan el problema de la interioridad. Pensando de esta manera se decide generalizar los criterios de interioridad (Véase Figura 7.15).
Función relacionada con la interioridad de un punto a un polígono.
• Nombre de la función: isPuntoInterior.
• Tipo de valor de retorno: bool.
Apéndices.
• Significado del valor de retorno: Devuelve verdadero si el punto es interior, en otro caso el valor de retorno es falso.
• Significado del parámetro v de entrada: Un punto para el cual se desea saber si es interior o no.
• Definición: bool PuntoInteriorPoligono::isPuntoInterior(const DVector3 v) [virtual].
Concepto de volumen del paralelepípedo.
En este caso al igual que en el cálculo de las áreas existen signos que dependen de los ángulos φ y β que forman los vectores a, b y c (Véase Ecuación 7.2), como se puede apreciar en la ecuación vectorial para el cálculo del volumen de un paralelepípedo (Véase Figura 7.16).
2
,
1
,
cos
=
∗
∗
∗
∗
=
∗
×b
c
a
b
c
sen
i
ar
r
r
r
r
r
β
θ
(7.2) Figura 7.16 Paralelepípedo.Al igual que para el espacio bidimensional, pero trabajando con volúmenes para un espacio tridimensional. A la clase que implementa esta funcionalidad (Véase Figura 7.13), se hizo referencia en epígrafes anteriores.
Función relacionada con el cálculo de volumen.
• Nombre de la función: Volumen3.
Apéndices.
• Tipo del parámetro p1 de entrada: DVector3.
• Tipo del parámetro p2 de entrada: DVector3.
• Tipo del parámetro p3 de entrada: DVector3.
• Tipo del parámetro p de entrada: DVector3.
• Significado del valor de retorno: Volumen del paralelepípedo formado por la base p1, p2, p3 y el punto p.
• Significado del parámetro p1: El primer punto de la base del paralelepípedo a calcularle el volumen.
• Significado del parámetro p2: El segundo de la base del paralelepípedo a
calcularle el volumen.
• Significado del parámetro p3: El tercer punto de la base del paralelepípedo a calcularle el volumen.
• Significado del parámetro p: Es el punto alejado de la base del paralelepípedo.
• Definición: MY_DOUBLE DMath3::Volumen3 (const DVector3 &p1, const
DVector3 &p2, const DVector3 &p3, const DVector3 &p ).
Intercepción de un segmento y un triángulo en el espacio.
Para conocer si un segmento se intercepta con un triangulo en el espacio al menos se necesita conocer cinco puntos. Dos de ellos determinan el segmento y otros tres determinan el triángulo (Véase Figura 7.17). A continuación se presenta ocho paralelepípedos formados con estas combinaciones de puntos.
Apéndices.
Si el segmento v1v2 intercepta al triangulo s1s2s3 entonces los siguientes predicados son ciertos.
• Los signos del volumen calculado para los paralelepípedos 1 y 2 son distintos.
• Los signos del volumen calculado para los paralelepípedos 3 y 4 son distintos.
• Los signos del volumen calculado para los paralelepípedos 5 y 6 son distintos.
• Los signos del volumen calculado para los paralelepípedos 7 y 8 son distintos. Si alguno de estos predicados es falso entonces el segmento no intercepta con el triángulo. Se debe aclarar además que todo lo expuesto hasta aquí es válido siempre que no se den los casos degenerados de que el segmento no intercepte ninguno de los puntos ni aristas del triángulo. En otro caso no se pudiera asegurar. Esta funcionalidad se encuentra incluida en la función de interioridad de la malla discutida en el siguiente epígrafe.
Punto interior a un cuerpo 3d.
Se utiliza el mismo método que en el caso de un polígono. Pero con la particularidad de que cuando se trace la semirrecta puede que existan puntos ambiguos si no se tienen en cuenta los casos degenerados descritos anteriormente. La probabilidad de que ocurra dicha ambigüedad es muy baja, en la mayoría de los casos bastará con trazar otra semirrecta de dirección aleatoria, como se analiza en la investigación [9]. La clase que implementa la interioridad para un cuerpo en un espacio tridimensional
(Véase ) es PuntoInteriorMalla. A continuación se expone la función
relacionada.
Apéndices.
Figura 7.18 Diagrama de herencia para la clase PuntoInteriorMalla.
Función relacionada con la interioridad de un punto a un cuerpo.
• Nombre de la función: isPuntoInterior.
• Tipo de valor de retorno: bool.
• Tipo del parámetro v de entrada: DVector3.
• Significado del valor de retorno: Devuelve verdadero si el punto es interior, en otro caso el valor de retorno es falso.
• Significado del parámetro v de entrada: Un punto para el cual se desea saber si es interior o no.
• Definición: bool PuntoInteriorMalla::isPuntoInterior(const DVector3 v) [virtual].
Características de las partículas.
Apéndices.
pretende tratar partículas que puedan ser manejadas fácilmente de manera que la complejidad radique en los algoritmos trabajados, no en el tipo de partícula, aunque sí debe lograrse una generalización que permita a futuras implementaciones extender las partículas básicas a otros tipos mas complejos que permitan modelar una gama amplia de materiales de manera más exacta.
En las generalizaciones propuestas se tiene en cuenta además aspectos que ayudan a la rapidez cuando se deciden algunos estados tales como:
• Verificación si dos partículas se interceptan.
• Verificación si una partícula es exterior.
• Verificaciones de los criterios de vecindades.
Teniendo en cuenta los aspectos mencionados se propone una figura geométrica que permita facilidades de cálculo para el trabajo, es decir una representación que aproxime a los distintos tipos de partículas. Se trata de una figura o cuerpo que envuelva a la partícula trabajada, para esto se decide utilizar círculo y esfera en espacios bidimensionales y tridimensionales respectivamente. Adicionalmente cada partícula debe de contar con una serie de parámetros que la identifiquen y proporcionen información sobre su estado actual como:
La ubicación espacial se refiere a las coordenadas x, y, z del centro de la esfera que envuelve a la partícula, para el caso bidimensional se utilizan las mismas estructuras siempre que sea posible especificando la coordenada z como cero.
El estado de interioridad de la partícula especifica si la misma es interior a la geometría o no.
El estado de pertenencia al frente de avance es una información útil en cuanto los criterios de búsqueda de pivotes, ya que una partícula que no pertenezca a la superficie de avance probablemente esté rodeada, por lo que no tiene sentido tratar de colocarle otra partícula tangente.
La distancia de la partícula a la geometría es útil dado que es un criterio útil necesario para resolver el problema de interioridad y a la vez brinda un criterio de selección de pivotes de manera ordenada, lo que es conveniente para evitar demasiadas irregularidades en el comportamiento de la porosidad del material.
Apéndices.
Una vez conocidas las especificaciones sobre los tipos de partículas se propone una generalización que tenga en cuenta estos conceptos (Véase Figura 7.19 ).
.
Figura 7.19. Diagrama de herencia de la clase Esfera.
Atributo relacionado con el contorno.
• Nombre del atributo: contorne.
• Tipo de atributo: bool.
Apéndices.
Atributo relacionado con la interioridad.
• Nombre del atributo: int_p.
• Tipo de atributo: bool.
• Significado del atributo: Si es verdadero significa que la partícula está
completamente dentro de la geometría, falso en otro caso.
Atributo relacionado con la distancia de la partícula a la geometría.
• Nombre del atributo: dist.
• Tipo de atributo: MY_DOUBLE.
• Significado del atributo: Representa la distancia de la partícula a la geometría. Método relacionado con el cálculo de la distancia y la interioridad.
• Nombre de la función: inicialice.
• Descripción de la función: Se encarga del cálculo de distancia de la partícula a la geometría y el estado de interioridad de la partícula, se debe llamar cuando se instancia la partícula.
Función relacionada con el centro del círculo o esfera que envuelve a la partícula.
• Nombre de la función: getCentro.
• Tipo de valor de retorno: DVector3.
• Significado del valor de retorno: El centro del círculo o esfera que envuelve la partícula.
Función relacionada con el radio del círculo o esfera que envuelve la partícula.
• Nombre de la función: getRadioBall.
• Tipo de valor de retorno: MY_DOUBLE.
• Significado del valor de retorno: Radio del círculo o esfera que envuelve la