vectores unitarios unitario sentido resueltos normalizar ejercicios ejemplo direccion c++ c math

c++ - sentido - vectores unitarios ejercicios resueltos



¿Por qué necesitamos un Vector de Unidad(en otras palabras, por qué necesitamos normalizar vectores)? (5)

Debemos convertir un vector en unidades antes de hacer algo con él.

Esta declaración es incorrecta. Todos los vectores no son vectores unitarios.

Los vectores que forman la base para un espacio de coordenadas tienen dos propiedades muy agradables que los hacen más fáciles de trabajar:

  1. Son ortogonales
  2. Son vectores unitarios - magnitud = 1

Esto le permite escribir cualquier vector en un espacio tridimensional como una combinación lineal de vectores unitarios:

texto alternativo http://www.equationsheet.com/latexrender/pictures/e691d8878d3d2cf83362af36faa16096.gif

Puedo elegir convertir este vector en un vector unitario si necesito dividir cada componente por la magnitud

texto alternativo http://www.equationsheet.com/latexrender/pictures/78a0af48a0d02492fdd2b5377157c6a8.gif

Si no sabes que son espacios de coordenadas o vectores de base, te recomendaría aprender un poco más sobre las matemáticas de los gráficos antes de ir más allá.

Estoy leyendo un libro sobre juegos de IA.

Uno de los términos que se usa es normalizar un vector que convierta un vector en una unidad. Para hacerlo, debes dividir cada dimensión x , y y z por su magnitud.

Debemos convertir el vector en una unidad antes de hacer algo con ella. ¿Por qué?

¿Y podría alguien dar algunos escenarios donde debemos usar un vector unitario?

¡Gracias!


A menudo estás normalizando un vector porque solo te importa la dirección que señala el vector y no la magnitud.

Un escenario concreto es la asignación normal . Al combinar la luz que golpea la superficie y los vectores que son perpendiculares a la superficie, puede dar una ilusión de profundidad. Los vectores de la superficie definen la dirección paralela y la magnitud del vector haría cálculos reales incorrectos.


Además de las respuestas ya proporcionadas, mencionaría dos aspectos importantes.

La trigonometría se define en un círculo unitario

Todas las funciones trigonométricas se definen sobre un círculo unitario. El número pi sí se define sobre un círculo unitario.

Cuando normaliza los vectores, puede usar todas las funciones trigonométricas directamente , sin ninguna ronda de escalado. Como se mencionó anteriormente, el ángulo entre dos vectores unitarios es simplemente: acos(dot(u, v)) , sin escalar más.

Los vectores de unidad nos permiten separar la magnitud de la dirección

Un vector puede interpretarse como una cantidad que lleva dos tipos de información: magnitud y dirección. La fuerza, la velocidad y la aceleración son ejemplos importantes.

Si desea tratar por separado la magnitud y la dirección, una representación de la forma vector = magnitude * direction , donde la magnitude es un escalar y una direction un vector unitario, a menudo es muy conveniente: los cambios en magnitud implican manipulaciones escalares y cambios de dirección no modifique la magnitud La direction tiene que ser un vector unitario para garantizar que la magnitud del vector sea ​​exactamente igual a la magnitude .


Como dice John D. Cook, principalmente estás haciendo esto porque te importa la dirección, no el vector en sí. Dependiendo del contexto, lo más probable es que no desee / necesite la información de magnitud, solo la dirección en sí misma. Se normaliza para eliminar la magnitud para que no sesgue otros cálculos, lo que a su vez simplifica muchas otras cosas.

En términos de IA, imagina que tomas el vector V entre P1 (el tipo malo de IA) y P2 (tu héroe) como la dirección para que el chico malo se mueva. ¿Quieres que el malo se mueva a una velocidad N por latido? ¿Cómo se calcula esto? Bien, normalizamos el vector en cada latido, multiplicamos por N para determinar cuánto se movieron, o prenormalizamos la dirección en primer lugar, y simplemente multiplicamos el vector unitario por N cada vez; de lo contrario, el malo se movería más si estuviera más lejos del héroe! Si el héroe no cambia de posición, ese es un cálculo menos del que preocuparse.

En ese contexto, no es gran cosa, pero ¿y si tienes cien tipos malos? ¿O mil? ¿Qué pasa si tu IA necesita lidiar con combinaciones de tipos malos? De repente, ahorras cien o mil normalizaciones por latido. Como se trata de un puñado de multiplicaciones y una raíz cuadrada para cada uno, al final se llega al punto en el que no normalizar los datos antes de tiempo significa que vas a matar tu tasa de procesamiento de IA.

En términos más generales, las matemáticas para esto son muy comunes, las personas hacen aquí lo que hacen para cosas como renderización 3D. Si no unificas, por ejemplo, las normales para tus superficies, tendrías potencialmente miles de normalizaciones por renderizado, son completamente innecesarios Tiene dos opciones: una: hacer que cada función realice el cálculo, o dos, prenormalizar los datos.

Desde la perspectiva del diseñador de marcos: este último es intrínsecamente más rápido: si asumimos el primero, incluso si el usuario piensa normalizar los datos, tendrá que pasar por la misma rutina de normalización O tendrá que proporcionar dos versiones de cada función, que es un dolor de cabeza. Pero en el momento en que haces que la gente piense qué versión de la función llamar, también puedes hacer que piensen lo suficiente para llamar a la correcta, y solo proporcionarla en primer lugar, haciendo que hagan lo correcto para el rendimiento .


No tiene que normalizar los vectores, pero hace un montón de ecuaciones un poco más simples cuando lo hace. También podría hacer que las API sean más pequeñas: cualquier forma de estandarización tiene el potencial de reducir el número de funciones necesarias.

Aquí hay un ejemplo simple. Supongamos que quiere encontrar el ángulo entre dos vectores uy v. Si son vectores unitarios, el ángulo es simplemente arccos (u v). Si no son vectores unitarios, el ángulo es arccos (u v / (| u | | v |)). En ese caso, terminas computando las normas de u y v de todos modos.