どうもどうも、まんてらさんです。
今回は簡単な様で難しくてでも実は割と簡単なベクトルさんについてお話させて頂きます。
このブログでは、C++で作成するゲームについての話しか
述べませんのでご注意を!
大学受験やらなんやらでベクトルの情報を収集したい人は回れ右!
後、私はまだまだプログラム初心者ですので、
『間違った情報を述べてる可能性があります』
一応他サイト等で確認を取りつつ
出来るだけ正確な情報で記事にしていますが、
もしかしたら間違ってるかもしれないので、
『間違った情報があればコメントにて指摘をお願いします!』


★2015年6月9日 3時45分
サンプルソース Ver 2.0更新!
Twitterにてご指摘頂いた点を改善しました。

 
第一章:ベクトルって何?

そもそもベクトルってなんぞやと言う話ですが…
数学的な定義では以下の様に示されています。

★ベクトルとは、
大きさと向きを兼ね備えた量を言う 

 
で?

って皆様思われると思います。。。 
それでは、私の嫁がベクトルの例を見せてくれるらしいです。
904af9ca-s
 

はい、空からカボチャが降って来ています。
これをエレちゃんの必殺技「ハロウィンバスター」(通称:ハロバス)と言います。 
このハロバスは空から斜めに降って来て、地面に着地すると爆発を起こします。
この二つのハロバスは同時に降って来て、
大きいハロバスは小さいハロバスに比べて早く落ちて来ています。

実はこのハロバスはベクトルを保持しております。
ベクトルは矢印で表す事が出来ます。
実際にハロバスのベクトルを矢印で可視化してみましょう。

 ハロバスベクトル

はい、この青い矢印がベクトルです!
二つのハロバスは右下に落下してるので『右下の矢印』が示されます。
そして、大きいハロバスは落下速度が速いので、
小さいハロバスの保持する矢印に比べて『大きいハロバスの保持しているベクトルの方が長い』です!
この、ハロバスの落下する速さと言うのは、『ハロバスの落下する強さ』とも言い表せるでしょう。

つまり、この矢印は
『ハロバスの落下する方向』 
『ハロバスの落下する強さ』

を示します。

つまり、繰り返しますが、
ベクトルと言うのは、
『力の作用する方向』
『力の大きさ』
を示す事となります。 

ここでもう一つ覚えておいて欲しいのは、
ベクトルにおいて、『力の作用する方向』を除いた、
『力の大きさ』だけを示す量を
『スカラー』
と言う事も覚えて下さい。
つまりここでは、大きいハロバスと小さいハロバスの『スカラー』を比べた際、
より大きい『スカラー』はを保持するハロバスは大きいハロバスと言う事が出来ます。

さて、ここでベクトルの用語を整理します。

①ベクトル
大きさと向きを兼ね備えた量の事
②スカラー
ベクトルの大きさのみを示した物 


これだけは必ず覚えて下さい!!!!! 


第二章:ベクトルを数値化してみよう

さてさて、ベクトルの概念を理解して頂いた所でベクトルを数値化してmちょっとそこ数字と聞いて逃げないーーー

では早速ですが、実際に数値化したベクトルを見て頂きます。

⇒ココをクリック!⇐ 

何か下らへんに方眼紙っぽいのがありますね。 
ど真ん中にある黄色くて丸い奴をドラッグして方眼紙上でぐーるぐるしてみて下さい。
何か黄色い線が付いてきますね。

 第一章でベクトルを矢印で説明しました。
これは、マウスカーソルの位置に対しての矢印を生成してくれるサイトです。

マウスをぐーるぐーるしてると気が付くと思いますが、
画面左にある 『代数学的定義』の所にある、『X成分』と『Y成分』がこのベクトルを数値化して表した物です!
 
一度方眼紙の一番左上にカーソルを合わせて見て下さい。
X成分:-2.425
Y成分: 2.425 
と表記されますね。 
つまりこれは、
X(横)方向に「-2.425」の強さの成分
Y(縦)方向に「 2.425」の強さ の成分

