Geometría Computacional La geometría computacional es una rama de ciencia de la computación que estudia algoritmos para resolver problemas geométricos. Nos concetraremos en la representación y programación de algunos objetos y algoritmos en el plano cartesiano. Un punto sólo tiene posición y se representa con un par de coordenadas (x, y). Una ĺınea está definida por todos los puntos que satisfacen la ecuación ax + by + c = 0. Formas alternativas de escribir la ecuación: y = mx + n, donde m se conoce como la pendiente de la recta, y (0, n) es un punto de la recta. Jorge Baier Aranda, PUC 68
La misma ecuación se puede escribir dado un punto (x 1, y 1 ) y la pendiente: y y 1 = m(x x 1 ). Dado dos puntos (x 1, y 1 ) y (x 2, y 2 ), la ecuación es: o y y 1 = y 1 y 2 x 1 x 2 (x x 1 ). (y 2 y 1 )x + (x 1 x 2 )y + x 2 y 1 x 1 y 2 = 0. También es frecuente escribir la ecuación de la forma x a + y b = 1, donde (a, 0) y (0, b) son puntos de la recta. El punto de intersección de dos rectas l 1 : y = m 1 x + n 1 y l 2 : y = m 2 x + n 2 es ( ) n2 n 1 n 2 n 1, m 1 + n 1 m 1 m 2 m 1 m 2 Jorge Baier Aranda, PUC 69
El ángulo que forman dos rectas no paralelas l 1 : a 1 x + b 1 y + c 1 y l 2 : a 2 x + b 2 y + c 2 = 0 está dado por ( ) a1 b 2 a 2 b 1 arctan a 1 a 2 + b 1 b 2 en caso de usar rectas con pendientes, el ángulo es el siguiente: Si m es la pendiente de una recta, entonces 1 m perpendicular a ella. es la pendiente de una recta Jorge Baier Aranda, PUC 70
Segmentos, vectores y producto cruz Un segmento es un subconjunto de una ĺınea recta comprendido entre dos puntos de ella. Un vector es un segmento dirigido entre el origen y un punto del plano. Si p 0 = (0, 0) y p 1 = (x, y), entonces usamos la notación p 1 (o simplemente p 1 ) para hablar del segmento dirigido p 0 p 1. Jorge Baier Aranda, PUC 71
El producto cruz entre dos vectores p 1 = (x, y) y p 2 se define por p 1 p 2 = x 1 x 2 y 1 y 2 y representa el área (con signo) del paralelógramo de la figura. y p 1 + p 2 p 1 sentido horario p 2 x Si p1 está en sentido horario desde p 2 con respecto al origen, entonces p 1 p 2 > 0. Si p 1 p 2 = 0, entonces p 1 y p 2 son colineales con el origen. Jorge Baier Aranda, PUC 72
Pregunta: cómo determinar si al recorrer los segmentos p 0 p 1 y p 1 p 2, desde p 0 se debe doblar a la izquierda o a la derecha? Respuesta: el giro será a la izquierda ssi p 1 p 2 está en sentido horario desde p 1 p 0, es decir, ssi (p 2 p 1 ) (p 0 p 1 ) > 0 Jorge Baier Aranda, PUC 73
Intersección de dos segmentos Es muy sencillo usar el producto cruz para determinar si dos segmentos se intersectan. La prueba se realiza en dos fases. En la primera (rechazo rápido) se revisa si los rectángulos más pequeños que contienen a los segmentos se intersectan. Si tenemos un segmento p 1 p 2 (con p 1 = (x 1, y 1 ), p 2 = (x 2, y 2 ), entonces el rectángulo más pequeño que lo contiene es el de esquina inferior izquierda p I = (x I, y I ), donde x I = mín{x 1, x 2 } y y I = mín{y 1, y 2 }, y de esquina superior derecha p S = (x S, y S ), donde x S = máx{x 1, x 2 } y y S = máx{y 1, y 2 }. Jorge Baier Aranda, PUC 74
Dos rectángulos, representados por sus esquinas superior derecha e inferior izquierda, (p 1 I, p1 S ) y (p2 I, p2 S ), se intersectan ssi (mín{x 1 S, x 2 S} máx{x 1 I, x 2 I}) (mín{y 1 S, y 2 S} máx{y 1 I, y 2 I}) Jorge Baier Aranda, PUC 75
La segunda fase consiste en determiar si los extremos del primer segmento quedan a lados opuestos del primero y vice versa. Esto se puede hacer fácilmente usando el producto cruz. Mirando la siguiente figura: p 3 p 2 p 1 p 4 Sabemos que para que los extremos de p 3 p 4 queden a lados diferentes de p 1 p 2, se tiene que dar que p 3 p 1 y p 4 p 1 estén en sentidos horarios distintos con respecto a p 2 p 1. Así, basta con chequear que: ((p 3 p 1 ) (p 2 p 1 ))((p 4 p 1 ) (p 2 p 1 )) 0 Jorge Baier Aranda, PUC 76
Para asegurarse que los segmentos se intersectan hay que verificar la misma condición, pero con respecto al otro segmento. Como verificar si una secuencia de puntos p 0,..., p n 1 son los vértices de un poĺıgono convexo? Respuesta: verificando que al recorrer los vértices no hayan vueltas a la derecha y a la izquierda, simultáneamente. Esto se puede hacer usando el producto cruz. Jorge Baier Aranda, PUC 77
Rayos horizontales Un rayo horizontal hacia la derecha desde p 0 = (x 0, y 0 ) es el conjunto de puntos con coordenadas (x, y 0 ), con x x 0. La interesección entre un rayo horizontal hacia la derecha desde p 0 y un segmento p 1 p 2, con p 1 = (x 1, y 1 ), p 2 = (x 2, y 2 ) se puede haciendo la interesección entre el segmento p 1 p 2 y el segmento p 0 p 3 con p 3 = (x 0, máx{y 0, y 1, y 2 }) Jorge Baier Aranda, PUC 78
Pertenece p a P? Preguntarse si un punto p pertenece a un poĺıgono P = p 0,..., p n es un problema sencillo si P es convexo. Cómo lo hacemos? En un caso más general, tal vez no lo es tanto... El problema se puede enfrentar usando el teorema de la curva de Jordan, que simplemente dice que un poĺıgono divide al plano en dos regiones, la interior y la exterior. Jorge Baier Aranda, PUC 79
Así, si dibujamos algún rayo que salga desde el punto, si éste atraviesa el borde un número impar de veces, entonces el punto está dentro del poĺıgono. Al programar una rutina que verfifique esto, hay que tener en cuenta que el rayo podría pasar por un vértice... Jorge Baier Aranda, PUC 80
Área de un Polígono Es sorprendentemente sencillo calcular el área de un poĺıgono usando el producto cruz. La idea es elegir un punto arbitrario y sumar las áreas con signo de todos los triángulos definidos entre el punto arbitrario y una arista del poĺıgono (se debe recorrer los vertices del poĺıgono en orden horario o antihorario). Así si P = p 0,..., p n es un poĺıgono cualquiera, entonces A(P ) = 1 2 n 1 (x i y i+1 x i+1 y i ). i=0 Jorge Baier Aranda, PUC 81
Triangulación de polígonos Aún cuando el área de un poĺıgono cualquiera puede ser fácil de calcular, el problema de triangular un poĺıgono puede ser relevante. El algoritmo de Van Gogh ataca este problema cortando orejas al poĺıgono. Una oreja es un triángulo formado por dos aristas contiguas del poĺıgono u una cuerda de éste. Para encontrar una oreja, basta con recorrer el poĺıgono en sentido horario y encontrar un giro a la izquierda (esto se puede determinar con el producto cruz). Una vez encontrada la oreja, se eliminan las aristas del poĺıgono y se agrega a la cuerda como una nueva arista. Jorge Baier Aranda, PUC 82