ベクトルの正規化について

以前twitterツイートしたベクトルのノーマライズに関しメモ。

以前のツイート:
「ベクトル系のクラスには、ノーマライズメソッドが必ずといってもいいくらい実装されているけど、なんの為にあるのだろう」

「実例で学ぶゲーム3D数学」本にちょっと載ってた。

多くのベクトル量について、私たちは向きと大きさに関心がある。
例えば、「私はどちらを向いている?」という場合は、単位ベクトルを使うのが便利です。
単位ベクトルは大きさが1のベクトルです。単位ベクトルは、正規化ベクトルや単に法線とも呼びます。


ゼロでないベクトルは正規化できる。
その計算方法は、そのベクトルの大きさで割る。

Vnorm = V / ||V|| (※Vの大きさはゼロではない)


例えば、2Dのベクトル[ 12 -5 ]を正規化すると、
[12 -5] / || [12 -5] || = [12 -5] / √12の二乗+(-5)の二乗




C++「ポインタの参照渡し」と「ポインタ渡し」

oFがらみでC++勉強しています。

意味は分かってるんだけど、関数の引数として、
参照渡しとポインタ渡しがC++には存在している。

ちなみにCの時は関数の引数に対して参照渡しはなかった(はず)。

結果から行くと、

  • ポインタ渡しの場合は、呼び出し側が引数として、アドレスを渡す必要がある。
  • 参照渡しの場合は、呼び出し側が引数として、ままオブジェクトを渡す。
コードは、
//ポインタ渡し
FuncA(int *p)
{
*p = 2;
}

//参照渡し
FuncB(int &p)
{
// 参照=エイリアスなので、中身(値)は変更出来るが、
// アドレスは変更できない
p = 10;
}

void main()
{
int a = 1;
int* pa = &a;

// アドレスを渡す
FuncA(pa);

// まま変数を渡す
FuncB(a);
}


これは、全く問題なし!
あえて言うなら、参照は単なるエイリアスなので、
渡した引数のアドレスは変更できない。事に注意。

そして問題は次。ロベールのC++を読んでいて、こんなのが出てきた。
funcB( int*& pa )
{
// pa は、ポインタの参照です。
}



ポインタの参照??

C出身の私は、一瞬「ポインタのポインタ?」と思ったんですが、
結論としては、見たまんま。

ポインタの参照=ポインタのエイリアスです。
この関数を呼ぶ場合はfuncBの引数には、ポインタを与えます。

int *pa;
funcB(pa);



で、結局なに?
という事なんです。。。が。
  1. 引数にポインタ    =ポインタを渡す
  2. 引数にポインタの参照 =ポインタを渡す
と、両パターンとも、ポインタを渡していることに代わりはない。
が、2のパターンでは、ポインタの参照(エイリアス)を渡しているので、

関数内で、渡したポインタの値(=アドレス)を変更する事が出来る!
1.でも関数内では、ポインタ(=アドレス)の変更は可能だが、
関数処理が終了したら、呼び出す前のポインタ(アドレス)をさしたまま。

こんな理解であっているのか…不安

Programming Interactivity #3 〜Vector (3)〜

次に複数のオブジェクトについて考えてみる。
ベクトルを利用するにあたって、追加の概念として、
衝突を考えてみたい。

衝突した後の方向もやはり、それぞれの質量を元に計算される。

ボールクラスにcollisionメソッドを追加しながら考察してみよう。
ボールがぶつかる時、何が起こるか?

一般的には、

  1. 両方のベクトルの差分から、新しいベクトルを決定する。
  2. 新ベクトルの角度を決める。
    ※どのくらい直接的にぶつかったのか?
    ※かすめる程度なのか?真っ向からぶつかったのか?
  3. 速度の差を決める。1.で決まった新ベクトルと角度を基に。
  4. 新ベクトルをオブジェクトに設定する。

続く…