C# İLE ÜÇGEN DALGA ÇİZİMİ

C# ile koordinat sistemi üzerinde timer kullanarak üçgen dalga çizmek. Yukarı ve aşağı yönlü üçgen dalga çizimi. C# ile ileri düzey programlama örnekleri. Program anlatımı ve tam kodlar.


Herkese merhabalar,

C# ile dalga çizimlerinin 3. sü olan üçgen dalga çizimini gösteriyoruz. Daha önce kare dalga ve sinusoidal dalga yapımını ve koordinat sistemini göstermiştik. Bazı arkadaşlar belki deneyip yapmışlardır bu uygulamayı ama bazı arkadaşlar zorlanmış olabilir.

Daha önceki uygulamalarda koordinat sistemini yapmayı anlatmıştık. Bu bölümde koordinat sistemine –y eksenindeki sayıları da yerleştirdik. Bunu yaparken y eksenini biraz daha uzatıp labellerin sayısını da buna göre artırdık. Ardından "apsis_y" labellerini pozitif ve negatif sayıları göstermek üzere ikiye böldük.

Aşağıda, x ve y eksenini çizen kodlar görülüyor.

private int x_left = 50;

private int y_top = 400;

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

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


x ekseni y_top değerinde çizilmiştir. y ekseni x ekseninin altında 300 piksel, üstünde 400 piksel olmak üzere 700 birim uzunluğundadır. Labeller 50 piksel arayla işaretlenirse,

700/50 = 14 label gerekir. Biz 0 noktasına y labeli koymayacağız. O halde, 650/50 = 13 label yetecektir. Fakat bu labelleri ve koordinatlar olası bir PC giriş portuna bağlamanız durumunda otomatik değerleri okuyup sistemi kendisi oluştursun diye her şeyi değişkenlerle yaptık.

y ekseni üzerinde 400-50/50 = 7 label olacaktır. Kalan labeller y ekseninin altı için çizilecektir.

Koordinat eksenlerinin çizimi için yazı sonunda verilen linki tıklayarak ayrıntılı açıklamalara ulaşabilirsiniz. O örneklerde her satırın açıklaması üzerine yazılmıştır.


Üçgen Dalga Çizimi

Üçgen dalgayı koordinat ekseninin orijininde başlatmak istiyoruz. t = 0 anında orijinde olacak dalgamız, t = 5 ms de üçgenin tepe noktasına ulaşacak. t = 10 ms de 0 V’u gösterecek ve t = 15 ms de negatif yönde tepe noktasına ulaşacak. t = 20 ms de tekrar 0 olacak. Böylece 1 tam periyodunu tamamlayan dalga 2. Turuna başlayacak.

Bunun için önce yukarı doğru bir yarım çizgi ile başlamalı. İlk başlangıçta (0,0),(5,20) çizgisini çizmesi ve bunu bir daha tekrar etmemesi için bir kontrol koyuyoruz. Start komutu başlangıçta 1’dir ve sonrasında 0 olur. Böylece bu ilk çizgiyi çizmiş oluruz.

if(start==1)

 {

 lin_object.DrawLine(yenikalem, x_max, y_top, x_max + xn, y_top - y_max);

  x_max = x_max + xn;


  y_top = y_top - y_max;

 }


Şimdi bize bir kontrol öğesi daha lazım. Üçgen dalganın aşağı ve yukarı yönlerinden hangisinin çizileceğini bilgisayara söyleyecek bir eleman lazım. Bu eleman sayaç değişkenidir. Bu değişken -1 olduğunda üçgen kenarı yukarıdan aşağıya doğru, +1 olduğunda üçgen kenarı yukarı doğru çizilecektir.

