PointオブジェクトとVectorオブジェクトが必要ですか?または、単にVectorオブジェクトを使用してPointを表すことは問題ありませんか?


18

私が友人と一緒に開発しているエンジンのコンポーネントを構築すること(学習目的)で、私はこの疑問に思いつきました。

最初は、次のようなPointコンストラクターがありました。

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

しかし、それらにいくつかのVector数学を追加し始め、Vector2dに名前を変更することにしました。

しかし、現在、行を作成するために使用される次のようないくつかの方法は(少なくとも私の意見では)少し混乱しています。

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

Pointオブジェクトの特定のコンストラクターを作成する必要がありますか、またはポイントをベクトルとして定義するのに問題はありませんか?

ベクトルには大きさと方向がありますが、オブジェクトの位置を表すためだけにベクトルを使用している人が非常に多いと思います。


1
位置は(0,0 {、0})からのベクトルであるため、ベクトルを使用しても問題ありません。

回答:


8

定義を統合し、ポイントをベクトルとして扱うことで問題が発生することはまずありません。独自のクラスを定義すると、それらを前後に移植できるようになります。

私は何だろうやる、しかし、あなたのコード内で同等にそれらを扱うです。ベクトルとポイントを同じ意味で使用する場合、Line()関数の宣言が「startingVector」と「endingVector」について話す必要がある理由はありません。に戻ることを強くお勧めします

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

ポイントは、それらがそうするためにクラスVectorを使用している場合でも、それらのパラメーターが表すものです。


さらに一歩進んで、typedef Vector Pointポイントを定義するヘッダーのどこかに入れます。そうすれば、見た目も感じも、それがPoint使われたときに頭をかきむしられることはありませんがVector、内部側では1つのコードベースにすぎません。
tpg2114

4

Vectorオブジェクトを使用するだけです。これが過去に誤って使用されたと感じたとしても、それは人々が期待するものです。さらに、ベクトルをポイントとして使用することは必ずしも正しくありません。そして、両方のデータ構造が同じプリミティブ型を必要とするため、議論の外で行うことは困難です。唯一の違いはメンバー関数です。2つのメソッド間で競合する方法はあまりないため、それらを同じクラスに入れるのは簡単です。

あなたが学んでいるので、人々が期待することをすることがしばしば物事を行うための最良の方法であることを学ぶのは良いことです(提示されているような些細な選択のために)。


メンバー関数は、ポイントとベクトルの唯一の違いではありません。そうでw重要であるコンポーネント、。
ケビントディスコ

3

ポイントは空間内の場所です。座標系ができたら、それらの点を原点(ベクトル)からの距離と方向として記述できます。したがって、ベクトルを使用して線の始点と終点を記述することは完全に合理的です。

すべてのポイントはベクトルとして表現できますが、ベクトルはポイントではないことに注意してください。ほとんどのベクトル、たとえば速度、法線などには、位置の感覚がありません。

風について考えると、風の方向と強さについて話すことができますが、風の位置や場所について話すことはできません。これは、空間内の点を記述するために使用されていない場合のベクトルの考え方です。


2

ポイントを定義するには、1つのベクトルのみが必要です。行を定義するには、2つ必要です。通常、ライン上にある2つのポイント、またはライン上にあるポイントを表す1つのベクトルと、ラインの方向を表すもう1つのベクトルのいずれかがあります。

点はベクトルとして定義するのに問題はありません。なぜなら、点はその座標に等しい方向と0,0からの距離に等しい大きさを持つベクトルだからです。

したがって、Pointと「Vector2d」を表すために2つの別個のクラスは必要ありませんが、Pointはおそらく、描画または処理に直接関連するさまざまなメンバー関数を持つVector2dのサブクラスであり、Vector2dはドット積。


2

はい、Vectorベクトルwコンポーネントがであることを保証する限り0、単一のクラスを使用してポイントとベクトルの両方を定義することは問題ありません

