Separando o teste do eixo, detectando se um retângulo girado se sobrepor um outro retângulo plano

StackOverflow https://stackoverflow.com/questions/622687

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

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top