2

簡単な使い方で簡単なVectorクラスを作成しているので、自分でできることのためにライブラリ全体(JScienceなど)をインポートしたくありません。

現在、私はこれまでにこのコードを作成しました。

public void add(Vector2D v){
    double ang = this.angle*Math.PI/180;
    double mag = this.magnitude;
    double ang0 = v.angle*Math.PI/180;
    double mag0 = v.magnitude;
    //vector to coordinates
    double x1 = mag*Math.cos(ang);
    double y1 =-mag*Math.sin(ang);
    //adding the other vector's coordinates
    double x2 =x1+mag*Math.cos(ang0);
    double y2 =y1-mag*Math.sin(ang0);
    //back to vector form
    double newMagnitude = Math.sqrt(x2*x2+y2*y2);
    double newAngle = Math.atan2(y2,x2);
    this.magnitude = newMagnitude;
    this.angle = newAngle;

}

両方のベクトルを座標に変換してから三角関数に戻しますが、これらは非常に低速であり、この方法は非常に頻繁に使用されます。

より良い方法はありますか?

4

1 に答える 1

2

まず、いくつかの用語101:

ポイント:スペースを構成する無次元のエンティティ。

スペース:ポイントのセット。

ユークリッド空間:一連の点、一連の線、および近さの概念(トポロジー)。線のセットは、ユークリッドの公理によって拘束されます。それはその次元によって一意に定義されます。

ベクトル:ユークリッド空間内の2点間の並進不変関係。

座標系:実数のタプルからある空間の点またはベクトルへのマッピング。

デカルト座標系:特定のマッピング。(ユークリッド2D空間の場合)点のセットが両方ともゼロでax+by+c=0ない限り線a,bであり、ベクトル[0,1][1,0]が垂直で単位長であり、空間内の点が近いという特性を備えています。それらがすべての座標で互いに接近している場合は、一緒に。これはあなたが「座標」と呼ぶものです。

極座標系:デカルト座標から定義できる別の特定のマッピング:[arg,mag]極座標では、デカルト座標にマップさ[cos(arg)*mag, sin(arg)*mag]れます。これは、「ベクトル形式」と呼ばれるものです。


デカルト座標系には、極座標系に比べて複数の利点があります。それらの1つは、より簡単な加算:[x1,y1]+[x2,y2]=[x1+x2,y1+y2]およびスカラー乗法:[x1,y1].[x2,y2]=x1*x2+y1*y2です。加法反転も少し簡単です。-[x,y]=[-x,-y]

もう1つの利点は、極座標が厳密に2Dであるのに対し(一意の拡張はありません。ただし、球面座標系が候補です)、デカルト座標は任意の数の次元に自然に拡張されることです。

このため、ベクトルを常にデカルト座標形式で格納することは有益であり、通常は有益です。

極形式のベクトルが必要な場合は、(そしてそのときだけ)変換します。

極座標はそれほど有用ではありません。これらは入力と出力に使用できますが、計算に役立つことはめったにありません。


ベクトルを極形式で保存し続けます。それらを計算のためにデカルト形式に変換してから、極座標に変換し直します。これは、デカルト形式に再度変換するためだけです。

ベクトルはデカルト形式で保存する必要があります。冗長変換を削除すると、パフォーマンスの向上がはっきりとわかるはずです。

ベクトルを回転させたい場合でも、極座標に変換して元に戻すことは有益ではありません。符号付きの角度による回転は、aと同じくらい簡単[x*cos(a)+y*sin(a), y*cos(a)-x*sin(a)]です。これは、ベクトルの配列全体を回転させるための2つの三角関数(最大で-これらの値をキャッシュできます)です。

于 2013-01-01T03:25:00.560 に答える