Como você calcula se duas linhas estão voltadas para a frente ou para longe?

10

Dados os 4 pontos que descrevem 2 segmentos de linha, como você calcula se a linha A está na direção ou fora da linha B?

As 2 linhas têm um comprimento fixo e podem ser medidas como distância de x1 / y1 a x2 / y2.

insira a descrição da imagem aqui

Robinicks
fonte
Qual é o caso da curva de bezier diferente do caso de linhas retas? Você tem uma curva que possa envolver completamente a outra linha (para que todas as direções apontem "em direção")?
bummzack
1
Você provavelmente precisará esclarecer seus termos. Na Geometria, uma "linha" se estende infinitamente em qualquer direção, em oposição a meia-linha ou segmento, então duas linhas sempre se cruzam, a menos que sejam paralelas. Qual você está perguntando? Você desenhou uma seta, que implica direção, o que para mim implica um segmento ou, no máximo, meia linha. E qual é a sua definição de "para" e "para longe"?
quer
A curva de Bezier pode ser mais difícil de representar na igualdade necessária para resolver um teste de interseção de linha de raio. A propósito, vou mudar a palavra que representa sua flecha para "raio". Você pode obter uma resposta mais rápida. Vou responder se tiver tempo para o almoço, se mais ninguém fizer. Caso contrário, essa é uma tarefa extremamente comum em jogos. Google "Teste de interseção do segmento de linha Ray". Suspeito que o teste da curva de bezier seja semelhante, mas nunca tentei.
Brand12
3
Você deve dividir sua pergunta em duas. A peça com segmentos de linha é muito fácil. A peça com curvas de bezier é extremamente complexa e possui apenas uma solução numérica aproximada.
sam hocevar 12/12
Dividi minha pergunta em 2, conforme solicitado. A segunda parte está aqui: gamedev.stackexchange.com/questions/21463/…
Robinicks

Respostas:

11

Seja Ae Bseja dois pontos na linha preta. Deixe Ce Dseja seu segmento azul. O sinal da zcoordenada do produto cruzado AB^ACinforma se Cestá "esquerdo" ou "direito" da linha preta. Da mesma forma, o produto cruzado AB^CDinforma se a CDdireção é "esquerda" ou "direita" da linha preta.

Realmente não queremos saber se é esquerda ou direita; tudo o que queremos é garantir que eles estejam na mesma direção ou na direção oposta, por isso multiplicamos os dois valores.

O pseudocódigo a seguir deve, portanto, funcionar:

z1 = (xB-xA)*(yC-yA) - (yB-yA)*(xC-xA);
z2 = (xB-xA)*(yD-yC) - (yB-yA)*(xD-xC);
z3 = z1 * z2;

if (z3 < 0)
    ; /* Pointing towards (BUT maybe even crossing) */
else if (z3 > 0 || z2 != 0)
    ; /* Pointing away */
else
    ; /* Parallel */

Receio que precise de algum tempo para escrever uma solução adequada para a curva de Bezier. A situação a seguir está em direção ou fora?

Problema?

sam hocevar
fonte
Para a curva, acredito que você poderia encontrar a tangente da curva no ponto mais próximo ao seu segmento de linha e usá-la da mesma maneira que testa seus outros segmentos de linha. Provavelmente um pouco mais difícil do que parece :)
notlesh
@stephelton: Olhe novamente para a segunda foto para as curvas de bezier, apontando para uma curva que se afasta. Ou considere uma curva com uma tangente paralela ao segmento que possivelmente se cruza, mas que curva em direção ao segmento e cruza.
Cascabel 12/12
+1 para o trollface e boa matemática :). No entanto, o diagrama 'em direção' ainda tem um 'afastamento' - basta mover o ponto de partida acima da linha.
Jonathan Dickinson
@ JonathanDickinson obrigado, atualizei a imagem para deixar um pouco mais claro qual é o meu interrogatório!
sam hocevar 12/12
2

Assumindo que o ponto inicial é o círculo verde e o ponto final é a seta vermelha

Calcule a distância entre o ponto inicial como DS e o segmento preto e faça o mesmo para o ponto final (seta vermelha) que DE. Se DS> DE, o segmento está apontando para. se DE> DS, está apontando para fora. Se ambos são iguais, os dois são paralelos.

Você pode descobrir como calcular a distância de um ponto a um segmento aqui e a uma curva de bezier quadrática aqui . No entanto, dependendo da forma da curva bezier, ela pode retornar resultados estranhos (a curva pode estar se cruzando)

Ravachol
fonte
É garantido que o DS> DE funcione apenas para linhas retas. Pode falhar para Beziers. Além disso, você não conhece a definição de "para". Se a extensão da seta cruzar uma linha definida por 2 pontos, mas não o segmento definido pelos mesmos pontos, ainda é "na direção"?
quer
Estou falando de dois segmentos, não de linhas, então não há "extensão da seta". Além disso, não importa para onde a flecha aponta, pois estamos falando de distâncias aqui. O ponto mais próximo da linha preta pode ser um ponto inicial / final da linha preta, não importa. Os dois segmentos podem ser colineares, esse método ainda funcionará como pretendido. Para curvas mais bege, mencionei que daria resultados estranhos, dependendo da forma da curva.
Ravachol