C# İLE SİNÜSOİDAL DALGA ÇİZİMİ

C# ile koordinat ekseni yapmak ve koordinat sistemine sinusoidal dalga çizmek. Timer nesnesi ile sinusoidal dalga çizimi. V = Vmax.sin(wt) fonksiyonunun grafiğinin c# ile çizimi.


Daha önce kare dalga ve koordinat sistemi oluşturmayı çizdik. Bu yazıda sinüsoidal dalga oluşturmayı işleyeceğiz.

Sanırım sinüsoidal dalganın ne olduğunu anlatmaya gerek yok. Burada önce C# dilinin Math.Sin(x) sınıfının sinüs dalgasını nasıl oluşturduğunu anlatacağız.

Birlindiği gibi açı birimlerinden biri radyandı. π radyan 180 dereceye eşitti. Radyan açıları π’nin katları biçiminde gösterilir. π/2, π/12, 2π gibi.

İşte C# programlama dilinde Sin(x) fonksiyonuna değerleri yukarıdaki gibi vermezseniz hatalı işlem yaparsınız.

Deneme amacıyla hem hesap makinenizi açın, hem de örnek bir C# form uygulaması oluşturup bir buttonun click eventine aşağıdakileri yazın.

double sinus;

sinus =Math.sin(30);

MessageBox.Show(sinus.ToString());


Hesap makinenizde sin(30) işlemini yapın.

Bilgisayardan çıkan sonuçla hesap makinenizdeki sonucu karşılaştırın, ne çıktı?


Şimdi o kodları silip aşağıdaki kodları yazın.

double sinus, pi_num,radx;

pi_num=Math.PI;

radx=pi_num/6;

sinus =Math.sin(radx);

MessageBox.Show(sinus.ToString());


Şimdi tekrar karşılaştırırsanız C#’ın ve hesap makinesinin aynı değeri verdiğini görürsünüz.

π/6 = 30 derecedir.

Şimdi programımıza dönelim. Programda 1. Buttona tıklayınca koordinat sistemi çizilecek. Koordinat sistemini aşağıdaki linkte detaylı biçimde anlattığımız için burada değinmeyeceğiz. Burada dalga çizimini işleyeceğiz.


Dalga Çizimi

2. button sinusoidal dalgayı oluşturacak. 

Bir jeneratörün zamana göre ürettiği elektrik geriliminin değeri Vmax.sin(w.t) ile bulunur.

w = 2.π.f dir.

f genellikle 60 Hz dir.

O halde sinusoidal dalganın matematiksel ifadesi,

Vmax .sin(2.π.60.t) dir.

t saniye biriminden zamandır.


Biz her 10 saniyede bir sıfırlanması için dalganın frekansını 50 Hz alacağız. Böylece tam sayıların üzerinden geçerek x eksenini kesecek. Frekansı 60 Hz yaparsak, periyodu tam sayı olmuyor. Bizim amacımız öğretmek olduğundan böyle bir uygulama yaptık.

Dalgayı aşağıdaki fonksiyon oluşturmaktadır.

      private void zaman_Tick(object sender, EventArgs e)

        {

            yenikalem = new Pen(Color.Red, 3);

            float frq = 50;

            double omega = 2 * Math.PI * frq;

            double angle = omega / 180;

            xcr += 0.005F;

     xn = xcr;

            t_an = (sayac / 100);

            line_y = (float)Math.Sin(angle * t_an);

            lin_object.DrawLine(yenikalem, xn * x_max + 100, y_top - (yn * y_max), xn * x_max + 100, y_top - (line_y * y_max));

            

            

            yn = line_y;

            sayac++;

        }


Sinusoidal dalganın genliğini y_max değişkeni belirliyor. Bu değerle oynayarak dalga genliğini değiştirebilirsiniz.

x_max değerini sabit tutup, y_max değerini 2 katına çıkarırsanız, dalga boyu sabit kalacak, genlik 2 katına çıkacaktır.

Dalga boyunu x_max değeri belirlemektedir. y_max değerini değiştirmeden x_max değerini 2 katına çıkarırsanız, genlik sabit kalacak, dalga boyu ise 2 katına çıkacaktır.


Temel mantık x ekseninde küçük çizgi parçaları üreterek sin(wt) fonksiyonundan gelen y değerlerine göre dalga şeklini çizmektir. X eksenindeki parçacıklar yukarı ve aşağı yönde Sin(angle * t_an) fonksiyonunun ürettiği dalgayı takip ederek çizgicikleri çizmektedir.


Sinusoidal dalgayı for döngüsü ile de yapabilirdik. Fakat Timer ile yapmak daha güzel oluyor. Sinusoidal dalga yavaş yavaş çiziliyor ve istediğimiz bir anda durdurabiliyoruz. For döngüsüne atmak için aşağıdaki fonksiyonu kullanabilirsiniz.

  for (float x = 0; x < 8;x+=0.005F )
            {
                t_an = (sayac / 100);
                y2 = (float)Math.Sin(angle * t_an);
                lin_object.DrawLine(yenikalem, x1 * x_max + 100, y_top - (y1 * y_max), x1 * x_max + 100, y_top - (y2 * x_max));
                k++;
                x1 = x;
                y1 = y2;
                sayac++;
            }


Programın tam kodları aşağıdadır. Kordinat sistemi ile birlikte verdik.

Önce bir form oluşturun 3 button koyarak bunların click eventini ve form load eventini oluşturun. Daha sonra bizim kodları ilgili yerlere yazarak çalıştırın. Çeşitli değerlerle oynayarak kendinizi geliştirin. Aşağıda linkini verdiğimiz kare dalgaya da göz atabilirsiniz.

Kolay gelsin.

