Computação Gráfica
Detecção de Colisão entre Segmentos de Reta

Em primeiro lugar é necessário diferencia Cálculo e Detecção de colisão entre objetos.
Cálculo de Colisão significa determinar, através de equações ou de algum algoritmo iterativo a região(ponto, reta, plano, volume) de colisão entre dois objetos.
Detecção de Colisão significa determinar, se existe ou não colisão entre dois objetos.

A seguir é apresentado um algoritmo para detecção de colisão entre dois segmentos de reta.
 

Uso de Envelopes

Para acelerar o processo de deteção de colisão, em primeiro lugar deve-se utilizar um envelope retangular que englobe um dos segmentos de reta e testar este envelope contra os dois pontos extremos do outro segmento de reta.
Estes teste tem o objetivo de determinar a IMPOSSIBILIDADE de existência da colisão, nuca de confirmar se ela existe. Na figura 1,  por exemplo, os testes determinarão que os extrremos de uma das retas não está dentro do envelope da outra.


Figura 1 - Uso de Envelopes Descartando Colisão entre Segmentos de Reta

É importante notar que os testes com os envelopes devem ser realizados tomando-se o envelope de uma das retas contra os vértices da outra e vice-versa. Na figura 2, por exemplo o teste esquerda informaria que poder haver uma colisão entre as retas, mas o teste da direita, descarta esta possibilidade.
 


Figura 2 - Duplo teste com Envelopes

Determinação da Intersecção

Existem casos, entretanto em que o testes com envelopes não é conclusivo, exigindo um teste matemático mais efetivo. Para estes casos, deve-se calcular de que lado os pontos extremos de uma reta estão em relação a outra. Se ambos os pontos estiverem do mesmo lado, não há intereseção. Da mesma forma que o exemplo anteriro, este teste tem que ser feito tomando-se os pontos de uma das retas e testandos-os contra a outra e vice-versa.

Tomando o caso da figura 3, pode-se saber de que lado da reta CD estão os pontos A e B através do seguinte algoritmo:

1) Cria-se um vetor que represente a reta CD:

        VCD = D-C

2) Cria-se um vetor de C até A:

        VAC  =  A - C

3) Cria-se um vetor entre C até B:

        VBC  =  B - C

4) Faz-se o produto vetorial entre VCD e VAC e entre VCD e VBC:

        N1 = VCD x VAC

        N2 = VCD x VBC

5) Toma-se as componentes Z dos produtos vetoriais (N1 e N2). Se estas componentes tiverem mesmo sinal, então os pontos A e B estão do mesmo lado da reta CD; se forem diferentes, estão em lados diferentes.


 
Figura 3 - Vértices para o Cálculo do Produto Vetorial


Note que o mesmo processo deve ser repetido tomando AB como a reta e C e D como os pontos a serem testados.
 

Produto Vetorial

O produto vetorial entre dois vetores V1 e V2 é um vetor VN, perpendicular ao plano definido po V1 e V2.
O cálculo deste protudo pode ser efeito através da seguinte fórmula:
 N.x = V1.y * V2.z - V1.z * V2.y
 N.y = V1.z * V2.x - V1.x * V2.z
 N.z = V1.x * V2.y - V1.y * V2.x