Al estructurar los componentes de un motor que estoy desarrollando junto con un amigo (con fines de aprendizaje), llegué a esta duda.
Inicialmente teníamos un constructor Point, como el siguiente:
var Point = function( x, y ) {
this.x = x;
this.y = y;
};
Pero a ellos les empezamos a agregar algunas matemáticas de Vector, y decidieron cambiarle el nombre a Vector2d.
Pero ahora, algunos métodos son un poco confusos (al menos en mi opinión), como el siguiente, que se utiliza para hacer una línea:
//before the renaming of Point to Vector2, the parameters were startingPoint and endingPoint
Geometry.Line = function( startingVector, endingVector ) {
//...
};
¿Debo hacer un constructor específico para el objeto Point, o no hay problemas para definir un punto como un vector?
Sé que un vector tiene magnitud y dirección, pero veo que muchas personas usan un vector para representar la posición de un objeto.
Respuestas:
Es poco probable que haya algún problema al combinar las definiciones y tratar los puntos como vectores, pero tenga un poco de cuidado, porque algunas API tienen una clase de 'Punto' que podría necesitar usar (para representar, por ejemplo, vértices de polígonos) y si Si define su propia clase, querrá poder transferirlos de un lado a otro.
Sin embargo, lo que haría es tratarlos de manera equivalente en su código; si usa vector y punto de manera intercambiable, entonces no hay razón para que su declaración para la función Line () deba estar hablando de 'beginVector' y 'endingVector'. Recomiendo encarecidamente volver a
Los puntos son lo que representan esos parámetros, incluso si están usando la clase Vector para hacerlo.
fuente
typedef Vector Point
lugar en un encabezado que define los puntos. De esa manera se ve y se siente como unPoint
, nadie se deja rascar la cabeza cuando lo usa por qué se llama,Vector
pero en el lado interno es solo una base de código.Solo usa el objeto Vector. Incluso si siente que esto se ha usado incorrectamente en el pasado, es lo que la gente espera. Además, no es necesariamente incorrecto usar un vector como punto. Y sería difícil hacerlo fuera de discusión ya que ambas estructuras de datos requieren los mismos tipos primitivos. Las únicas diferencias serán las funciones miembro, y es bastante fácil ponerlas en la misma clase, ya que no hay mucho en el camino de los métodos en conflicto entre los dos.
Como está aprendiendo, es bueno saber que hacer lo que la gente espera es a menudo la mejor manera de hacer las cosas (para opciones triviales como la que se presenta).
fuente
w
componente, que es crítico.Los puntos son ubicaciones en el espacio. Una vez que tenga un sistema de coordenadas, puede describir esos puntos como una distancia y una dirección desde el origen (un vector). Por lo tanto, es perfectamente razonable usar vectores para describir los puntos inicial y final de una línea.
Solo tenga en cuenta que todos los puntos se pueden representar como un vector, pero los vectores no son puntos. La mayoría de los vectores, por ejemplo, velocidad, normal, etc., no tienen ningún sentido de ubicación.
Piense en el viento, puede hablar sobre su dirección y su fuerza, pero no puede hablar sobre su posición o ubicación. Así es como debe pensar en los vectores cuando NO se utilizan para describir puntos en el espacio.
fuente
Para definir un punto, solo necesita un vector. Para definir una línea, necesitas dos. Por lo general, tiene dos puntos que se encuentran en la línea o un vector que representa un punto que se encuentra en la línea y el otro vector que representa la dirección de la línea.
No hay problemas para definir un punto como un vector, porque un punto ES un vector con una dirección igual a sus coordenadas y una magnitud igual a su distancia de 0,0.
Por lo tanto, no necesita dos clases separadas para representar un Punto y "Vector2d", aunque un Punto podría presumiblemente ser una subclase de Vector2d con diferentes funciones miembro directamente relacionadas con su dibujo o procesamiento, mientras que Vector2d solo podría realizar funciones matemáticas de vectores estrictas como Productos de punto.
fuente
Sí, está bien usar una sola
Vector
clase para definir puntos y vectores, siempre y cuando se asegure de que elw
componente del vector sea0
.La diferencia clave entre un punto y un vector es que un punto representa una ubicación física en el espacio, desplazada del origen, mientras que un vector representa una dirección . Un punto puede traducirse, un vector no puede . El
w
componente de unaVector
clase de 2 o 3 dimensiones es lo que permite que el componente de traducción de una matriz de transformación surta efecto. Siw
es así1
, se aplicarán la traslación y la rotación; si es así0
, solo se aplicará la rotación.No tener el
w
componente de un conjunto de vectores0
puede volver a morderte; conduce a errores que son bastante difíciles de rastrear. Para estar seguro, usted puede hacer unaPoint
clase que hereda de laVector
clase y explícitamente establecew
que1
, en losVector
valores por defecto de la clasew
a0
.fuente
w
componente debe estar presente, de lo contrario no hay forma de determinar cómo se debe usar el objeto.Los puntos y los vectores pueden considerarse como la misma cosa. Si tiene sentido para usted, puede pensar en vectores que representen la posición de esta manera, y luego es lógico usar una
Vector2
clase en cualquier lugar donde de otra manera hubiera usado unaPoint
clase.En matemáticas, los vectores a veces se usan para representar la posición. Cuando se usa en este sentido, el vector representa dónde se encuentra alguna entidad en relación con un punto de origen. Por ejemplo, suponga que está haciendo un sh'mup y desea realizar un seguimiento de dónde está el barco del jugador en el área de juego. Si trata la esquina inferior izquierda del área de juego como (0, 0), entonces podría representar la ubicación del jugador con
Vector
:Lo que el vector significa en este caso es que el barco está 3 unidades a la derecha y 3 unidades por encima del origen. (Tenga en cuenta que también puede usar un vector para la velocidad del jugador, en cuyo caso el jugador se movería 3 unidades hacia la derecha y 3 unidades hacia arriba cada segundo o cuadro. Tanto la posición como la velocidad estarían representadas por la misma clase de vectores, pero sus vectores lo harían procesarse de manera diferente en el guión del jugador).
Para usar su ejemplo de línea, el vector de posición representa dónde se encuentran el "punto" inicial y el "punto" final en relación con el origen. Si su origen es el centro del área de juego, puede determinar una línea como esta:
Entonces, un extremo de la línea está a 8 unidades a la derecha y 2 unidades por encima del centro del campo de juego, y el otro está a 8 unidades a la derecha y 2 unidades hacia abajo.
Para que quede claro, esto no quiere decir que tenga que usar una
Vector
clase en lugar de unaPoint
clase. Esta es solo una forma de pensar sobre esta situación que puede facilitar la decisión de cómo implementar esas ideas.fuente
Depende de la implementación. Si tiene que tener métodos en el Vector2d en lugar de su prototipo, entonces hay un costo para eso, dada la cantidad de puntos que necesitaría en un juego, uno importante. Así es como funciona JavaScript. En esa situación, es mejor crear una clase Point2d que no tenga todas las funciones innecesarias.
fuente