Computação Gráfica
Aula #2: Elementos de geometria computacional.
MSc. Tomás Orlando Junco Vázquez ISUTIC - 2017
Bibliografía recomendada
FOLEY, J. et al. - Computer Graphics: Principles and Practice; 3ª ed.; New York: Addison-Wesley, 2014.
CORMEN, Thomas H. et al – Introduction to Algorithms; 2ª ed.; EEUU, 2001.
Aula de hoje
• Pontos.
• Segmentos de reta. • Vetores.
Objetivo
Caracterizar os elementos básicos da geometria computacional.
Estruturas de Dados
Pontos class Ponto2D{ int x, y; } class Ponto3D{ int x, y, z; }Estruturas de Dados
Polígonos Retas class Poligono{ Ponto2D points[N]; } class Reta{ float m; float b; } y = mx + bEcuación analítica de la recta
Equação analítica da reta
Estruturas de Dados
A equação analítica precisa o cálculo de uma pendente
m = (p1.y - p0.y) / (p1.x - p0.x)
Estruturas de Dados
Retas class Reta{ Ponto2D p0, d; } p = p0 + t * dEstruturas de Dados
Retas
p = p0 + t * d
Equação paramétrica da reta
p0
p1 d = p1 – p0
Estruturas de Dados
Retas
p = p0 + t * d
Equação paramétrica da reta
p0
p1 d = p1 – p0
t = 0
Estruturas de Dados
Retas
p = p0 + t * d
Equação paramétrica da reta
p0
p1 d = p1 – p0
Estruturas de Dados
Retas
p = p0 + t * d
Equação paramétrica da reta
p0
p1 d = p1 – p0
t = 0.5
Estruturas de Dados
Retas
p = p0 + t * d
Equação paramétrica da reta
p0
p1 d = p1 – p0
Estruturas de Dados
Retas
p = p0 + t * d
Equação paramétrica da reta
p0
p1 d = p1 – p0
Segmento
Uma combinação convexa de dois pontos distintos p1 = (x1, y1) e p2 = (x2, y2) é cualquier ponto p3 = (x3, y3) tal que, para algum t na faixa 0 ≤ t ≤ 1, temos que
x3 = t*x1 + (1-t)*x2 e y3 = t*y1 + (1-t)*y2 Escrevemos também
Segmentos y Vetores
Dados dois pontos distintos p1 e p2, o segmento
de recta p1p2 é o conjunto de combinações
convexas de p1 e p2.
Denominamos p1 e p2 extremidades do segmento
p1p2.
Falamos do segmento dirigido p1p2, e este é diferente de p2p1 em quando a sentido.
Se p1 é a origem (0,0) podemos tratar o
Estruturas de Dados
Segmentos
class Segmento{
Ponto2D p1, p2; }
Produtos cruzados
Considerendo os vetores p1 e p2 da imagem, podemos interpretar o produto cruzado p1xp2 como a área do paralelogramo formado pelos pontos (0,0), p1, p2 e p1+p2.
Produtos cruzados
Uma definição equivalente, porém mais útil, dá o
produto cruzado p1xp2 como o determinante de uma matriz:
Produtos cruzados.
Se p1xp2 é positivo, então p1 está em sentido horário em relação a p2 em relação à origen (0, 0); se p1xp2 é negativo, então p1 está em sentido anti-horário em relação a p2.
Interseção de segmentos
Uma forma de determinar interseção de
segmentos é usando a equação paramétrica das retas que contêm aos segmentos. Mas esta
variante é propensa a erros numéricos de cálculo. Se não se requer conhecer o ponto exato de
interseção, uma forma comum está baseada no conceito de orientação de pontos.
Três pontos sobre um plano podem estar: 1. Sobre uma mesma reta.
Três pontos sobre um plano podem estar:
2. Orientados no sentido horario (CW – Clockwise).
Três pontos sobre um plano podem estar:
3. Orientados em sentido anti-horário (CCW – Counter Clockwise).
Vejamos que sucede quando dois segmentos se
intersectan:
L
S
As extremidades de L estão em lados diferentes de S.
L
S
As extremidades de L estão em lados diferentes de S. As extremidades de S estão no mesmo lado de L.
Interseção de segmentos
Vejamos que sucede quando dois segmentos não
L
S
As extremidades de L estão no mesmo lado de S.
Interseção de segmentos
Vejamos que sucede quando dois segmentos não
boolean INTERSECT(Segmento L, Segmento S){ return !SAMEPLACE(L.p1, L.p2, S) &&
!SAMEPLACE(S.p1, S.p2, L); }
Esta solução ainda não cobre todos os casos.
L
S
Interseção de segmentos
Vejamos os casos extremos:
S L
L S
¿Como saber se dois pontos estão do mesmo lado de um segmento? S S.p1 S.p2 p1 p2
Interseção de segmentos
¿Como saber se dois pontos estão do mesmo lado de um segmento? S S.p1 S.p2 p1 S.p1, S.p2, p1 estão orientados CW
Interseção de segmentos
¿Como saber se dois pontos estão do mesmo lado de um segmento? S S.p1 S.p2 p1 p2 S.p1, S.p2, p2 estão orientados CW
Interseção de segmentos
¿Como saber se dois pontos estão do mesmo lado de um segmento? S S.p1 p1 p2 S.p1, S.p2, p1 estão orientados CW
Interseção de segmentos
¿Como saber se dois pontos não estão do mesmo lado de um segmento?
S S.p1 S.p2 p1 p2 S.p1, S.p2, p2 estão orientados CCW
Interseção de segmentos
A ferramenta Produto Cruzado aplica-se só a vetores. Por isso precisaremos realizar uma translação até colocar p0 em (0;0).
Determinando o sentido da rotação
(x0;y0)
(x1;y1)
Para realizar a translação restamos p0 à cada ponto. O resultado mostra-se em vermelho:
Determinando o sentido da rotação
(x0;y0) (x1;y1) (x2;y2) (0;0) (x1–x0;y1–y0) (x2–x0;y2–y0)
Uma vez transladados os pontos podemos proceder a calcular o produto cruzado dos vetores v1 y v2.
Determinando o sentido da rotação
(x1–x0;y1–y0)
(x2–x0;y2–y0)
Determinando o sentido da rotação
S.p1xp2 = (x1–x0) * (y2–y0) - (x2–x0) * (y1–y0)
int DIRECTION(Ponto2D p0, Ponto2D p1, Ponto2D p2){
return Math.signum((p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y));
¿Como saber se dois pontos estão do mesmo lado de um segmento?
Interseção de segmentos
boolean SAMEPLACE(Ponto2D p1, Ponto2D p2, Segmento S){
return DIRECTION(S.p1, S.p2, p1) == DIRECTION(S.p1, S.p2, p2);
Interseção de segmentos
boolean INTERSECT(Segmento L, Segmento S){ int d1 = DIRECTION(S.p1, S.p2, L.p1);
int d2 = DIRECTION(S.p1, S.p2, L.p2); int d3 = DIRECTION(L.p1, L.p2, S.p1); int d4 = DIRECTION(L.p1, L.p2, S.p2); if(d1*d2 < 0 && d3*d4 < 0) return true;
if(d1 == 0 && ONSEGMENT(S, L.p1)) return true; if(d2 == 0 && ONSEGMENT(S, L.p2)) return true; if(d3 == 0 && ONSEGMENT(L, S.p1)) return true; if(d4 == 0 && ONSEGMENT(L, S.p2)) return true; return false;
Interseção de segmentos
boolean ONSEGMENT(Segmento S, Ponto2D P){
return min(S.p1.x, S.p2.x) <= P.x <= max(S.p1.x, S.p2.x) &&
min(S.p1.y, S.p2.y) <= P.y <= max(S.p1.y, S.p2.y); }
O procedimento ONSEGMENT assume que o segmento S e o ponto P são colineares.
Exercicio 1
Sejam os pontos:
P0=(234;8), P1=(-45;349), P2=(600;-80), P3=(1000;-45). a. Interceptam-se os segmentos P0P1 e P2P3?
Exercicio 2
Aplicando a primeira definição de Produto Cruzado de vetores, determine o área dos seguintes triângulos: a. P0=(8;8), P1=(-6;-4), P2=(8;-4)
Exercicio 3
Aplicando a primeira definição de Produto Cruzado de vetores, determine o área dos seguintes cuadriláteros:
a. P0=(2;3), P1=(0;0), P2=(-1;-1), P3=(-8;-3) b. P0=(2;3), P1=(5;0), P2=(-1;-1), P3=(-8;-3)
Tarefa
Implemente em Java uma programa para determinar o área de:
a. Qualquer triângulo dados seus vértices.
b. Qualquer cuadrilátero dados seus vértices em sentido anti-horário.
c. Qualquer polígono dados seus vértices em sentido anti-horário.
Computação Gráfica
Aula #2: Elementos de geometria computacional.
MSc. Tomás Orlando Junco Vázquez ISUTIC - 2017