2016-04-22 5 views
2

私の最初のプロジェクトの1つでは、ボイドシミュレーションのコードに従っています。コードのこの部分でsin関数とcos関数が何をしているのかよくわかりません。ボイドシミュレーションで速度を定義する

N = numer of boids 

angles = 2*math.pi*np.random.rand(N) 

vel = np.array(list(zip(np.sin(angles), np.cos(angles)))) 

一般的に、コードはボイドのランダムベクトルを設定していますが、ランダムな角度は自分では十分ではないのはなぜですか?

単位速度の定義に重要なsin関数とcos関数は何ですか?

個別に計算されたボイド速度の参照条件はありますか?

答えて

1

TL; DR

angles

はランダムな方向に配列されています。 cosおよびsinこれらの方向に沿って指し示す単位ベクトルをxおよびyコンポーネントに分解します。

長い説明

このスニペットは、ランダムな方向にN単位速度ベクトルポインティングを初期化します。これを行うための最も論理的な(かつ簡単な)方法は

  1. であるデカルトに極座標から単位ベクトル(1, theta)変換、均一各角度theta 0と2π、および
  2. 間に分配Nランダムな角度を初期化します変換は

    x = cos(theta) 
    y = sin(theta) 
    

手順1.

で達成されているため、座標
angles = 2 * math.pi * np.random.rand(N) 

ステップ2. x座標として、あなたのコードでは、np.sin(angles)は厳密には正しくされていない、使用されているが、それはので、問題ありませんのでご注意

# arrays of x- and y-coordinates 
velx = np.cos(angles) 
vely = np.sin(angles) 

# create (x, y) pairs and convert to np.array 
vel = np.array(list(zip(velx, vely))) 

に分解することができますとにかく角度はランダムで均一です。


だけFYI、(x, y)ペアを作成するための別の方法は、それが中間のPython listせず、numpyのオブジェクトを独占的に扱うので、これははるかに高速です

vel = np.vstack([velx, vely]).T 

です。


編集

sinを使用してxyためcosに関する私のポイントについて詳しく説明するために、ここでの画像です。

sin vs. cos

上段は違いsincosを交換その場合、小さい角度(0 < theta <π/ 4)の速度ベクトルを示し、あなたはどのように追跡するために注意する必要がありますあなたは角度を測定したいと思う。

一番下の行は、均一なランダムな角度の速度ベクトルを示しています。座標を入れ替えると結果はかなり似ています。

+0

厳密には、x座標として使用されるnp.sin(アングル)が正​​しくないと述べました。何が正しいでしょうか? –

+0

'np.cos(angles)'は「適切な」x座標です。これはあなたの角度が水平から反時計回りに測定されていると仮定しています。あなたの目的のために、あなたがランダムな方向を初期化しようとしているので、角度がどこから測定されるかは関係ありません。 –

+0

ペアになる前に独立した系列であるため、両方ともcosで計算できますか? –

0

この場合、速度は単なる(スカラー)速度ではありません。これはベクトルなので、方向と速度の両方を表します。単位/秒単位の実際の速度は、速度ベクトルの長さです。

このコードでは(例の実装hereに似ています)、可能なすべての方向に向かっていますが、各Boidの初期速度は1です。

this implementation in Processingでも同じことが起こります。

関連する問題