Você está na página 1de 3

Computa¸c˜ao Gr´afica: algoritmo de sele¸c˜ao

Paulo C´esar Rodacki Gomes

Dalton Solano dos Reis

1 de outubro de 2008

) (ponto

clicado pelo usu´ario) est´a dentro ou fora de um pol´ıgono n˜ao convexo P . O pol´ıgono ´e formado por uma lista de n v´ertices ou pontos p i = (x i , y i ).

A id´eia principal do algoritmo ´e a partir do ponto de sele¸aoc˜ p sel ´e disparado

um “tiro”. Se o tiro cruzar a fronteira do pol´ıgono uma quantidade ´ımpar de

vezes, o ponto de sele¸aoc˜

est´a dentro do pol´ıgono. Caso contr´ario est´a fora. A

dire¸aoc˜ do tiro forma uma reta que chamamos de L. Para facilitar o c´alculo

do pol´ıgono, consideramos a reta L

horizontal.

de intersec¸ao de L com cada lado p i p i+1

O algoritmo a seguir testa se um ponto de sele¸ao p

sel

= (x

sel

, y

sel

A figura 1 ilustra o tiro disparado sobre a reta L a partir do ponto de sele¸aoc˜

p sel . Os pontos p i e p i+1 definem o lado de ´ındice i (lado p i p i+1 ) do pol´ıgono.

Note que exitem 5 intersec¸oesc˜ que p sel est´a dentro. do tiro com a fronteira
Note que exitem 5 intersec¸oesc˜
que p sel est´a dentro.
do tiro com a fronteira do pol´ıgono, indicando
"tiro horizontal"
L
L
p sel
y
pi+1
i
pi

x

Figura 1: Ponto de sele¸aoc˜

1

dentro do pol´ıgono

Excepcionalmente podem ocorrer casos especiais. Por exemplo, o ponto de sele¸aoc˜ poderia estar exatamente na mesma ordenada que um dos v´ertices do pol´ıgono. A figura 2 indica como esses casos s˜ao tratados. Os n´umeros indicam

a quantidade de intersec¸oesc˜ contabilizadas pelo algoritmo em cada caso. L casos 0 2 1
a quantidade de intersec¸oesc˜
contabilizadas pelo algoritmo em cada caso.
L
casos
0
2
1
0
2
1
intersecções número de

L

Figura 2: Casos especiais de intersec¸aoc˜

Agora vamos ao algoritmo. O la¸co principal, com contador i, refere-se a cada

lado do pol´ıgono. Se o lado for horizontal, o teste de intersec¸aoc˜ da reta L com

o lado ´e um teste simples de compara¸aoc˜ de cordenadas. Sempre que o ponto

de sele¸aoc˜ estiver sobre um dos lados, podemos parar o algoritmo considerando

que o usu´ario selecionou o pol´ıgono.

Algoritmo: PontoEmPoligono(P, p sel )

N int 0; para i=1 at´e n fa¸ca se y i = y i+1 ent˜ao

at´e n fa¸ca se y i = y i + 1 ent˜ao � ( x i

(x int , y int ) pto de intersecao do lado p i p i+1 com a reta L; se x int == x s ent˜ao

+ 1 com a reta L; se x i n t == x s ent˜ao p

p sel est´a sobre o

lado horizontal p i p i+1 : PARE;

p sel est´a sobre o lado p i p i+1 : PARE; sen˜ao se x int > x sel e y int > min(y i , y i+1 ) e y int max(y i , y i+1 ) ent˜ao N int N int + 1;

sen˜ao se y sel == y i e x sel min(x i , x i+1 ) e x sel max(x i , x i+1 ) ent˜ao

se N int ´e ´ımpar ent˜ao p sel ´e interior a P; sen˜ao p sel ´e exterior a P;

ent˜ao se N i n t ´e ´ımpar ent˜ao p s e l ´e interior a

Algoritmo 1: Algoritmo de ponto em pol´ıgono

A seguir, listamos os principais elementos do pseudo-c´odigo abaixo:

i: contador do la¸co principal, refere-se a cada um dos n lados do pol´ıgono (i 1 at´e n);

N int : n´

umero de intersec¸oes a serem contabilizadas;

2

p i p i+1 : cada lado do pol´ıgono;

P : o pol´ıgono (lista de pontos ou v´ertices);

p

p int : ponto de intersec¸ao da reta L com o lado p i p i+1 ;

sel : ponto de sele¸ao (ponto que o usu´

ario clicou;

3