//--------------------------------------------------------------
//	移動平均の振幅特性の描画
//
//		作成者：三上直樹，2022/11/18 作成，ⓒ三上直樹 2022
//--------------------------------------------------------------

using System;
using System.Windows.Forms;

using System.Numerics;
using Mikami.WindowsApplication;

using static System.Numerics.Complex;

namespace 移動平均_振幅特性
{
	public partial class Form1 : Form
	{
		private readonly float Y0_; 
		private readonly float DX_;		// 標本化周波数/10 に対応するピクセル数
		private readonly float DY_;		// 10 dB に対応するピクセル数
		private readonly float dpiFactor_;

		private double order_;		// M

		public Form1()
		{
			InitializeComponent();
			// 異なる DPI のシステムに対応するスケール変換の係数を取得
			dpiFactor_ = CreateGraphics().DpiX/96.0f;

			Y0_ = pictureBox1.Height/30.0f;
			DX_ = (pictureBox1.Width-1)/5.0f;
			DY_ = (pictureBox1.Height-1-Y0_)/6.0f;

			FormCloseConfirm.Set(this);		// 終了時に確認できるようにする
		}

		// 終了の指令
		private void button1_Click(object sender, EventArgs e)
		{
			Close();
		}

		// M の読み取りと，対応する振幅特性の描画指令
		private void trackBar1_Scroll(object sender, EventArgs e)
		{
			order_ = trackBar1.Value;
			label5.Text = "= " + order_.ToString();
			pictureBox1.Invalidate();
		}

		// 目盛と座標軸および振幅特性の描画の指令
		private void pictureBox1_Paint(object sender, PaintEventArgs e)
		{
			DrawAxis(e.Graphics);	// 目盛と座標軸の描画
			DrawHz(e.Graphics);		// 振幅特性の描画
		}

		// 座標軸の目盛値やタイトルの描画の指令
		private void pictureBox2_Paint(object sender, PaintEventArgs e)
		{
			DrawGraphStringt(e.Graphics);
		}

		// 移動平均の周波数応答の絶対値
		//		omega: 正規化角周波数
		private double Hz(double omega)
		{
			Complex zM = 0;
			for (int k=0; k<=order_; k++) zM = zM + Exp(-omega*ImaginaryOne*k);
			return Abs(zM/(order_ + 1));
		}
	}
}
