Ai-je besoin d'un point et d'un objet vectoriel? Ou tout simplement utiliser un objet Vector pour représenter un point est ok?

18

Structurant les composants d'un moteur que je développe avec un ami (à des fins d'apprentissage), je suis venu à ce doute.

Au départ, nous avions un constructeur Point, comme le suivant:

var Point = function( x, y ) {
    this.x = x;
    this.y = y;
};

Mais eux, nous avons commencé à y ajouter des mathématiques vectorielles, et ils ont décidé de le renommer en Vector2d.

Mais maintenant, certaines méthodes sont un peu déroutantes (du moins à mon avis), comme la suivante, qui est utilisée pour faire une ligne:

//before the renaming of Point to Vector2, the parameters were startingPoint and endingPoint
Geometry.Line = function( startingVector, endingVector ) {
    //...
};

Je devrais créer un constructeur spécifique pour l'objet Point, ou il n'y a aucun problème à définir un point comme vecteur?

Je sais qu'un vecteur a une amplitude et une direction, mais je vois tellement de gens utiliser un vecteur pour représenter simplement la position d'un objet.

JCM
la source
1
Comme la position n'est qu'un vecteur de (0,0 {, 0}), un vecteur est très bien à utiliser.

Réponses:

8

Il est peu probable qu'il y ait des problèmes avec la fusion des définitions et le traitement des points comme des vecteurs - mais soyez un peu prudent, car certaines API ont une classe «Point» que vous devrez peut-être utiliser (pour représenter, par exemple, les sommets des polygones) et si vous définissez votre propre classe, vous voudrez pouvoir les porter dans les deux sens.

Ce que je ferais , cependant, c'est de les traiter de manière équivalente dans votre code; si vous utilisez vector et point de manière interchangeable, il n'y a aucune raison que votre déclaration pour la fonction Line () parle de 'startingVector' et 'endVector'. J’encourage fortement à revenir à

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

Les points sont ce que ces paramètres représentent, même s'ils utilisent la classe Vector pour le faire.

Steven Stadnicki
la source
Je voudrais aller plus loin et avoir typedef Vector Pointquelque part dans un en-tête qui définit les points. De cette façon, cela ressemble et se sent comme un Point, personne ne se gratte la tête en l'utilisant pourquoi il est appelé Vectormais du côté interne, ce n'est qu'une base de code.
tpg2114
4

Utilisez simplement l'objet Vector. Même si vous pensez que cela est / a été mal utilisé dans le passé, c'est ce que les gens attendent. De plus, il n'est pas nécessairement incorrect d'utiliser un vecteur comme point. Et serait difficile à faire en dehors de la discussion, car les deux structures de données nécessitent les mêmes types primitifs. Les seules différences seront les fonctions membres, et il est assez facile de les mettre dans la même classe, car il n'y a pas beaucoup de méthodes conflictuelles entre les deux.

Puisque vous apprenez, il est bon d'apprendre que faire ce que les gens attendent est souvent la meilleure façon de faire les choses (pour des choix triviaux comme celui présenté).

MichaelHouse
la source
Les fonctions membres ne sont pas la seule différence entre les points et les vecteurs; tout comme le wcomposant, qui est essentiel.
kevintodisco
3

Les points sont des emplacements dans l'espace. Une fois que vous avez un système de coordonnées, vous pouvez décrire ces points comme une distance et une direction par rapport à l'origine (un vecteur). Il est donc parfaitement raisonnable d'utiliser des vecteurs pour décrire les points de début et de fin d'une ligne.

Sachez simplement que tous les points peuvent être représentés comme un vecteur, mais que les vecteurs ne sont pas des points. La plupart des vecteurs, par exemple la vitesse, la normale, etc., n'ont aucun sens de l'emplacement.

Pensez au vent, vous pouvez parler de sa direction et de sa force, mais vous ne pouvez pas parler de sa position ou de son emplacement. C'est ainsi que vous devriez penser aux vecteurs lorsqu'ils ne sont PAS utilisés pour décrire des points dans l'espace.

Ken
la source
2

Pour définir un point, vous n'avez besoin que d'un seul vecteur. Pour définir une ligne, vous en avez besoin de deux. En règle générale, vous avez soit deux points situés sur la ligne, soit un vecteur représentant un point situé sur la ligne et l'autre vecteur représentant la direction de la ligne.

Il n'y a aucun problème à définir un point comme vecteur, car un point EST un vecteur avec une direction égale à ses coordonnées et une amplitude égale à sa distance de 0,0.

Ainsi, vous n'avez pas besoin de deux classes distinctes pour représenter un point et "Vector2d", bien qu'un point puisse vraisemblablement être une sous-classe de Vector2d avec différentes fonctions membres directement liées à votre dessin ou traitement, tandis que Vector2d peut uniquement effectuer des fonctions mathématiques vectorielles strictes comme produits scalaires.