を保持するベクトル
となります。 
つまり、
原点からX方向に「-2.425」、Y方向に「2.425」の位置に矢印がみょーんってなるよ!
って事なのです!

原点を点Aとし、矢印の先を点Bとすると表記的にはこう示します。(文字で書けないので画像で)ABベクトル

更に先ほどまでのX成分「-2.425」、Y成分「2.425」を式で表すと…
 dwadwdawdw
と言う風に表記する事が出来ます!
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
これからこの記事ではベクトルの表記を
→AB
とします。
なので、上記の画像をこのサイト流で表記するのなら、
→AB=(-2.425,2.425)
と表記します。
文字だけだと、文字の上に矢印を書くと言う様な高等技術は使えませんので、
この様な表記で行います。正式な表記ではありません!
実際に手書きで表記する等の際は必ず矢印を文字の上に書いて下さい。
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
【補足】
良く勘違いされるのですが、ベクトルと言うのは 
飽くまでも『方向』と『力』 だけを表した物です。
あるの地点から発生する方向と力と言うのはベクトルは表記する事が出来ません。
 


さて、ここまではベクトルの 話をしてきましたが次はスカラーも数値で表してみましょう。
スカラーは、方向を示す事が出来ず、『力』だけを表した物です。
では、『力』だけを数値で表現するにはどうしたら良いのでしょうか?
→AB=(-2.425,2.425)じゃだめなのか?って?
はい、ダメなのです。
それはX成分とY成分を含めているので方向も示す事になってしまいます。
そもそもスカラーと言うのは、第一章で示したハロバスで例えると矢印の「長さ」の事を示します。
次の図を見て貰ったら解ると思います。
juhgfeewhtjhgsgrgsgs
 

この図を見てもらったらベクトルとスカラーの違いが分かって頂けるでしょうか?
では、実際にスカラーを求めてみたいと思います。
 
まず皆さんは『三平方の定理』を覚えてますでしょうか? 
覚えてる人はもう上記の図を見ただけでスカラー値の求め方は解ると思いますが、
解らない人はこのサイトを見て三平方の定理を思い出して下さい!

では、上記のサイトを見て理解した事前提でスカラー値の算出をしてみたいと思います。
(2.425とか言う数字を使ってると計算がめっさ面倒なので、
ベクトルは(2,2)を使用し、(2,2)のスカラー値を求めます。)
スカラー値^2 = Xの量^2 + Yの量^2

左辺の^2を外す

スカラー値 = √xの量^2 + Yの量^2
 
Xの量とYの量に数字を入れる

スカラー値 = √2^2 + 2^2

右辺の√の中を計算する

スカラー値 =  √4 + 4

スカラー値 = √8

右辺の√8を計算する(電卓で)

スカラー値 = 2.82842712

って事で→AB=(2,2)のスカラー値は
2.82842712となりました!

つまり、あの矢印の長さは 2.82842712 となり、ベクトルの『力のみ』を示す事となります。


 
第三章:次回予告

如何でしたでしょうか?
ベクトルとスカラーについて理解出来ましたでしょうか?
次回はこのベクトルとスカラーを使って何が出来るのか?って所を解説しようと思います。 
次回からは実際にプログラムを打って行く事になるので、
visualStudio環境等のコーディング環境を準備しておいて下さい。 

次回に使うソースコードをはっつけておきますので予習にどうぞ~
あえてソースコードにコメントは最低限しか載せていませんので、
自分でソースコードをしっかり読んで解析しておいて下さいねー

後、色々プログラムやベクトルについて詳しい人は…
サンプルプログラムと記事に関してのダメだし大歓迎!!!
ですお!!
(<や>はブログをHTMLで書いてる以上、タグと認識されてしまいます。
なので、<や>は全角表記で行っております。)

