• Nenhum resultado encontrado

Computação Gráfica. Aula #2: Elementos de geometria computacional.

N/A
N/A
Protected

Academic year: 2021

Share "Computação Gráfica. Aula #2: Elementos de geometria computacional."

Copied!
46
0
0

Texto

(1)

Computação Gráfica

Aula #2: Elementos de geometria computacional.

MSc. Tomás Orlando Junco Vázquez ISUTIC - 2017

(2)

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.

(3)

Aula de hoje

• Pontos.

• Segmentos de reta. • Vetores.

(4)

Objetivo

Caracterizar os elementos básicos da geometria computacional.

(5)

Estruturas de Dados

Pontos class Ponto2D{ int x, y; } class Ponto3D{ int x, y, z; }

(6)

Estruturas de Dados

Polígonos Retas class Poligono{ Ponto2D points[N]; } class Reta{ float m; float b; } y = mx + b

Ecuación analítica de la recta

Equação analítica da reta

(7)

Estruturas de Dados

A equação analítica precisa o cálculo de uma pendente

m = (p1.y - p0.y) / (p1.x - p0.x)

(8)

Estruturas de Dados

Retas class Reta{ Ponto2D p0, d; } p = p0 + t * d

(9)

Estruturas de Dados

Retas

p = p0 + t * d

Equação paramétrica da reta

p0

p1 d = p1 – p0

(10)

Estruturas de Dados

Retas

p = p0 + t * d

Equação paramétrica da reta

p0

p1 d = p1 – p0

t = 0

(11)

Estruturas de Dados

Retas

p = p0 + t * d

Equação paramétrica da reta

p0

p1 d = p1 – p0

(12)

Estruturas de Dados

Retas

p = p0 + t * d

Equação paramétrica da reta

p0

p1 d = p1 – p0

t = 0.5

(13)

Estruturas de Dados

Retas

p = p0 + t * d

Equação paramétrica da reta

p0

p1 d = p1 – p0

(14)

Estruturas de Dados

Retas

p = p0 + t * d

Equação paramétrica da reta

p0

p1 d = p1 – p0

(15)

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

(16)

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

(17)

Estruturas de Dados

Segmentos

class Segmento{

Ponto2D p1, p2; }

(18)

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.

(19)

Produtos cruzados

Uma definição equivalente, porém mais útil, dá o

produto cruzado p1xp2 como o determinante de uma matriz:

(20)

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.

(21)

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.

(22)

Três pontos sobre um plano podem estar: 1. Sobre uma mesma reta.

(23)

Três pontos sobre um plano podem estar:

2. Orientados no sentido horario (CW – Clockwise).

(24)

Três pontos sobre um plano podem estar:

3. Orientados em sentido anti-horário (CCW – Counter Clockwise).

(25)

Vejamos que sucede quando dois segmentos se

intersectan:

L

S

As extremidades de L estão em lados diferentes de S.

(26)

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

(27)

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

(28)

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.

(29)

L

S

Interseção de segmentos

Vejamos os casos extremos:

S L

L S

(30)

¿Como saber se dois pontos estão do mesmo lado de um segmento? S S.p1 S.p2 p1 p2

Interseção de segmentos

(31)

¿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

(32)

¿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

(33)

¿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

(34)

¿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

(35)

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)

(36)

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)

(37)

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)

(38)

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));

(39)

¿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);

(40)

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;

(41)

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.

(42)

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?

(43)

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)

(44)

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)

(45)

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.

(46)

Computação Gráfica

Aula #2: Elementos de geometria computacional.

MSc. Tomás Orlando Junco Vázquez ISUTIC - 2017

Referências

Documentos relacionados

Manter a saúde financeira Da empresa parceira e a produtividade de forma eficiente Reduzir os índices de acidentabilidade no trabalho Melhorar a satisfação do Cliente Coelce

RECUPERAÇÃO: Todo conteúdo estudado durante o bimestre da P1 e da P2.(A nota da recuperação substitui a menor nota (P1 ou P2). OBS: AS DATAS DESTE CRONOGRAMA ESTARÃO SUJEITOS

alarme Irregularidade de plausibilidade pulso 1 na entrada digital DI3. Causa Não há tensão pulso 1 na entrada digital DI3.. Eliminação da

1) Está ciente de que a viagem para o qual foi selecionado através do Programa da Fundación de la Lengua Española 2018, tem como escopo propiciar a oportunidade de acesso a

da qual protocolou no dia 18 de outubro de 2013, expediente endereçado aos aprovados, convocando para apresentação da documentação comprobatória exigida no referido

Deste modo, observando a necessidade de dar prosseguimento no processo de consolidac¸˜ao do Campus e motivados pelo momento hist´orico da realizac¸˜ao do primeiro processo

Para realizar uma atividade que utiliza a ferramenta Wiki o participante deve informar no campo Novo título da página (1), um nome a página, e, em seguida clicar no botão Criar

Objetivos: Analisar a ocorrência de eventos adversos vacinais em crianças prematuras e a termo referentes às vacinas utilizadas no primeiro ano de vida, sendo BCG,