Encontre um vetor de unidade exatamente a meio caminho entre dois segmentos de linha conectados


8

Parece uma pergunta rápida e fácil, mas não consegui encontrar exatamente o que estou procurando:

Como calcular um vetor de comprimento unitário que está apontando ao longo da linha que é exatamente 50% do ângulo de dois segmentos de linha conectados?

Uma imagem fala mais que mil palavras (que também são melhores do que minha explicação!). Exemplo de um vetor de unidade que divide dois segmentos de linha conectados
Então, basicamente, eu quero calcular o vetor de unidade azul, considerando os dois segmentos de linha vermelha (que na verdade são 3 pontos e, portanto, garantem a conexão)

Os segmentos vermelhos são arbitrários e o resultado não precisa ser uma unidade, seria apenas mais fácil para mim.
Também seria útil ter uma maneira de forçar o vetor resultante a apontar em uma determinada direção (em relação aos segmentos de entrada), isso não é essencial, pois acho que posso resolver isso - pois os segmentos de linha de entrada acabam se formando um n-gon.

Quaisquer exemplos seriam ideais em C ++, por favor, mas outros idiomas são bem-vindos.

Muito obrigado por qualquer indicação.

Respostas:


13

Crie e normalize dois vetores do seu segmento vermelho, começando pelo vértice comum e adicione os resultados (componente por componente). Em seguida, você pode normalizar a saída se desejar obter um vetor de unidade.

O problema é que você sempre terminará no segundo caso, porque o ângulo entre 2 vetores sempre será menor que 180 °. Mas é claro que você pode simplesmente criar o vetor oposto e ver qual deles melhor se adequa ao seu objetivo.

Também há um caso especial em que os dois vetores estão alinhados e a média será 0 (mas você pode detectá-lo facilmente).


Excelente, acho que é exatamente isso que estou procurando! Eu sabia que era fácil :) Eu vou deixá-la aberta apenas para ver o que outras respostas eu recebo ... Graças
Adam Naylor

Eu estava prestes a escrever um método mais complexo que envolva o produto escalar, apesar de já ter usado esse método simples antes, doh!
CiscoIPPhone

O que você quer dizer com "O problema é que você sempre acaba sendo o segundo caso"?
CiscoIPPhone

@ CiscoIPPhone Eu acredito que ele está se referindo ao meu diagrama. A solução produto escalar é mais do que bem-vindo CiscoIPPhone, pelo menos eu vou dar-lhe um +1 :)
Adam Naylor

Na verdade, eu estava me referindo à sua imagem. Usando um produto de ponto, você pode obter o ângulo entre os dois vetores, mas novamente ele permanecerá abaixo de 180 °.
XGouchet

1

Eu acho que você pode obter uma direção consistente, tratando isso como se estivesse gerando um vértice 2D normal. Isso é:

  1. Pegue em cada um dos vetores vermelhos, troque os componentes xey e negue um deles para criar os normais.

  2. Normalize-os.

  3. Soma esses dois vetores e renormalize.

Você provavelmente também desejará testar o caso em que as duas linhas vermelhas se sobrepõem - a renormalização final tentará dividir por zero lá.


Obrigado Adam, essa abordagem tem um nome? Eu gostaria de investigar mais ...
Adam Naylor

Não que eu saiba. O truque normal de geração de vectores é explicado pelo stackoverflow.com/questions/1243614/...
Adam

0

Seja A e B seus vetores:

resultado

Os vetores somadores não precisam ser vetores unitários, mas simplesmente iguais em comprimento; portanto, se | A | > = | B |, você pode:

resultado equivalente

que é mais numericamente estável, já que você tem apenas uma fração e o denominador maior

como a soma funciona

O mesmo resultado pode ser obtido por subtração, mais uma vez os vetores devem ter o mesmo comprimento

Isso funciona apenas para ângulos não convexos; você pode simplesmente testar se seu ângulo é convexo e multiplicar H por -1


Eu não acho que isso vai funcionar se | A | ! = | B | ... considerar A = [0,1] B = [100,0], o resultado não é [.707, .707]
Richard Fabian

@ Richard Fabian Você está certo, eu esqueci a desigualdade do triângulo!
FxIII
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.