Interseção do lado do vetor e do triângulo

7

Estou tentando criar uma superfície de toque triangular para iOS, onde o usuário pode arrastar em torno de um ponto dentro desse triângulo. Usando as informações desta página , é fácil descobrir se o ponto arrastado está dentro ou fora do triângulo. No entanto, quero recortar o ponto nas bordas do triângulo se o usuário arrastar para fora do triângulo.

Isso é fácil para o lado AB e o lado AC , porque eu só preciso definir os vetores u ou v como zero, respectivamente, se o dedo do usuário arrastar para fora dessas bordas. No entanto, não sei como encontrar o ponto p, no lado BC. Preciso encontrar esse ponto de interseção se o usuário arrastar o dedo para fora da borda BC .

triângulo com rótulos de ponto e vetor

chmod
fonte
Simplesmente faça a projeção escalar do vetor (B (u + v)) no vetor (BC), usando o produto Dot, dividindo-o pelo comprimento quadrado de BC.
Martijn Courteaux

Respostas:

2

Todos os pontos na borda BC têm a propriedade que | u | + | v | = 1. Reduzir a magnitude do vetor mais longo para que essa propriedade seja verdadeira obterá seu ponto de interseção. Na sua foto, isso significaria reduzir a magnitude de v em 0,245764829343853. Isso só funciona se sua linha de A ao dedo cruzar BC.

Chewy Gumball
fonte
11
Para elaborar: se você detectar u + v> 1, dimensione os valores (u, v) em 1 / (u + v); isso encurtará o vetor u + v para que ele caia na borda.
22412 Nathan Reed
1

Supondo que você tenha coordenadas para A, B e C (que chamaremos de Ax, Ay etc.) e D = u + v, o ponto de interseção é:

X = ((Bx - Cx) (Ax * Dy - Ay * Dx) - (Bx * Cy - By * Cx) (Ax - Dx))/((By - Cy) (Ax - Dx) - (Bx - Cx) (Ay - Dy))

Y = ((By - Cy) (Ax * Dy - Ay * Dx) - (Bx * Cy - By * Cx) (Ay - Dy))/((By - Cy) (Ax - Dx) - (Bx - Cx) (Ay - Dy))

Veja também o artigo da Wikipedia sobre interseção linha-linha .

sblom
fonte