Separando o teste do eixo, detectando se um retângulo girado se sobrepor um outro retângulo plano
Pergunta
Eu li sobre retângulos de interseção em:
Algoritmo para detectar a interseção de dois retângulos?
Mas tenho problemas para implementá -lo.
Se R1 (A, B, C, D) for o meu retângulo rotacionado e R2 (a ', b', c ', d') o outro retângulo sem rotação.
A fórmula extraída do link acima é:
edge = v(n) - v(n-1)
Você pode obter uma perpendicular a isso girando -o em 90 °. Em 2d, isso é fácil como:
rotated.x = -unrotated.y
rotated.y = unrotated.x
// rotated: your rotated edge
// v(n-1) any point from the edge.
// testpoint: the point you want to find out which side it's on.
side = sign (rotated.x * (testpoint.x - v(n-1).x) +
rotated.y * (testpoint.y - v(n-1).y);
Minhas bordas rotadas serão de R1 com
AB (XB-XA, YB-YA) assim gotado x é xb-xa? BC (XC-XB, YC-Y1) CD ... AD ...
O TestPoint será um ', B', C ', D' de R2, então eu tenho que verificar o sinal do resultado de todos os pontos de R2 contra as 4 bordas de R1. São 16 comparações se se cruzando. Como sei se encontrei uma borda separada?
Obrigado
Solução
Se, para uma determinada borda, os sinais de qualquer um dos produtos DOT testando contra essa borda não correspondem, você terá um cruzamento. O sinal do produto DOT será o mesmo para todos os pontos em um lado da linha.