vectores unitarios unitario normalizar normalizacion magnitud lineal ejercicios ejemplo vector normalizing

unitarios - vector unitario en r3



¿Cuál es la necesidad de normalizar un vector? (6)

Eso es un poco como preguntar por qué multiplicamos los números. Aparece todo el tiempo.

El sistema de coordenadas cartesiano que utilizamos es una base ortonormal (consiste en vectores de longitud 1 que son ortogonales entre sí, base significa que cualquier vector puede representarse mediante una combinación única de estos vectores), cuando desea rotar su base ( que ocurre en la mecánica de los videojuegos cuando miras a tu alrededor) usas matrices cuyas filas y columnas son vectores ortonormales.

Tan pronto como empieces a jugar con matrices en álgebra lineal lo suficiente, querrás vectores ortonormales. Hay demasiados ejemplos para simplemente nombrarlos.

Al final del día no necesitamos vectores normalizados (de la misma manera que no necesitamos hamburguesas, podríamos vivir sin ellos, pero ¿a quién iremos?), Pero el patrón similar de v / |v| aparece tan a menudo que las personas decidieron darle un nombre y una notación especial (un ^ sobre un vector significa que es un vector normalizado) como un atajo.

Los vectores normalizados (también conocidos como vectores unitarios) son, básicamente, un hecho de la vida.

Tratando de entender los vectores un poco más.

¿Cuál es la necesidad de normalizar un vector?

Si tengo un vector, N = (x, y, z)

¿Qué obtiene realmente cuando lo normaliza? Tengo la idea de que tiene que dividir x / | N | y / | N | & z / | N |. Mi pregunta es: ¿por qué hacemos esto? Quiero decir, ¿qué obtenemos de esta ecuación?

¿Cuál es el significado o el propósito "interno" de hacer esto?

Un poco de una pregunta de matemáticas, me disculpo, pero realmente no estoy claro en este tema.


Estás haciendo su longitud 1 - encontrando el vector unitario que apunta en la misma dirección.

Esto es útil para varios propósitos, por ejemplo, si toma el producto de punto de un vector con un vector unitario, tiene la longitud del componente de ese vector en la dirección del vector unitario.


Lectura de Godot Game Engine
La documentación sobre el vector unitario , la normalización y el producto de puntos realmente tiene mucho sentido. Aquí está el artículo:

Vectores de unidad Ok, entonces sabemos qué es un vector. Tiene una dirección y una magnitud. También sabemos cómo usarlos en Godot. El siguiente paso es aprender sobre los vectores unitarios. Cualquier vector con magnitud de longitud 1 se considera un vector unitario. En 2D, imagina dibujar un círculo de radio uno. Ese círculo contiene todos los vectores unitarios existentes para 2 dimensiones:

Entonces, ¿qué tienen de especial los vectores unitarios? Los vectores unitarios son asombrosos. En otras palabras, los vectores unitarios tienen varias propiedades muy útiles.

No puedo esperar para saber más sobre las fantásticas propiedades de los vectores unitarios, pero paso a paso. Entonces, ¿cómo se crea un vector unitario a partir de un vector regular?

Normalización Tomar cualquier vector y reducir su magnitud a 1.0 mientras se mantiene su dirección se llama normalización. La normalización se realiza dividiendo los componentes x e y (y z en 3D) de un vector por su magnitud:

var a = Vector2(2,4) var m = sqrt(a.x*a.x + a.y*a.y)

ax / = m ay / = m Como habrás adivinado, si el vector tiene una magnitud 0 (es decir, no es un vector sino el origen también llamado vector nulo), se produce una división por cero y el universo pasa por un segundo big bang , excepto en polaridad inversa y luego de vuelta. Como resultado, la humanidad está a salvo, pero Godot imprimirá un error. ¡Recuerda! El vector (0,0) no se puede normalizar !.

Por supuesto, Vector2 y Vector3 ya proporcionan un método para hacer esto:

a = a.normalized()

Producto puntual Bien, el producto puntual es la parte más importante de las matemáticas vectoriales. Sin el producto puntual, Quake nunca se habría hecho. Esta es la sección más importante del tutorial, así que asegúrate de comprenderlo correctamente. La mayoría de las personas que tratan de entender las matemáticas vectoriales se rinden aquí porque, a pesar de lo simple que es, no pueden hacer nada con ellas. ¿Por qué? He aquí por qué, es porque ...

El producto punto toma dos vectores y devuelve un escalar:

var s = a.x*b.x + a.y*b.y

Sí, más o menos eso. Multiplica x del vector a por x del vector b. Haz lo mismo con y y súmalo. En 3D es casi lo mismo:

var s = a.x*b.x + a.y*b.y + a.z*b.z

Lo sé, es totalmente sin sentido! Incluso puedes hacerlo con una función incorporada:

var s = a.dot (b) El orden de dos vectores no importa, a.dot (b) devuelve el mismo valor que b.dot (a).

Aquí es donde comienza la desesperación y los libros y tutoriales muestran esta fórmula:

Y te das cuenta de que es hora de dejar de hacer juegos 3D o juegos 2D complejos. ¿Cómo puede algo tan simple ser tan complejo? Alguien más tendrá que hacer el próximo Zelda o Call of Duty. Los juegos de rol de arriba hacia abajo no se ven tan mal después de todo. Sí, escuché que alguien hizo bastante a voluntad con uno de esos en Steam ...

Así que este es tu momento, este es tu momento de brillar. ¡NO TE RINDAS! En este punto, este tutorial dará un giro brusco y se centrará en lo que hace que el producto de puntos sea útil. Esto es, por qué es útil. Nos enfocaremos uno por uno en los casos de uso para el producto punto, con aplicaciones de la vida real. No más fórmulas que no tengan ningún sentido. Las fórmulas tendrán sentido una vez que aprendas para qué sirven.

Revestimiento La primera propiedad útil y más importante del producto punto es verificar qué aspectos secundarios está mirando. Imaginemos que tenemos dos vectores, a y b. Cualquier dirección o magnitud (ni origen). No importa cuáles sean, pero imaginemos que calculamos el producto de puntos entre ellos.

var s = a.dot (b) La operación devolverá un solo número de punto flotante (pero como estamos en un mundo vectorial, los llamaremos escalares, seguiremos usando ese término de ahora en adelante). Este número nos dirá lo siguiente:

Si el número es mayor que cero, ambos están mirando hacia la misma dirección (el ángulo entre ellos es <90 ° grados). Si el número es menor que cero, ambos miran en dirección opuesta (el ángulo entre ellos es> 90 ° grados). Si el número es cero, los vectores se forman en L (el ángulo entre ellos es de 90 ° grados). Así que pensemos en un escenario de uso real. Imagina que Snake está atravesando un bosque, y luego hay un enemigo cerca. ¿Cómo podemos saber rápidamente si el enemigo ha visto a Snake descubierto? Para descubrirlo, el enemigo debe poder ver a Snake. Digamos, entonces que:

La serpiente está en la posición A. El enemigo está en la posición B. El enemigo está mirando hacia el vector de dirección F.

Entonces, vamos a crear un nuevo vector BA que va desde la guardia (B) a la Serpiente (A), restando los dos:

var BA = A - B Idealmente, si el guardia mirara directamente hacia la serpiente, para hacer contacto visual, lo haría en la misma dirección que el vector BA.

Si el producto de punto entre F y BA es mayor que 0, se descubrirá Snake. Esto sucede porque podremos decir que el guardia está mirando hacia él:

if (BA.dot(F) > 0): print("!")

Parece que la serpiente está a salvo hasta ahora.

Revestimiento con vectores unitarios Ok, ahora sabemos que el producto de punto entre dos vectores nos permitirá saber si están mirando hacia el mismo lado, lados opuestos o simplemente perpendiculares entre sí.

Esto funciona de la misma manera con todos los vectores, sin importar la magnitud, así que los vectores unitarios no son la excepción. Sin embargo, el uso de la misma propiedad con vectores unitarios produce un resultado aún más interesante, ya que se agrega una propiedad adicional:

Si ambos vectores están orientados hacia la misma dirección exacta (paralela entre sí, el ángulo entre ellos es 0 °), el escalar resultante es 1. Si ambos vectores están orientados hacia la dirección opuesta exacta (paralela entre sí, pero el ángulo entre ellos) es 180 °), el escalar resultante es -1. Esto significa que el producto de punto entre los vectores unitarios siempre está entre el rango de 1 y -1. Así que de nuevo ...

Si su ángulo es de 0 °, el producto de puntos es 1. Si su ángulo es de 90 °, el producto de puntos es 0. Si su ángulo es de 180 °, el producto de puntos es -1. Uh ... esto es extrañamente familiar ... visto esto antes ... ¿dónde?

Tomemos dos vectores unitarios. El primero está apuntando hacia arriba, el segundo también, pero lo rotaremos completamente desde arriba (0 °) hasta abajo (180 ° grados) ...

Mientras graficamos el escalar resultante!

Jajaja ¡Todo tiene sentido ahora, esta es una función Cosine!

Podemos decir que, entonces, como regla ...

El producto de punto entre dos vectores unitarios es el coseno del ángulo entre esos dos vectores. Entonces, para obtener el ángulo entre dos vectores, debemos hacer:

var angle_in_radians = acos( a.dot(b) )

¿Para qué sirve esto? Bien, la obtención directa del ángulo probablemente no sea tan útil, pero el solo hecho de saber el ángulo es útil como referencia. Un ejemplo es en la demostración del personaje cinemático, cuando el personaje se mueve en una dirección determinada y luego golpeamos un objeto. ¿Cómo saber si lo que golpeamos es el suelo?