ポイントとベクトルの主な違いは、ポイントが空間からの物理的な位置を表し、原点からオフセットしているのに対して、ベクトルは方向を表していることです。点は変換できますが、ベクトル変換できませんw二次元または三次元のコンポーネントVectorクラスは、変換行列の並進成分を有効にすることを可能にするものです。場合w1は、平行移動と回転が適用されます。の場合0、回転のみが適用されます。

wベクトルセットのコンポーネントを持たないことは、0あなたに噛みついて戻ってくる可能性があります。追跡するのがかなり難しいバグにつながります。安全のために、あなたが作ることができるPointから継承するクラスをVectorクラスと明示的に設定wする1場合は、Vectorクラスのデフォルトw0


2
多くのベクトルクラスは、wコンポーネントを明示的に使用しません。かなりの数がそれを暗黙的な要素として扱うか、それを実装する「ProjectiveVector」クラスに相当するものを持っていますが、エンジンのコードの大部分(本質的にレンダリング以外のすべて)は、awコンポーネントを運ぶ「古典的な」3ベクトルを使用します完全に不要です。これは実装の詳細であり、ベクトルまたはポイントの重要な部分ではありません。
スティーブンスタドニッキー

@StevenStadnickiそれは本当ですが、クラスがポイントとベクトルの両方を表すためには、wコンポーネントが存在する必要があります。そうでなければ、オブジェクトの使用方法を決定する方法はありません。
ケビントディスコ

1
@ktodisco使用方法を決定する方法は、使用されているコンテキストを調べることだと思います。
JCM

1
。。:(コメント編集にクラスを使用するエンジンの部分は、それが使用されるコンテキストを定義した場合、それが動作することを言おうとした時間を使い果たした
kevintodisco

2

点とベクトルは同じものと考えることができます。理にかなっている場合は、この方法で位置を表すベクトルについて考えることができます。Vector2そうでなければ、Pointクラスを使用するはずのすべての場所でクラスを使用するのが論理的です。

数学では、位置を表すためにベクトルが使用されることがあります。この意味で使用される場合、ベクトルは、あるエンティティが原点を基準にして配置される場所を表します。たとえば、sh'mupを作成していて、プレイヤーの船がプレイエリアのどこにあるかを追跡したいとします。プレイエリアの左下隅を(0、0)として扱う場合、プレーヤーの位置を次のように表すことができますVector

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

この場合のベクトルの意味は、船が右に3ユニット、原点から3ユニット上にあることです。(プレーヤーの速度にベクトルを使用することもできます。この場合、プレーヤーは毎秒またはフレームごとに右に3ユニット、上に3ユニット移動します。位置と速度は同じベクトルクラスで表されますが、ベクトルはプレイヤーのスクリプトで異なる方法で処理されます。)

線の例を使用するために、位置ベクトルは、開始「点」と終了「点」が原点を基準に配置される場所を表します。原点がプレイエリアの中心である場合、次のような線を決定できます。

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

そのため、ラインの一方の端は、競技場の右に8単位、中央に2単位上にあり、もう一方の端は、右に8単位、下に2単位です。

明確にするために、これはVectorクラスの代わりにクラスを使用する必要があると言っているわけではありませんPoint。これは、これらのアイデアをどのように実装するかを簡単に決定できるようにする、この状況について考えるための1つの方法です。


空間内の別のポイントへのオフセットとしてのベクトルは、依然として相対座標内のポイントと見なす必要があります。ゲームエンジンに関する限り、ベクトルと呼ぶのは間違っています。
ケビントディスコ

0

それは実装に依存します。プロトタイプの代わりにVector2dのメソッドを使用する必要がある場合、ゲームで必要なポイントの量を考えると、そのためのコストがかかります。JavaScriptの仕組みです。そのような状況では、すべての不要な関数を持たないPoint2dクラスを作成する方が適切です。


メソッドはプロトタイプに追加されているため、これは問題ではありません。
JCM
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.