プログラマーの卵の日記

備忘録になってます!小難しそうなことから超簡単なことまでやってます!!

【C++】なんやかんや言ってsin波ってめっちゃ使うよね

構成


No.1 sin波
No.2 sin波のコード







        No.1 sin波


 ゲーム作ってると、シーン画面のフェードインとかフェードアウトとかBGMのフェード切り替えとかでsin波の流れみたいのって使うと思うんですよね。あとはジャンプとか場合でも使うと思います。
でも、ぶっちゃけこういうのって出来て当たり前、知ってて当たり前的な感じで説明しているようなところってないんですよね。
まぁ理由としてはそんなに難しいことでもないからだと思いますけど…

ところがどっこい、自分は経験の引き出しが無いと何もできないようなタイプだと思っているので、簡単にまとめてみました。コードを
それで、自分にとって描画をするうえで分かりやすいものってDxLibなので描画関係はこっちでやってます。

単純なものだとこんな感じだと思います。

f:id:yutateno:20200222002246g:plain







        No.2 sin波のコード<


 とりあえずDxLibで該当する部分だけでも載せると、こんな感じだと思います。


	XY xy[641];
	for (int i = 1; i <= 640; ++i)
	{
		xy[i].x = i;
		xy[i].y = (240/*0の高さ*/) + std::sin(PI * 2 / (640 * i/*一周分の値*/)) * (120/*0からの高さ*/);
	}
	int temp = 0;

	// メインループ
	while (!ScreenFlip() && !ProcessMessage() && !ClearDrawScreen() && !CheckHitKey(KEY_INPUT_ESCAPE))
	{
		for (int i = 1; i <= 640; ++i)
		{
			DrawPixel(xy[i].x, xy[i].y, GetColor(255, 255, 255));
			xy[i].y = 240 + std::sin(PI * 2 / 640 * temp) * 120;
			temp++;
		}
		temp++;
	}



 それで、sin波の処理?としてはこれですね。


		xy[i].y = (240/*0の高さ*/) + std::sin(PI * 2 / (640 * i/*一周分の値*/)) * (120/*0からの高さ*/);


 ぶっちゃけこれだけなんですよね。だからまぁ簡単だからこんなくだらないのを記事にしたりまとめないんだと思いますけどね。まぁぁ自分もあっているかどうか分かってないんですけどね。
で、このコードについて簡単に説明すると。


(240/*0の高さ*/)


 これは、描画の関係でy軸0の位置を下げるためのモノなので関係はないです。


std::sin(PI * 2 / (640 * i/*一周分の値*/))


 これは、一つの周期(波長)を指定する部分ですね。今回は640として、i というのが必ず1から640に行くようなものとなっている必要があります。
いや、まぁ0から639でも無理やり動かせるのかもしれないけど0で割るってなんだよ。


 * (120/*0からの高さ*/);

これは、高さ(振幅)の値を決める部分ですね。ぶっちゃけゲームにおいて高さなんてどうでもいいので描画しない限り気にしなくていいと思います。

まぁそんな感じです。

 補足的な感じで関数化して見ました。


inline float Sin_ZeroToOne(const int t_maxCount, int t_nowCount)
{
	int temp = t_maxCount * 4;
	return std::sin(DX_PI * 2 / temp * t_nowCount);
}

 これは、サイン波のY軸を0から出発して1のところまでの値を出すものです。サイン波で言えば1波長の1/4。