【cVector2.h】
#ifndef	_INC_G_cVector2_
#define	_INC_G_cVector2_
#include<windows>
#include<math>

namespace	OGL
{


class cVector2{
private:

public:
	double x,y;
	cVector2	operator=	(const double& vec);

	void	operator		()(const double x,const double y);
	cVector2	operator+	(const cVector2& vec);
	cVector2&	operator+=	(const cVector2& vec);
	cVector2	operator+	(const double& vec);
	cVector2&	operator+=	(const double& vec);

	cVector2	operator-	(const cVector2& vec);
	cVector2&	operator-=	(const cVector2& vec);
	cVector2	operator-	(const double& vec);
	cVector2&	operator-=	(const double& vec);

	cVector2	operator*	(const cVector2& vec);
	cVector2&	operator*=	(const cVector2& vec);
	cVector2	operator*	(const double& vec);
	cVector2&	operator*=	(const double& vec);

	cVector2	operator/	(const cVector2& vec);
	cVector2&	operator/=	(const cVector2& vec);
	cVector2	operator/	(const double& vec);
	cVector2&	operator/=	(const double& vec);

	cVector2(void);
	cVector2(const double&x_,const double&y_){
		x = x_;
		y = y_;
	}
	cVector2(const cVector2& src){
		x = src.x;
		y = src.y;
	}
	~cVector2(void);
};	//End of cVector

double	crossVector2(cVector2& vec1,cVector2& vec2);
double	dotVector2(cVector2& vec1,cVector2& vec2);
double	lengthVector2(cVector2& vec);
cVector2 unitVector(cVector2& vec);
cVector2 inverseVector(cVector2& vec);
}	// End of namespace OGL
#endif	//_INC_G_cVector2_

【cVector2.cpp】

#include"cVector2.h"

namespace	OGL
{


cVector2::cVector2(void)
{
	x=0;
	y=0;
}

cVector2::~cVector2(void)
{
}

cVector2	cVector2::operator=(const double& vec)
{
	cVector2 temp;
	temp.x =vec;
	temp.y =vec;

	return temp;
}

void	cVector2::operator		()(const double vecX,const double vecY)
{
	x=vecX;
	y=vecY;
}

cVector2	cVector2::operator+(const cVector2& vec)
{
	cVector2 temp;
	temp.x = x + vec.x;
	temp.y = y + vec.y;

	return temp;
}

cVector2&	cVector2::operator+=(const cVector2& vec)
{
	x += vec.x;
	y += vec.y;

	return *this;
}

cVector2	cVector2::operator+(const double& vec)
{
	cVector2 temp;
	temp.x = x + vec;
	temp.y = y + vec;

	return temp;
}

cVector2&	cVector2::operator+=(const double& vec)
{
	x += vec;
	y += vec;

	return *this;
}

cVector2	cVector2::operator-(const cVector2& vec)
{
	cVector2 temp;
	temp.x = x - vec.x;
	temp.y = y - vec.y;

	return temp;
}

cVector2&	cVector2::operator-=(const cVector2& vec)
{
	x -= vec.x;
	y -= vec.y;

	return *this;
}

cVector2	cVector2::operator-(const double& vec)
{
	cVector2 temp;
	temp.x = x - vec;
	temp.y = y - vec;

	return temp;
}

cVector2&	cVector2::operator-=(const double& vec)
{
	x -= vec;
	y -= vec;

	return *this;
}

cVector2	cVector2::operator*(const cVector2& vec)
{
	cVector2 temp;
	temp.x = x * vec.x;
	temp.y = y * vec.y;

	return temp;
}

cVector2&	cVector2::operator*=(const cVector2& vec)
{
	x *= vec.x;
	y *= vec.y;

	return *this;
}

cVector2	cVector2::operator*(const double& vec)
{
	cVector2 temp;
	temp.x = x * vec;
	temp.y = y * vec;

	return temp;
}

cVector2&	cVector2::operator*=(const double& vec)
{
	x *= vec;
	y *= vec;

	return *this;
}

cVector2	cVector2::operator/(const cVector2& vec)
{
	cVector2 temp;
	temp.x = x / vec.x;
	temp.y = y / vec.y;

	return temp;
}

cVector2&	cVector2::operator/=(const cVector2& vec)
{
	x /= vec.x;
	y /= vec.y;

	return *this;
}

cVector2	cVector2::operator/(const double& vec)
{
	cVector2 temp;
	temp.x = x / vec;
	temp.y = y / vec;

	return temp;
}

cVector2&	cVector2::operator/=(const double& vec)
{
	x /= vec;
	y /= vec;

	return *this;
}

//===============================
//【外積】
//===============================
double crossVector2(cVector2& vec1,cVector2& vec2)
{
	return (vec1.x*vec2.y)-(vec1.y*vec2.x);
}
//===============================
//【内積】
//===============================
double dotVector2(cVector2& vec1,cVector2& vec2)
{
	cVector2 temp;
	temp=vec1*vec2;
	return temp.x+temp.y;
}
//===============================
//【スカラー値算出】
//===============================
double lengthVector2(cVector2& vec)
{
	cVector2 temp;
	temp=vec*vec;
	
	return sqrt(temp.x+temp.y);
}
//===============================
//【単位ベクトル算出】
//===============================
cVector2 unitVector(cVector2& vec)
{
	double len=lengthVector2(vec);
	return vec/len;
}

//===============================
//【ベクトル逆数の算出】
//===============================
cVector2 inverseVector(cVector2& vec)
{
	cVector2 temp;
	temp.x=vec.y;
	temp.y=vec.x*-1;
	return temp;
}


}

