Encuentre un vector unitario exactamente a medio camino entre dos segmentos de línea conectados


8

Parece una pregunta rápida y fácil, pero no he podido encontrar exactamente lo que estoy buscando, así que:

¿Cómo calcular un vector de longitud unitaria que apunta a lo largo de la línea que es exactamente el 50% del ángulo de dos segmentos de línea conectados?

Una imagen dice miles de palabras (¡eso también es mejor que mi explicación!) Ejemplo de un vector unitario que divide dos segmentos de línea conectados
Así que básicamente quiero calcular el vector de la unidad azul dados los dos segmentos de línea roja (que en realidad son 3 puntos y, por lo tanto, se garantiza que estén conectados)

Los segmentos rojos son de longitud arbitraria, y el resultado no tiene que ser una unidad, simplemente sería más fácil para mí.
También sería útil tener una manera de forzar el vector resultante para que apunte en una determinada dirección (en relación con los segmentos de entrada), esto no es esencial ya que creo que puedo resolverlo, ya que los segmentos de línea de entrada finalmente se forman un n-gon

Cualquier ejemplo sería ideal en C ++, pero otros lenguajes son bienvenidos.

Muchas gracias por cualquier puntero.

Respuestas:


13

Cree y normalice dos vectores a partir de su segmento rojo, comenzando por su vértice común, luego agregue los resultados (componente por componente). Entonces puede normalizar la salida si desea obtener un vector unitario.

El problema es que siempre terminarás en el segundo caso, porque el ángulo entre 2 vectores siempre será inferior a 180 °. Pero, por supuesto, puede crear el vector opuesto y ver cuál se adapta mejor a su propósito.

También hay un caso especial cuando ambos vectores están alineados y el promedio será 0 (pero puede detectarlo fácilmente).


Excelente ¡Creo que esto es exactamente lo que estoy buscando! Sabía que era fácil :) Lo dejaré abierto solo para ver qué otras respuestas recibo ... Gracias
Adam Naylor

Estaba a punto de escribir un método más complejo que involucrara el producto de puntos a pesar de haber usado este método simple antes, ¡sí!
CiscoIPPhone

¿Qué quieres decir con "El problema es que siempre terminarás en el segundo caso"?
CiscoIPPhone

@CiscoIPPhone Creo que se está refiriendo a mi diagrama. Una solución de producto punto es más que bienvenida CiscoIPPhone, al menos le daré un +1 :)
Adam Naylor

De hecho, me refería a tu imagen. Usando un producto de puntos, puede obtener el ángulo entre los dos vectores, pero nuevamente se mantendrá por debajo de 180 °.
XGouchet

1

Creo que puede obtener la dirección para ser consistente si trata esto como si estuviera generando un vértice 2D normal. Es decir:

  1. Tome cada uno de los vectores rojos, intercambie los componentes x e y y niegue uno de ellos para crear las normales.

  2. Normalizarlos

  3. Suma esos dos vectores y renormaliza.

Probablemente también desee probar el caso en el que las dos líneas rojas se superponen entre sí: la renormalización final intentará dividir por cero allí.


Gracias Adam, ¿este enfoque tiene nombre? Me gustaría estudiarlo más a fondo ...
Adam Naylor

No que yo sepa. El truco normal de generación de vectores se explica en stackoverflow.com/questions/1243614/…
Adam

0

Deje que A y B sean sus vectores:

resultado

Los vectores sumadores no necesitan ser vectores unitarios, sino simplemente de igual longitud, de modo que si | A | > = | B |, puedes:

resultado equivalente

que es más estable numéricamente ya que solo tiene una fracción y el denominador más grande

como funciona la suma

Se puede obtener el mismo resultado por sustracción, una vez más, los vectores deben tener la misma longitud

Esto funciona solo para ángulos no convexos; simplemente puede probar si su ángulo es convexo y multiplicar H por -1


No creo que esto vaya a funcionar si | A | ! = | B | ... considere A = [0,1] B = [100,0], el resultado no es [.707, .707]
Richard Fabian

@ Richard Fabian Tienes razón, ¡olvidé la desigualdad del Triángulo!
FxIII
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.