¿Necesito un objeto Point y Vector? ¿O simplemente usar un objeto Vector para representar un Punto está bien?

18

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.

JCM
fuente
1
Como la posición es solo un vector de (0,0 {, 0}), un vector está bien para usar.

Respuestas:

8

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

Geometry.Line = function( Vector startingPoint, Vector endingPoint ) {
    //...
};

Los puntos son lo que representan esos parámetros, incluso si están usando la clase Vector para hacerlo.

Steven Stadnicki
fuente
Iría un paso más allá y tendría un typedef Vector Pointlugar en un encabezado que define los puntos. De esa manera se ve y se siente como un Point, nadie se deja rascar la cabeza cuando lo usa por qué se llama, Vectorpero en el lado interno es solo una base de código.
tpg2114
4

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).

MichaelHouse
fuente
Las funciones miembro no son la única diferencia entre puntos y vectores; también lo es el wcomponente, que es crítico.
kevintodisco
3

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.

Conocer
fuente
2

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.

Eric B
fuente
2

Sí, está bien usar una sola Vectorclase para definir puntos y vectores, siempre y cuando se asegure de que el wcomponente 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 wcomponente de una Vectorclase de 2 o 3 dimensiones es lo que permite que el componente de traducción de una matriz de transformación surta efecto. Si wes 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 wcomponente de un conjunto de vectores 0puede volver a morderte; conduce a errores que son bastante difíciles de rastrear. Para estar seguro, usted puede hacer una Pointclase que hereda de la Vectorclase y explícitamente establece wque 1, en los Vectorvalores por defecto de la clase wa 0.

kevintodisco
fuente
2
Muchas clases de vectores no usan el componente w explícitamente; bastantes lo tratan como un elemento implícito o tienen lo que equivale a una clase 'ProjectiveVector' que lo implementa, pero gran parte del código de un motor (todo lo que está fuera del renderizado, esencialmente) usa el vector 3 'clásico' que transporta un componente aw Es completamente superfluo. Este es un detalle de implementación, no una parte esencial de vectores o puntos.
Steven Stadnicki
@StevenStadnicki Eso es cierto, pero para que una clase represente tanto un punto como un vector, el wcomponente debe estar presente, de lo contrario no hay forma de determinar cómo se debe usar el objeto.
kevintodisco
1
@ktodisco Creo que la forma de determinar cómo se debe usar es mirar en qué contexto se está utilizando.
JCM
1
Se acabó el tiempo para editar el comentario :(. Iba a decir que si las partes del motor que usan la clase definen el contexto en el que se usará, entonces funciona.
kevintodisco
2

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 Vector2clase en cualquier lugar donde de otra manera hubiera usado una Pointclase.

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:

   * Player (3,3)
  /
 /
. (0,0)

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:

             * (8, 2)
             |
     . (0,0) |
             |
             * (8, -2)

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 Vectorclase en lugar de una Pointclase. Esta es solo una forma de pensar sobre esta situación que puede facilitar la decisión de cómo implementar esas ideas.

Kevin - Restablece a Monica
fuente
El vector como un desplazamiento hacia otro punto en el espacio aún debe considerarse como un punto en coordenadas relativas. Llamarlo vector está mal, en lo que respecta al motor de un juego.
kevintodisco
0

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.

dreta
fuente
Los métodos se están agregando al prototipo, por lo que esto no es un problema.
JCM