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.
Réponses:
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 à
Les points sont ce que ces paramètres représentent, même s'ils utilisent la classe Vector pour le faire.
la source
typedef Vector Point
quelque part dans un en-tête qui définit les points. De cette façon, cela ressemble et se sent comme unPoint
, personne ne se gratte la tête en l'utilisant pourquoi il est appeléVector
mais du côté interne, ce n'est qu'une base de code.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é).
la source
w
composant, qui est essentiel.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.
la source
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.
la source
Oui, il est correct d'utiliser une seule
Vector
classe pour définir à la fois les points et les vecteurs, tant que vous vous assurez que lew
composant 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
w
composant d'uneVector
classe à 2 ou 3 dimensions est ce qui permet au composant de traduction d'une matrice de transformation de prendre effet. Siw
c'est le cas1
, la translation et la rotation seront appliquées; si c'est le cas0
, seule la rotation sera appliquée.Ne pas avoir la
w
composante d'un ensemble de vecteurs0
peut revenir vous mordre; cela conduit à des bugs assez difficiles à localiser. Pour être sûr, vous pouvez faire unePoint
classe qui hérite de laVector
classe et définit explicitementw
à1
, où lesVector
valeurs par défaut de la classew
à0
.la source
w
composant doit être présent, sinon il n'y a aucun moyen de déterminer comment l'objet doit être utilisé.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
Vector2
classe partout où vous auriez autrement utilisé unePoint
classe.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
: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:
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
Vector
classe au lieu d'unePoint
classe. Ce n'est qu'une façon de penser cette situation qui peut faciliter la décision de mettre en œuvre ces idées.la source
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.
la source