Tüm kodlar.

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Windows.Forms;



namespace SinusoidalWave

{

    public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

        }

        private int Wx = 0;

        private string SW = Screen.PrimaryScreen.Bounds.Width.ToString();

        private string SH = Screen.PrimaryScreen.Bounds.Height.ToString();

        private Label[] apsis_x;

        private Label[] apsis_y;

        Graphics lin_object;

        Brush brs;

        Font tekst;

        Pen yenikalem;

        Timer zaman;

        private int y_top = 400;

        private int x_left = 50;

        private void Form1_Load(object sender, EventArgs e)

        {

            this.WindowState = FormWindowState.Maximized;

            button1.Top = 600;

            button1.Left = 200;

            button1.Text = "K-SISTEM";

            button2.Top = 600;

            button2.Left = 300;

            button2.Width = 120;

            button2.Text = "SİNÜSOİDAL DALGA";

            button3.Top = 600;

            button3.Left = 500;

            button3.Text = "DURDUR";

            zaman = new Timer();

            zaman.Tick += new EventHandler(zaman_Tick);       

        }

        protected override void OnPaint(PaintEventArgs e)

        {

            base.OnPaint(e);

            Wx = Convert.ToInt32(SW);

            lin_object = this.CreateGraphics();

            brs = new SolidBrush(System.Drawing.Color.Red);

            tekst = new System.Drawing.Font("Times New Roman", 20, FontStyle.Italic);

            lin_object.DrawString("SANATSAL BİLGİ SİNUSOİDAL DALGA SİSTEMİ", tekst, brs, 200, 100);

            yenikalem = new Pen(Color.DarkBlue);

            yenikalem.Width = 4;

            yenikalem.EndCap = System.Drawing.Drawing2D.LineCap.ArrowAnchor;

        }

        private void button1_Click(object sender, EventArgs e)

        {

            lin_object.DrawLine(yenikalem, x_left, y_top, Wx - 20, y_top);

            lin_object.DrawLine(yenikalem, x_left + 50, y_top + 100, x_left + 50, y_top - 400);

            yenikalem.Dispose();

            LabelWrite();

        }

        private void button2_Click(object sender, EventArgs e)

        {

            zaman.Interval = 1;

            zaman.Start();

        }

        private void button3_Click(object sender, EventArgs e)

        {

            zaman.Stop();

        }

        private void LabelWrite()

        {

            yenikalem = new Pen(Color.Red);

            yenikalem.Width = 2;

            int deg = 0;

            int xson = (Wx - 150) / 90;

            int yson = 350 / 50;

            int top = y_top - 50;

            int left = x_left + 50;

            apsis_x = new Label[xson + 1];

            apsis_y = new Label[yson + 1];

            for (int l = 0; l < xson; l++)

            {

                lin_object.DrawLine(yenikalem, left, y_top - 5, left, y_top + 5);

                apsis_x[l] = new Label();

                apsis_x[l].Text = deg.ToString();

                deg += 10;

                apsis_x[l].Left = left - 7;

                apsis_x[l].Top = y_top + 10;

                apsis_x[l].Width = 30;

                apsis_x[l].Height = 20;

                this.Controls.Add(apsis_x[l]);

                left += 90;

            }

            apsis_x[0].Left = apsis_x[0].Left + 10;

            apsis_x[xson] = new Label();

            apsis_x[xson].Text = "t/ms";

            apsis_x[xson].Width = 150;

            apsis_x[xson].Left = Wx - 50;

            apsis_x[xson].Top = y_top + 10;

            this.Controls.Add(apsis_x[xson]);

            deg = 100;

            for (int z = 0; z < yson; z++)

            {

                lin_object.DrawLine(yenikalem, x_left + 45, top, x_left + 55, top);

                apsis_y[z] = new Label();

                apsis_y[z].Text = deg.ToString();

                deg += 100;

                apsis_y[z].Left = x_left + 15;

                apsis_y[z].Top = top - 7;

                apsis_y[z].Width = 30;

                apsis_y[z].Height = 20;

                this.Controls.Add(apsis_y[z]);

                top -= 50;

            }

            apsis_y[yson] = new Label();

            apsis_y[yson].Text = "Volt";

            apsis_y[yson].Width = 50;

            apsis_y[yson].Left = x_left + 60; ;

            apsis_y[yson].Top = y_top - 400;

            this.Controls.Add(apsis_y[yson]);

        }

        private double sayac = 0;

        private float xcr = 0;

        private double t_an = 0;

        float xn = 50;

        float yn = 0;

        float line_y = 0;

        float x_max = 100;

        float y_max = 200;  

        private void zaman_Tick(object sender, EventArgs e)

        {

            yenikalem = new Pen(Color.Red, 3);

            float frq = 50;

            double omega = 2 * Math.PI * frq;

            double angle = omega / 180;

            xcr += 0.005F;

            t_an = (sayac / 100);

            line_y = (float)Math.Sin(angle * t_an);

            lin_object.DrawLine(yenikalem, xn * x_max + 100, y_top - (yn * y_max), xn * x_max + 100, y_top - (line_y * y_max));

            xn = xcr;

            yn = line_y;

            sayac++;

        }



    }

}


C# İle Kare Dalga Çizimi


C# İle Koordinat Sistemi Çizimi


C# İle y = x2 Fonksiyon Grafiğinin Çizilmesi



SANATSAL BİLGİ

07/03/2019

  • YORUM YAZ
  • ADI SOYADI(veya nick)
  • YORUM

COPYRIGHT© HER HAKKI SAKLIDIR
Sitede Yer Alan Bilgi Belge Ve Materyallerin İzinsiz olarak Kopyalanması ve Alıntılanması Yasaktır

SANATSAL BILGI