Başlangıçta sayaç -1 olmalıdır. Böylece start komutuyla başlangıç çizgisini çizmeye başlayan program bu çizgiyi bitirdikten sonra y = 20 den y = -20 ye kadar olan üçgen kenarını çizmelidir. Bu kenarı çizdikten sonra sayaç = +1 olmalıdır. Böylece sonraki turda y = -20 ile y = +20 çizgisini çizecektir. Bu çizgiyi çizdikten sonra sayaç tekrar – olmalıdır ki sonraki ziyaretinde aşağı yönlü çizgiyi çizsin.


   if(sayac==-1)

   {

   lin_object.DrawLine(yenikalem, x_max, y_top, x_max + 2*xn, y_top + 2*y_max);

    

   x_max = x_max+2 * xn;

   y_top = y_top + 2 * y_max;

   }

  if(sayac==1)

   {

     lin_object.DrawLine(yenikalem, x_max, y_top, x_max + 2 * xn, y_top - 2 * y_max);

                

     x_max = x_max + 2 * xn;

     y_top = y_top - 2 * y_max;

    }

   sayac *= -1;


Ben görsel açıdan çizginin çizimini izlemek için Timer kullanarak yaptım bunu. Siz isterseniz Timer içindeki kodları for döngüsüne atarak da yapabilirsiniz. Bu durumda Timeri kaldırarak bir fonksiyon oluşturun ve bunu button ile çağırın. Fonksiyonda Timer içine yazdığımız kodları for döngüsü içine atın. Peki döngü komutunu nasıl vereceksiniz. Sizce bir ekrana kaç dalga sığar? 3 mü, 5’mi, 10’mu? Şöyle yapıp deneyiniz.

int gen = (Wx - 150) / 100;

for(int i =0; i<gen;i++)

{

.

.

.

}

csharp_ucgendalga



Programı çalıştırdığınızda bir iki saniye bekleyin, zira timer 1 saniyeye ayarlandı. Bu süre tam 1 saniye olmayabilir, zira işletilen kodlar süreyi uzatacaktır. Siz timerin interval değerini değiştirerek çizim hızını değiştirebilirsiniz.

Sorunuz olursa buradan yazabilirsiniz. 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 UcgenDalga
{
    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 = "ÜÇGEN 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.Green);
            tekst = new System.Drawing.Font("Times New Roman", 20, FontStyle.Italic);
            lin_object.DrawString("SANATSAL BİLGİ ÜÇGEN 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 + 300, x_left + 50, y_top - 400);
            yenikalem.Dispose();
            LabelWrite();
        }
        private void button2_Click(object sender, EventArgs e)
        {
            zaman.Interval = 1000;
            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 = 650 / 50;
            int yson1 = 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 += 100;
            }
            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 = 5;
            for (int z = 0; z < yson1; 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 += 5;
                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;
            }
            top = y_top+50;
            deg = 5;
            for (int t = yson1; t < yson; t++)
            {
                lin_object.DrawLine(yenikalem, x_left + 45, top, x_left + 55, top);
                apsis_y[t] = new Label();
                apsis_y[t].Text = "-"+deg.ToString();
                deg += 5;
                apsis_y[t].Left = x_left + 15;
                apsis_y[t].Top = top - 7;
                apsis_y[t].Width = 30;
                apsis_y[t].Height = 20;
                this.Controls.Add(apsis_y[t]);
                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 = -1;
        int start = 1;
        float xn = 50;
        float x_max = 100;
        int y_max = 200;
        private void zaman_Tick(object sender, EventArgs e)
        {
            yenikalem = new Pen(Color.LightSeaGreen, 2);
            if(start==1)
            {
                lin_object.DrawLine(yenikalem, x_max, y_top, x_max + xn, y_top - y_max);
                x_max = x_max + xn;
                y_top = y_top - y_max;
            }
            if(sayac==-1)
            {
                lin_object.DrawLine(yenikalem, x_max, y_top, x_max + 2*xn, y_top + 2*y_max);
               
                x_max = x_max+2 * xn;
                y_top = y_top + 2 * y_max;
            }
            if(sayac==1)
            {
                lin_object.DrawLine(yenikalem, x_max, y_top, x_max + 2 * xn, y_top - 2 * y_max);
                
                x_max = x_max + 2 * xn;
                y_top = y_top - 2 * y_max;
            }
            sayac *= -1;
            start = 0;
        }
    }
}



C# İle Sinusoidal Dalga Çizimi

C# İle Kare Dalga Çizimi


SANATSAL BİLGİ

21/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