Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Geometría Computacional Libro1
Geometría Computacional Libro1
Geometría Computacional
Integrantes:
2009-2010
INDICE DE CONTENIDO
2 Triangulación de Polígonos
2.1 Conjetura de Kleen
2.2 Tree Coloring
2.3 Diagonales y Triangulación
2.4 Triangulación Dual
2.5 Intersección entre Segmentos
3 Conjuntos Convexos
3.1 Cierre Convexo CH(S)
3.2 Soporte de S
3.3 Caracterizaciones para determinar la Envolvente Convexa
3.4 Marcha de Jarvis
3.4.1 Descripción Geométrica
3.4.2 Estudio de Complejidad
3.5 Scan Graham
3.5.1 Algoritmo de Graham
3.5.2 Análisis de Complejidad
Geometría Computacional
Para ello se supone que los datos de entrada vienen dados conforme a cierta
distribución de probabilidad y se estudia cual es el tiempo esperado de ejecución.
Todo esto naturalmente pervive, y con fuerza, pero vivimos una tercera
generación de aplicaciones dominada por el procesamiento de información geométrica
y gráfica, presente en áreas tan diversas como son la medicina, la cartografía, el
control de robots o el diseño artístico. La Geometría Computacional ha emergido,
ciertamente, por la necesidad de dar respuesta a esta nueva y creciente demanda.
1.3 Terminología
1.3.1 La recta que pasa por dos puntos, p; q, es el lugar geométrico de los puntos.
Código en Matlab
for j = 1: 2
p(j) = m(k-1,j);
q(j) = m(k,j) ;
r(j) = m(n,j);
s(j) = m(1,j);
end
segmento(p,q)
segmento(r,s)
end
end
Código en C#
//dibujamos las líneas del polígono con el mouse
private void panel_screen_MouseUp(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
Point p = new Point(e.X, e.Y);
puntos.Add(p);
status = prosess_status.DIBUJANDO;
}
else if (e.Button == MouseButtons.Right)
{
if (puntos.Count < 3)
{
MessageBox.Show("Debe seleccionar al menos 3
puntos");
return;
}
polygon = new Point[puntos.Count];
for (int i = 0; i < puntos.Count; i++)
polygon[i] = (Point)puntos[i];
Graphics g = panel_screen.CreateGraphics();
g.Clear(Color.White);
dibujarPoligono();
status = prosess_status.POLIGONOLISTO;
btnTriangular.Enabled = true;
Geometría Computacional
}
}
//en este metodo dibujaremos
private void panel_screen_MouseMove(object sender,
MouseEventArgs e)
{
if (status == prosess_status.DIBUJANDO)
{
Point inicio, fin;
Graphics g = panel_screen.CreateGraphics();
area = Math.Abs(area);
MessageBox.Show("El area es:" + area);
}
{
puntos.Clear();
polygon = null;
Graphics g = panel_screen.CreateGraphics();
g.Clear(Color.White);
btnTriangular.Enabled = false;
status = prosess_status.ESPERANDO;
}
Esta propiedad de contener al segmento que une dos puntos admite una
interpretación curiosa en términos de visibilidad: se “ven interiormente” si
Teorema
P es convexo si, y sólo si, ,y
P es estrellado si, y sólo si, .
Si uno de los vértices del polígono está en el núcleo, entonces se dice que es un
abanico.
P monótono respecto a D
Geometría Computacional
Por Tanto
1
Universidad Central del Ecuador 1
Y el área del triángulo:
del vector y por tanto se rige por la conocida “regla del sacacorchos”.
Aquí nos va a servir para determinar la orientación del triángulo .
Si consideramos la recta que pasa por los puntos y y queremos saber dónde
se encuentra un tercer punto q basta calcular el área signada . Si es
positiva, q está en el semiplano izquierdo determinado por la recta orientada según
. Si es negativa, está en el derecho, y si es cero está en la recta.
Geometría Computacional
Ejemplo
1
Universidad Central del Ecuador 2
Ejercicio
Geometría Computacional
1
Universidad Central del Ecuador 3
Entonces
Código 1 en Matlab
end
end
Código 2 en Matlab
%Función que indica la posición de un punto de acuerdo a la una recta
function areaSig = AreaSig(p1,p2,q)
f1 = [1;p1];
f2 = [1;p2];
f3 = [1;q];
segmento2(q', q');
A = [f1,f2,f3];
1
Universidad Central del Ecuador 4
areaSig = det(A);
dac = sqrt((p1(1)-q(1))^2 + (p1(2)-q(2))^2);
dbc = sqrt((p2(1)-q(1))^2 + (p2(2)-q(2))^2);
if(areaSig > 0)
text(q(1)+ 0.2,q(2),'izquierda')
else if(areaSig < 0)
text(q(1)+ 0.2,q(2),'derecha')
else if(areaSig == 0)
if (q(1)>p1(1) && q(1)<p2(1))
text(q(1)+ 0.2,q(2),'en la recta')
else if dac < dbc
text(q(1)+ 0.2,q(2),'atras')
else if dbc < dac
text(q(1)+ 0.2,q(2),'adelante')
end
end
end
end
end
end
end
Código en C#
//Dibuja los elementos del área signada
bool presiona = false;
Graphics g;
PointF puntoI;
PointF puntoF;
Pen p = new Pen(Color.Blue);
SolidBrush b = new SolidBrush(Color.AntiqueWhite);
ArrayList lineas = new ArrayList();
ArrayList puntos = new ArrayList();
int contador = 0;
presiona = true;
puntoI = new PointF(e.X, e.Y);
puntos.Add(puntoI);
}
private void panel_screen_MouseUp(object sender,
MouseEventArgs e)
{
presiona = false;
Geometría Computacional
#endregion
private void insertar()
{
Linea linea = new Linea(puntoI, puntoF);
lineas.Add(linea);
graficar(linea);
}
private void graficar(Linea l)
{
g.DrawLine(p, l.puntoInicial, l.puntoFinal);
}
return vdeterminante;
}
private void posicionPuntoRecta(Linea l, PointF pun)
{
float determinante = calcularDeterminante(l, pun);
if (determinante > 0)
txtPosicion.Text = "El punto(" + pun.X + "," + pun.Y +
")esta a la izquierda de la recta";
else
if (determinante < 0)
txtPosicion.Text = "El punto(" + pun.X + "," +
pun.Y + ")esta a la derecha de la recta";
else
{
PointF vDirector = new PointF(l.puntoFinal.X -
Geometría Computacional
2. Triangularización de Polígonos
Entonces
Geometría Computacional
Sea
= El número de guardias que recubre el polígono
1
Universidad Central del Ecuador 7
= Conjunto de puntos (vértices del polígono)
I I = Cardinalidad de
Sea un polígono de vértices
Ciertamente (1 es una cota inferior)
Al menos debe haber un guardia
9
11 6
5
3
12
2
entera de .
Definición.-
Una poligonal de un polígono es un segmento entre 2 vértices e que son
claramente visibles el uno del otro.
Primer paso.-
Consiste en triangularizar el polígono con el concepto tree coloring.
Sea el grafo asociado a la triangularización y cuyos nodos son los vértices del
polígono.
12 vértices
Necesito 3
guardias
Diagonales
externas
Segundo paso.-
Definición.-
El k-coloreo es la asignación de k-colores diferentes en los nodos del grafo
asociado al polígono P.
Geometría Computacional
1) Verde
2) Amarillo
3) Rojo
1
Universidad Central del Ecuador 9
Observación:
Tercer paso.-
Cuarto paso.-
Principio de PALOMAR.-
LEMA 1.2.1.- Cada polígono debe tener al menos un vértice estrictamente convexo.
Definición.-
2
Universidad Central del Ecuador 0
Si los lados del polígono tienen orientación positiva.
Sea una recta que pasa por un vértice (el más bajo) → (el que tiene la menor
ordenada), y el más a la derecha, como es orientación positiva el siguiente vértice está
encima de y elángulo es menor a y por tanto se obtiene el vértice convexo.
LEMA 1.2.2 (MEISTERS).- Cada polígono de vértices tiene una diagonal (al
memos) (un triangulo no tiene diagonales).
Demostración
Demostración
Geometría Computacional
Demostración
Si
Si
De n vértices
2
Universidad Central del Ecuador 2
Para el número de triángulos
COROLARIO 1.2.5.-
Demostración
Código en C#
if (puntos.Count < 3) {
MessageBox.Show("Debe seleccionar al menos 3
puntos");
return;
}
polygon = new Point[puntos.Count];
for (int i = 0; i < puntos.Count; i++)
polygon[i] = (Point)puntos[i];
Graphics g = panel_screen.CreateGraphics();
g.Clear(Color.White);
dibujarPoligono();
2
Universidad Central del Ecuador 3
status = prosess_status.POLIGONOLISTO;
btnTriangular.Enabled = true;
}
}
//en este método dibujaremos
private void panel_screen_MouseMove(object sender,
MouseEventArgs e)
{
if (status== prosess_status.DIBUJANDO)
{
Point inicio, fin;
Graphics g = panel_screen.CreateGraphics();
g.Clear(Color.White);
inicio = (Point)puntos[0];
g.DrawLine(new Pen(Color.Yellow, 2), inicio.X - 6,
inicio.Y, inicio.X + 6, inicio.Y);
g.DrawLine(new Pen(Color.Yellow, 2), inicio.X,
inicio.Y - 6, inicio.X, inicio.Y + 6);
m = new miFormaPoligonal(polygon);
m.triangular();
Graphics g = panel_screen.CreateGraphics();
g.Clear(Color.White);
2
Universidad Central del Ecuador 4
draw_ears(false);
dibujarPoligono();
status = prosess_status.TRIANGULACIONCOMPLETA;
}
Graphics g = panel_screen.CreateGraphics();
Definición.-
Geometría Computacional
2
Universidad Central del Ecuador 6
Observación:
Es evidente que cada nodo tiene grado a lo más 3, porque cada triángulo en
nuestra triangularización puede compartir a lo más 3 lados.
Los nodos de grado (1) son hojas del árbol , los nodos de grado (2) son
los caminos del árbol. y los nodos de grado (3) son puntos de
ramificación .
Note que el dual es un árbol binario cuando cualquier nodo tiene grado 1 o 2
(hijos).
a
d
d
a
s,t
b
Geometría Computacional
2
Universidad Central del Ecuador 7
Si existe solución s y t deben estar entre 0 y 1 y luego reemplazo.
Código 1 en Matlab
function p = Interseccion()
a = input('ingrese el punto A: ');
b = input('ingrese el punto B: ');
c = input('ingrese el punto C: ');
d = input('ingrese el punto D: ');
segmento(a,b);
segmento(c,d);
if ( detDen ~=0 )
s =((c(1)-a(1))*(d(2)-c(2))-(d(1)-c(1))*(c(2)-a(2)))/detDen;
t =((c(1)-a(1))*(b(2)-a(2))-(b(1)-a(1))*(c(2)-a(2)))/detDen;
if(((s>=0)&&(s<=1))&&((t>=0)&&(t<=1)))
p(1) = c(1)+t*(d(1)-c(1));
p(2) = c(2)+t*(d(2)-c(2));
segmento2(p,p)
fprintf('los segmentos se intersecan en: ')
p
else
fprintf('los segmentos no se intersecan: ')
end
end
end
Código 2 en Matlab
function P = Interseccion(A,B,C,D)
% calculamos el determinante
da = (B(1)-A(1))*(D(2)-C(2)) - (D(1)-C(1))*(B(2)-A(2));
% if el determinante que es el el denominador es <> 0
if (da~=0)
s =((C(1)-A(1))*(D(2)-C(2))-(D(1)-C(1))*(C(2)-A(2)))/da;
t =((C(1)-A(1))*(B(2)-A(2))-(B(1)-A(1))*(C(2)-A(2)))/da;
%se verifica que s y t esten entre 0 y 1
if(((s>=0)&&(s<=1))&&((t>=0)&&(t<=1)))
P(1)=A(1)+s*(B(1)-A(1));
P(2)=A(2)+s*(B(2)-A(2));
P
segmento2(P,P)
else
Geometría Computacional
Código en C#
2
Universidad Central del Ecuador 8
private PointF interseccion(Linea l1, Linea l2)
{
float xc, yc;
if (l1.pendiente == l2.pendiente)
return PointF.Empty;
else
{
xc = (l2.k - l1.k) / (l1.pendiente - l2.pendiente);
yc = (l2.k * l1.pendiente - l1.k * l2.pendiente) /
(l1.pendiente - l2.pendiente);
return new PointF(xc, yc);
}
}
private void graficaInterseccion()
{
for (int i = 0; i < lineas.Count; i++)
{
for (int j = 0; j < lineas.Count; j++)
{
Linea l1 = (Linea)lineas[i];
Linea l2 = (Linea)lineas[j];
if (i != j)
{
PointF punto = interseccion(l1, l2);
if (punto == PointF.Empty)
MessageBox.Show("No hay intersección");
else
{
float yy = panel_screen.Height - punto.Y;
}
PointF punto2 = new PointF(punto.X - 2,
punto.Y - 2);
g.FillEllipse(Brushes.Red, new
RectangleF(punto2, new SizeF(4, 4)));
}
}
}
}
2
Universidad Central del Ecuador 9
Definición.-
EJEMPLO:
1) cumple con x² + y² ≤ a²
2) cumple con x² + y² ≤ a²
PDQ
+ ) B
PDQ
Ahora
Proposición.-
Demostración
3
Universidad Central del Ecuador 0
PDQ
PDQ
Definición.-
3.2 Soporte de S
Definición.-
Dado un conjunto S en el plano y un punto se dice que una recta que
pasa por es soporte de si queda en uno de los semiplanos cerrados que determina.
Geometría Computacional
Observación:
3
Universidad Central del Ecuador 1
L1 es soporte de
L2 es soporte de
L3 no es soporte porque hay tres puntos de que están en los dos semiplanos.
Proposición:
Demostración
Como
x
Geometría Computacional
Como
Teorema:
1. P es convexo toda recta que pase por dos vértices consecutivos, deja a
P en el semiplano de la izquierda (con la orientación inducida en la recta por
P).
4. P es convexo todo vértice admite una recta soporte de P que pasa por
él.
3
Universidad Central del Ecuador 3
Algoritmos para determinar envolventes convexas
3
Universidad Central del Ecuador 4
3. Paso i: Girar en torno a vi la recta ri en sentido positivo hasta que toque el 1er
punto de S que encuentre en su recorrido, llamamos +1, y la recta que pasa
por y se le llama ri+1.
Observación:
3
Universidad Central del Ecuador 5
1. Encontrar el punto de S con abscisa mínima, si hubiera más de un punto, se
escoge el de menor ordenada, llamamos v1 e insertamos a la lista cíclica C
inicialmente vacía.
Observación:
Si en el paso i-ésimo hay varios puntos alineados que dan el menor angular,
Geometría Computacional
Para cada i localizar el menor angular entre un total de n-1, también puede
hacerse en tiempo O(n), por tanto en tiempo total requerido es O(n.k)
3
Universidad Central del Ecuador 6
O(f(x)) O(g(x)) = O(f(x)g(x)), donde k es el numero de vértices en la envolvente
convexa, que en el peor de los caso k es n, y por tanto la complejidad del algoritmo
será:
O(k.n) = 1 O( )
for i = 1:n-1
for j = 1: 2
if l == k
l = k+1;
end
B(i,j) = A(l,j);
end
l = l+1;
end
%B
end
[n col] = size(A);
aux = A(1,1);
j = 0;
l = 1;
m = 1;
for i = 1: n
if aux >= A(i,1);
aux = A(i,1);
end
end
3
Universidad Central del Ecuador 7
while m <= n
if aux ~= A(m,1)
l = l+1;
else
m = n;
end
m = m+1;
end
for k =1:2
min(1,k) = A(l,k);
end
end
A = QuitarPunto(A,Po);
ab(1) = Po(1);
ab(2) = Po(2)-5;
MAB = ab-Po;
nAB = norm(MAB);
for j = 1:2
P1(j)=A(1,j);
P2(j)=A(2,j);
end
v1 = P1-Po;
alfa1 = acos((MAB*v1')/(nAB*norm(v1)))*(180/pi);
3
Universidad Central del Ecuador 8
v2 = P2-Po;
alfa2 = acos((MAB*v2')/(nAB*norm(v2)))*(180/pi);
if alfa1 < alfa2
vert2 = P1;
ang = alfa1;
else
vert2 = P2;
ang = alfa2;
end
for i = 3: length(A)
for j = 1: 2
P(j) = A(i,j);
end
v = P-Po;
alfa2 = acos((MAB*v')/(nAB*norm(v)))*(180/pi);
if ang > alfa2
ang = alfa2;
vert2 = P;
end
end
else
for j = 1: 2
vert2(j) = A(n-1,j);
end
end
sig = vert2;
end
M(k)=getframe;
end
if pc ~= ps
if k==1
A = QuitarPunto(A,ps); %se elimina el 2do punto de la lista
end
pops = ps - po;
pq = po +3*pops; %obtenemos el rayo entre 2 puntos
v1 = po-ps;
v2 = v1;
3
Universidad Central del Ecuador 9
v3 = pq-ps;
alfa1 = acos((v3*v1')/(norm(v3)*norm(v1)))*(180/pi);
alfa2 = acos((v3*v2')/(norm(v3)*norm(v2)))*(180/pi);
Código Jarvis en c#
return angle;
}
Geometría Computacional
Graphics g;
Pen p = Pens.Blue;
private void frmJarvis_Load(object sender, EventArgs e)
{
g = this.CreateGraphics();
}
bool noUsado(int n)
{
for (int i = 0; i < puntosUsados.Count; i++)
if (n == (int)puntosUsados[i])
return false;
4
Universidad Central del Ecuador 1
return true;
}
La primera tiene que ver con la secuencia de los vértices que describen su
frontera, las condiciones para que un polígono sea convexo son tan fuertes que
supone que esa secuencia tenga propiedades muy importantes.
1. Ordenación
Consiste en ordenar los puntos de S de modo que se obtenga una lista cíclica
L con todos los puntos de S de manera que describe un polígono especial:
estrellado o monótono.
2. Scan
Consiste en comprobar que en L cada punto forme con sus dos adyacentes en
L un ángulo menor que . Si alguno no lo cumple se elimina y así se va
depurando hasta que la lista resultante satisfaga esa condición.
4
Universidad Central del Ecuador 2
3. Insertar en C originalmente vacía y . Hacer q = .
Nota:
Geometría Computacional
Las otras operaciones sobre estructuras de datos puede realizarse cada una en
tiempo constante, por ejemplo si se utiliza una pila para representar C, además cada
vez que se trata un punto se realiza un número constante de operaciones.
El número total de veces que se tratan vértices es O(n), luego el coste total del
Scan es O(n) y del algoritmo es O (nlogn).
v3 = ab-min;
P1(1) = min(1)-5;
P1(2) = min(2);
P2 = P1;
v1 = P1-min;
v2 = v1;
alfa1 = acos((v3*v1')/(norm(v3)*norm(v1)))*(180/pi);
alfa2 = acos((v3*v2')/(norm(v3)*norm(v2)))*(180/pi);
if alfa1 <= alfa2
vert2 = P1;
ang = alfa1;
4
Universidad Central del Ecuador 4
else
vert2 = P2;
ang = alfa2;
end
for i = 1: length(A)
for j = 1: 2
P(j) = A(i,j);
end
v = P-min;
alfa2 = acos((v3*v')/(norm(v3)*norm(v)))*(180/pi);
if ang >= alfa2
ang = alfa2;
vert2 = P;
end
end
else
for j = 1: 2
vert2(j) = A(n,j);
end
end
set(gca,'nextplot','replacechildren');
axis([-50 50 -50 50]);
for kk=1:15
segmento3(min,vert2);
M(k)=getframe;
end
O = [mat;vert2];
if n < 2
M = O;
Comprobar(M)
end
if n>=2
A = QuitarPunto(A,vert2);
OrdenarAngularmente(A,min,2,O);
end
end
[n m]= size(MO);
for p = 1: n
x(p) = MO(p,1);
y(p) = MO(p,2);
end
plot(x,y,'*','MarkerEdgeColor','r')
hold on
i = 1;
while i <= n-2
for j=1:2
Pi(1,j)=MO(i,j);
4
Universidad Central del Ecuador 5
Pi1(1,j)=MO(i+1,j);
Pi2(1,j)=MO(i+2,j);
end
if (Area2(Pi,Pi1,Pi2)<=0)
MO = QuitarPunto(MO,Pi1)
Comprobar(MO)
end
i = i+1;
end
Mf = MO
cadenaPolGraham(Mf)
end
function g = Graham(M,n)
min = MinOminA(M);
MO = OrdenarAngularmente(M,min,1,min);
end
Código Graham en c#
Geometría Computacional
//graficarTodo();
}
ArrayList lineasOrdenar;
ArrayList lineasTmp = new ArrayList();
private void ordenaPorAngulo()
{
int indiceJ = 0;
double angulo = 99999999;
for (int j = 0; j < lineasOrdenar.Count; j++)
{
if (angulo > ((Linea2)lineasOrdenar[j]).angulo)
{
angulo = ((Linea2)lineasOrdenar[j]).angulo;
indiceJ = j;
}
}
lineasTmp.Add(lineasOrdenar[indiceJ]);
lineasOrdenar.Remove(lineasOrdenar[indiceJ]);
}
//limpia o retira los vectores que no deben estar en la lista cíclica
int cont;
private void btnLimpiar_Click(object sender, EventArgs e)
{
try
{
Geometría Computacional
PointF p1 = ((Linea2)lineasTmp[cont]).puntoFinal;
PointF p2 = ((Linea2)lineasTmp[cont + 1]).puntoFinal;
PointF p3 = ((Linea2)lineasTmp[cont + 2]).puntoFinal;
double ang = calcularAngulo(p1, p2, p3);
if (ang > 180)
{
lineasTmp.Remove(lineasTmp[cont + 1]);
cont = cont - 1;
}
else
{
graficar(new Linea2(p1, p2, 0));
4
Universidad Central del Ecuador 7
graficar(new Linea2(p2, p3, 0));
textBox1.Text = ang.ToString();
}
cont++;
}
catch { lineas = (ArrayList)lineasTmp.Clone(); }
}
//calcula el ángulo de los segmento
return angulo;
}
}
Nube de Puntos para dibujar un Círculo
}
Point punto1 = puntosRandom[indiceI];
Point punto2 = puntosRandom[indiceJ];
g.DrawEllipse(Pens.Red, puntosRandom[indiceI].X,
puntosRandom[indiceI].Y, 2, 2);
g.DrawEllipse(Pens.Red, puntosRandom[indiceJ].X,
puntosRandom[indiceJ].Y, 2, 2);
//calcula el centro entre los dos puntos
centro = new PointF((punto1.X + punto2.X) / 2, (punto1.Y +
punto2.Y) / 2);
}
private void btnDibujar_Click(object sender, EventArgs e)
{
int numeroPuntos = int.Parse(txtNumeroPuntos.Text);
calcularDistancias(numeroPuntos);
RectangleF rect = new RectangleF(new PointF(centro.X -
(float)distanciaMax / 2, centro.Y - (float)distanciaMax / 2), new
SizeF((float)distanciaMax, (float)distanciaMax));
g.DrawEllipse(Pens.Blue, rect);
}