★-cVector2-ver 2.0★
色々指摘を受けたので、
早速改善版のcVector2クラスのソースコードをうpさせて頂きました!



【cVector2.h】
#ifndef	_INC_G_CVECTOR2_
#define	_INC_G_CVECTOR2_
#include<math.h>

namespace	OGL
{


class cVector2{
private:

public:
	double x,y;
	cVector2	operator=	(const double& vec);

	void	operator		()(const double x,const double y);
	cVector2	operator+	(const cVector2& vec);
	cVector2&	operator+=	(const cVector2& vec);
	cVector2	operator+	(const double& vec);
	cVector2&	operator+=	(const double& vec);

	cVector2	operator-	(const cVector2& vec);
	cVector2&	operator-=	(const cVector2& vec);
	cVector2	operator-	(const double& vec);
	cVector2&	operator-=	(const double& vec);

	cVector2	operator*	(const cVector2& vec);
	cVector2&	operator*=	(const cVector2& vec);
	cVector2	operator*	(const double& vec);
	cVector2&	operator*=	(const double& vec);

	cVector2	operator/	(const cVector2& vec);
	cVector2&	operator/=	(const cVector2& vec);
	cVector2	operator/	(const double& vec);
	cVector2&	operator/=	(const double& vec);

	cVector2(void);
	cVector2(const double&srcX,const double&srcY){
		this->x = srcX;
		this->y = srcY;
	}
	cVector2(const cVector2& src){
		this->x = src.x;
		this->y = src.y;
	}
	~cVector2(void);
};	//End of cVector

double	crossVector2(cVector2& vec1,cVector2& vec2);
double	dotVector2(cVector2& vec1,cVector2& vec2);
double	lengthVector2(cVector2& vec);
cVector2 unitVector(cVector2& vec);
cVector2 inverseVector(cVector2& vec);

#include"cVector2operator.h"



}	// End of namespace OGL
#endif	//_INC_G_CVECTOR2_


【cVector2operator.h】

inline cVector2	cVector2::operator=(const double& vec)
{
	cVector2 temp;
	temp.x =vec;
	temp.y =vec;

	return temp;
}

inline void	cVector2::operator		()(const double srcX,const double srcY)
{
	this->x=srcX;
	this->y=srcY;
}