Comparando la normal del punto de colisión con un ángulo previamente calculado.

La belleza de esto es que el mismo código funciona exactamente igual y sin modificación en 3D. Las matemáticas vectoriales son, en gran medida, independientes de la cantidad de dimensión, por lo que agregar o eliminar un eje solo agrega muy poca complejidad.


Para cualquier vector V = (x, y, z) , |V| = sqrt(x*x + y*y + z*z) |V| = sqrt(x*x + y*y + z*z) da la longitud del vector.

Cuando normalizamos un vector, calculamos V/|V| = (x/|V|, y/|V|, z/|V|) V/|V| = (x/|V|, y/|V|, z/|V|) .

Es fácil ver que un vector normalizado tiene la longitud 1. Esto se debe a que:

| V/|V| | = sqrt((x/|V|)*(x/|V|) + (y/|V|)*(y/|V|) + (z/|V|)*(z/|V|)) = sqrt(x*x + y*y + z*z) / |V| = |V| / |V| = 1

Por lo tanto, podemos llamar vectores normalizados como vectores unitarios (es decir, vectores con longitud unitaria).

Cualquier vector, cuando está normalizado, solo cambia su magnitud, no su dirección. Además, cada vector que apunta en la misma dirección, se normaliza al mismo vector (ya que la magnitud y la dirección definen de forma única un vector). Por lo tanto, los vectores unitarios son extremadamente útiles para proporcionar direcciones.

Sin embargo, tenga en cuenta que toda la discusión anterior fue para coordenadas cartesianas tridimensionales (x, y, z) . ¿Pero a qué nos referimos realmente con coordenadas cartesianas?

Resulta que, para definir un vector en el espacio 3D, necesitamos algunas direcciones de referencia. Estas direcciones de referencia se llaman canónicamente i , j , k (o i, j, k con mayúsculas en las mismas, denominadas "i cap", "j cap" y "k cap"). Cualquier vector que consideremos como V = (x, y, z) puede escribirse como V = xi + yj + zk . (Nota: ya no los llamaré por mayúsculas, solo los llamaré i, j, k). i, j y k son vectores unitarios en las direcciones X, Y y Z y forman un conjunto de vectores unitarios ortogonales entre sí. Son la base de toda la geometría cartesiana de coordenadas.

Hay otras formas de coordenadas (como las coordenadas cilíndricas y esféricas), y si bien sus coordenadas no son tan directas de entender como (x, y, z) , también están compuestas por un conjunto de 3 vectores de unidades mutuamente ortogonales que forman el Base en la que se multiplican 3 coordenadas para producir un vector.

Entonces, la discusión anterior dice claramente que necesitamos vectores unitarios para definir otros vectores, pero ¿por qué debería importarte?

Porque a veces, solo la magnitud importa. Ahí es cuando usas un número "regular" (algo como 4 o 1/3 o 3.141592653 - no, para todos los fanáticos del TOC, NO voy a poner a Pi allí - eso seguirá siendo un decimal final, solo porque soy el mal encarnado ). No querrías tirar en una dirección molesta, ¿verdad? Quiero decir, ¿realmente tiene sentido decir que quiero 4 kilogramos de sandías frente a West? A menos que seas un fanático loco, por supuesto.

Otras veces, solo la dirección importa. Simplemente no te importa la magnitud, o la magnitud es demasiado grande como para comprenderla (algo como el infinito, solo que nadie sabe realmente qué es el infinito en realidad) - Todo salve El Gran Infinito, porque Él tiene Infinidades Infinitas ... Lo siento , me dejé llevar un poco allí). En tales casos, utilizamos la normalización de vectores. Por ejemplo, no significa nada que digamos que tenemos una línea que mira a 4 km al norte. Tiene más sentido decir que tenemos una línea que mira al Norte. Entonces que haces? Te deshaces de los 4 km. Destruyes la magnitud. Todo lo que te queda es el norte (y el invierno se acerca). Haga esto con la frecuencia suficiente, y tendrá que dar un nombre y una notación a lo que está haciendo. No puedes simplemente llamarlo "ignorar la magnitud". Eso es demasiado burdo. Eres un matemático, y por eso lo llamas "normalización", y le das la notación de la "gorra" (probablemente porque querías ir a una fiesta en lugar de quedarte atascado con vectores).

Por cierto, como mencioné las coordenadas cartesianas, aquí está el XKCD obligatorio:


Se supone que las normales se usan solo como un vector de dirección. Se utilizan para el cálculo de la iluminación, que requiere vectores normales normalizados.


en el aprendizaje automático y en el aprendizaje profundo necesitamos normalizar el vector, porque el descenso de gradiente converge rápidamente