Eric B
la source
2

Oui, il est correct d'utiliser une seule Vectorclasse pour définir à la fois les points et les vecteurs, tant que vous vous assurez que le wcomposant du vecteur l'est0 .

La principale différence entre un point et un vecteur est qu'un point représente un emplacement physique dans l'espace, décalé par rapport à l'origine, tandis qu'un vecteur représente une direction . Un point peut être traduit, un vecteur ne peut pas . Le wcomposant d'une Vectorclasse à 2 ou 3 dimensions est ce qui permet au composant de traduction d'une matrice de transformation de prendre effet. Si wc'est le cas 1, la translation et la rotation seront appliquées; si c'est le cas 0, seule la rotation sera appliquée.

Ne pas avoir la wcomposante d'un ensemble de vecteurs 0peut revenir vous mordre; cela conduit à des bugs assez difficiles à localiser. Pour être sûr, vous pouvez faire une Pointclasse qui hérite de la Vectorclasse et définit explicitement wà 1, où les Vectorvaleurs par défaut de la classe wà 0.

kevintodisco
la source
2
De nombreuses classes vectorielles n'utilisent pas explicitement le composant w; un bon nombre le traitent comme un élément implicite ou ont ce qui équivaut à une classe `` ProjectiveVector '' qui l'implémente, mais une grande partie du code d'un moteur (tout en dehors du rendu, essentiellement) utilise le vecteur 3 `` classique '' qui transporte un composant aw est entièrement superflu. C'est un détail d'implémentation, pas une partie essentielle des vecteurs ou des points.
Steven Stadnicki
@StevenStadnicki C'est vrai, mais pour qu'une classe représente à la fois un point et un vecteur, le wcomposant doit être présent, sinon il n'y a aucun moyen de déterminer comment l'objet doit être utilisé.
kevintodisco
1
@ktodisco Je pense que la façon de déterminer comment il doit être utilisé, c'est de voir dans quel contexte il est utilisé.
JCM
1
Il a manqué de temps pour modifier le commentaire :(. J'allais dire que si les parties du moteur qui utilisent la classe définissent le contexte dans lequel il sera utilisé, alors cela fonctionne.
kevintodisco
2

Les points et les vecteurs peuvent être considérés comme la même chose. Si cela a du sens pour vous, vous pouvez penser à des vecteurs qui représentent la position de cette façon, puis il est logique d'utiliser une Vector2classe partout où vous auriez autrement utilisé une Pointclasse.

En mathématiques, les vecteurs sont parfois utilisés pour représenter la position. Lorsqu'il est utilisé dans ce sens, le vecteur représente l'emplacement d'une entité par rapport à un point d'origine. Par exemple, supposons que vous faites un sh'mup et que vous souhaitez garder une trace de l'emplacement du navire du joueur dans la zone de jeu. Si vous traitez le coin inférieur gauche de la zone de jeu comme (0, 0), vous pouvez représenter l'emplacement du joueur avec Vector:

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

Dans ce cas, le vecteur signifie que le navire se trouve à 3 unités à droite et à 3 unités au-dessus de l'origine. (Notez que vous pouvez également utiliser un vecteur pour la vitesse du joueur, auquel cas le joueur se déplacerait de 3 unités vers la droite et de 3 unités vers le haut chaque seconde ou image. La position et la vitesse seraient représentées par la même classe de vecteurs, mais leurs vecteurs être traité différemment dans le script du joueur.)

Pour utiliser votre exemple de ligne, le vecteur de position représente l'emplacement du "point" de départ et du "point" de fin par rapport à l'origine. Si votre origine est le centre de la zone de jeu, vous pouvez déterminer une ligne comme celle-ci:

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

Donc, une extrémité de la ligne est à 8 unités à droite de et 2 unités au-dessus du centre du terrain de jeu, et l'autre est à 8 unités à droite et 2 unités en bas.

Juste pour être clair, cela ne veut pas dire que vous devez utiliser une Vectorclasse au lieu d'une Pointclasse. Ce n'est qu'une façon de penser cette situation qui peut faciliter la décision de mettre en œuvre ces idées.

Kevin - Rétablir Monica
la source
Le vecteur comme décalage par rapport à un autre point de l'espace doit toujours être considéré comme un point en coordonnées relatives. L'appeler un vecteur est faux, en ce qui concerne un moteur de jeu.
kevintodisco
0

Cela dépend de la mise en œuvre. Si vous devez avoir des méthodes sur le Vector2d au lieu de son prototype, cela a un coût, étant donné le nombre de points dont vous auriez besoin dans un jeu, un coût majeur. C'est juste comment JavaScript fonctionne. Dans cette situation, il est préférable de créer une classe Point2d qui n'a pas toutes les fonctions inutiles.

dreta
la source
Les méthodes sont ajoutées au prototype, ce n'est donc pas un problème.
JCM