inline cVector2	cVector2::operator+(const cVector2& vec)
{
	cVector2 temp;
	temp.x = this->x + vec.x;
	temp.y = this->y + vec.y;

	return temp;
}

inline cVector2&	cVector2::operator+=(const cVector2& vec)
{
	this->x += vec.x;
	this->y += vec.y;

	return *this;
}

inline cVector2	cVector2::operator+(const double& vec)
{
	cVector2 temp;
	temp.x = this->x + vec;
	temp.y = this->y + vec;

	return temp;
}

inline cVector2&	cVector2::operator+=(const double& vec)
{
	this->x += vec;
	this->y += vec;

	return *this;
}

inline cVector2	cVector2::operator-(const cVector2& vec)
{
	cVector2 temp;
	temp.x = this->x - vec.x;
	temp.y = this->y - vec.y;

	return temp;
}

inline cVector2&	cVector2::operator-=(const cVector2& vec)
{
	this->x -= vec.x;
	this->y -= vec.y;

	return *this;
}

inline cVector2	cVector2::operator-(const double& vec)
{
	cVector2 temp;
	temp.x = this->x - vec;
	temp.y = this->y - vec;

	return temp;
}

inline cVector2&	cVector2::operator-=(const double& vec)
{
	this->x -= vec;
	this->y -= vec;

	return *this;
}

inline cVector2	cVector2::operator*(const cVector2& vec)
{
	cVector2 temp;
	temp.x = this->x * vec.x;
	temp.y = this->y * vec.y;

	return temp;
}

inline cVector2&	cVector2::operator*=(const cVector2& vec)
{
	this->x *= vec.x;
	this->y *= vec.y;

	return *this;
}

inline cVector2	cVector2::operator*(const double& vec)
{
	cVector2 temp;
	temp.x = this->x * vec;
	temp.y = this->y * vec;

	return temp;
}

inline cVector2&	cVector2::operator*=(const double& vec)
{
	this->x *= vec;
	this->y *= vec;

	return *this;
}

inline cVector2	cVector2::operator/(const cVector2& vec)
{
	cVector2 temp;
	temp.x = this->x / vec.x;
	temp.y = this->y / vec.y;

	return temp;
}

inline cVector2&	cVector2::operator/=(const cVector2& vec)
{
	this->x /= vec.x;
	this->y /= vec.y;

	return *this;
}

inline cVector2	cVector2::operator/(const double& vec)
{
	cVector2 temp;
	temp.x = this->x / vec;
	temp.y = this->y / vec;

	return temp;
}

inline cVector2&	cVector2::operator/=(const double& vec)
{
	this->x /= vec;
	this->y /= vec;

	return *this;
}
【cVector2.cpp】

#include"cVector2.h"

namespace	OGL
{


cVector2::cVector2(void)
{
	this->x=0;
	this->y=0;
}

cVector2::~cVector2(void)
{
}


//===============================
//【外積】
//===============================
double crossVector2(cVector2& vec1,cVector2& vec2)
{
	return (vec1.x*vec2.y)-(vec1.y*vec2.x);
}
//===============================
//【内積】
//===============================
double dotVector2(cVector2& vec1,cVector2& vec2)
{
	cVector2 temp;
	temp=vec1*vec2;
	return temp.x+temp.y;
}
//===============================
//【スカラー値算出】
//===============================
double lengthVector2(cVector2& vec)
{
	cVector2 temp;
	temp=vec*vec;
	
	return sqrt(temp.x+temp.y);
}
//===============================
//【単位ベクトル算出】
//===============================
cVector2 unitVector(cVector2& vec)
{
	double len=lengthVector2(vec);
	return vec/len;
}

//===============================
//【ベクトル逆数の算出】
//===============================
cVector2 inverseVector(cVector2& vec)
{
	cVector2 temp;
	temp.x=vec.y;
	temp.y=vec.x*-1;
	return temp;
}


}