C# İLE KOORDİNAT SİSTEMİ ÇİZİMİ

C# ile koordinat sistemi yapımı. X ve y eksenlerini çizmek ve numaralandırmak. Koordinat eksenine kare dalga çizimi. Konu anlatımı ve örnek program.


C# ile çizim örnekleri vermeye başlamışken koordinat sistemini de çizmemiz iyi olacaktır. Koordinat sistemi çizimi biraz teknik, biraz matematik bilgisi isteyen bir iştir ve algoritma yeteneğinizi geliştirmeye yardımcı olacaktır.


Öncelikle hangi araçları kullanarak sistemi çizeceğinize karar vermelisiniz.

C# çizim sınıfı illaki kullanılacak. Sonra x ve y eksenleri numaralandırılacak. Daha sonra bu numaraların karşısı bir çizgi veya nokta ile işaretlenecek.

En başta bazı değerleri global olarak tanımlayalım. "y_top" değeri y ekseninin ne kadar aşağıya ineceğini, "x_left" değeri x ekseninin ne kadar soldan başlayacağını gösterir. "SW" değişkeni ekranın genişliğini alır.

private int y_top = 500;

private int x_left = 50;

private int Wx = 0;

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


Aşağıdaki kod x eksenini çizer.

"Wx" değeri form load kısmında SW değerinin integere dönüştürülmüş halidir. Yani ekranın 50 piksel solundan başlayacak ve en sağından 20 piksel içeride sonlanacak.


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

Aşağıdaki kod y eksenindeki çizgiyi çizer. X eksenindeki çizginin 50 piksel solunda, 100 piksel altında başlar, 400 piksel üzerine çıkar

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


Aşağıdaki kod çizgilerin ucuna ok işareti koyar.

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


Artık x ve y eksenlerimiz tamam. Şimdi numaralandıralım.


Numaralandırma işlemini Label etiketiyle yapabiliriz. İki adet Label dizisi oluşturup bu labellere x vey eksenlerindeki sayıları yazdırabiliriz.

Koordinat2


Labeller for döngüleriyle koordinat sistemine yerleştirilir.


Aşağıdaki kod ile ekran genişliğinden, yani ekranın sağından 150 piksel içeride olacak şekilde bir uzaklık belirleyip, bu uzaklığı etiketler arasındaki mesafeye bölerek kaç elemanlı label dizisi üreteceğimizi buluyoruz. 


int xson = (Wx-150) / 60;

Eksenin en sonu için 1 tane fazla üreteceğiz

apsis_x = new Label[xson+1];


y ekseni x ekseninin üzerinde 400 piksel yükseliyordu. 50 piksel aşağı inersek bu uzaklık 350 piksel yapar. Y eksenindeki değerler 50 piksel ile artacak. 350’yi 50’ye bölerek kaç adet y ekseni labeli üreteceğimizi buluyoruz.

 int yson = 350 / 50;

Eksenin sonu için 1 tane fazla üreteceğiz.

  apsis_y = new Label[yson+1];

İlk y labeli x ekseninden 50 birim uzaklıkta başlamalı.

 int top = y_top - 50;

y ekseni 50 piksel içeride başladığından x_left değerini 50 piksel sağa kaydırmalıyız.

int left = x_left + 50;


for (int l = 0; l < xson; l++)
            {
Koordinat sisteminde x ekseni 60 birim(piksel) aralıklarla işaretlenmeye başlıyor.
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;
//Label etiketindeki yazıyı tam çizgi altına getirmek için 7 birim kaydırıyoruz.
  apsis_x[l].Left = left-7;
//Labeller x ekseninin 10 birim altına yerleşsin
        apsis_x[l].Top = y_top+10;
        apsis_x[l].Width = 30;
        apsis_x[l].Height = 20;
        this.Controls.Add(apsis_x[l]);
                
//1. tur tamam, 60 birim ileri git.
                left += 60;
            }


İlk labeli y ekseninin biraz sağına getirmek için özel ayar uygularız.

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


Y eksenindeki labeller de aynı mantıkla yerleştirilir.


Şimdi bir önceki konuda yaptığımız kare dalgayı yerleştirelim. Kare dalgayı nasıl yapacağımız önceki konuda anlatılmıştır. Konu linki sayfa sonundadır.

Kare dalga aralıklarını 60 piksel olarak, genliğini 100 piksel olarak ayarlayacağız. Kare dalgada her satırın açıklaması üzerine yazılmıştır. Mantığı da daha önce anlatılmıştı.

 Böylece güzel bir kare dalga sistemi yapmış olduk. Program her türlü geliştirilebilir.


Kolay gelsin.

Tam 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 KoordinatSistem
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private int y_top = 500;
        private int x_left = 50;
        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;
        private void Form1_Load(object sender, EventArgs e)
        {
            this.WindowState = FormWindowState.Maximized;
            button1.Top = 600;
            button1.Left = 400;
            button1.Text = "K-SISTEM";
            button2.Top = 600;
            button2.Left = 500;
            button2.Width = 120;
            button2.Text = "KARE DALGA";
        }
        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İ KOORDINAT 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)
        {
            //x ve y eksenlerini çiz
            //kalem ve grafik nesnesi yukarıda tanımlandı
            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 LabelWrite()
        {
            yenikalem = new Pen(Color.Red);
            yenikalem.Width = 2;
            int deg = 0;
            //x eksenini etiketleyecek label sayısı
            int xson = (Wx-150) / 60;
            //y eksenini etiketleyecek label sayısı
            int yson = 350 / 50;
            //labellerin top ve left başlangıç değerleri
            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++)
            {
                //60 piksel aralıklarla çizgileri yerleştir
                lin_object.DrawLine(yenikalem, left, y_top - 5, left, y_top + 5);
                //labelleri tanımla
                apsis_x[l] = new Label();
                apsis_x[l].Text = deg.ToString();
                //10'ar 10'ar büyüteceğiz
                deg += 10;
                // labeli işaret çizgisine hizala
                apsis_x[l].Left = left-7;
                //y ekseninin 10 piksel altında olsun
                apsis_x[l].Top = y_top+10;
                apsis_x[l].Width = 30;
                apsis_x[l].Height = 20;
                this.Controls.Add(apsis_x[l]);
                
                left += 60;
            }
            apsis_x[0].Left = apsis_x[0].Left + 10;
            //Koordinatın sonunda görünecek
            apsis_x[xson] = new Label();
            apsis_x[xson].Text = "t/saniye";
            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 < yson; z++)
            {
                //y eksenini 50'şer birim aralıklarla işaretle
                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;
                //y eksenine uzaklığı
                apsis_y[z].Left = x_left+25;
                //Labeli işaretçilere hizala
                apsis_y[z].Top = top-7;
                apsis_y[z].Width = 20;
                apsis_y[z].Height = 20;
                
                this.Controls.Add(apsis_y[z]);
                top -= 50;
            }
            //y ekseninin başında görünecek
            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 void button2_Click(object sender, EventArgs e)
        {
            int hx = 40;
            int hy = 500;
            //Bir grafik nesnesi yarat
            Graphics Lines = this.CreateGraphics();
            //Bir kalem yarat, rengini ve kalınlığını belirle
            Pen kalem = new Pen(Color.DarkRed, 4);
            Pen kalem2 = new Pen(Color.ForestGreen, 4);
            //Ekran çözünürlüğünü int değişkenine ata
            int RW = Convert.ToInt32(SW);
            //Her döngü x değerini 120 pixel ilerletiyor, 120'e böl
            int r = (RW - 150) / 120;
            //dalga aralığı
            int x_artim = 60;
            //Dalga genliği
            int y_artim = 100;
            //döngüye başla, çizgi kalınlıklarını ve çözünürlüğü düşünerek r değerini 1 fazla al
            for (int l = 0; l < r; l++)
            {
                //60px bir x çizgisi çiz
                Lines.DrawLine(kalem, new Point(hx, hy - 2), new Point(hx + x_artim, hy - 2));
                //x çizgisi tamam şimdi 100px bir dikey y çizgisi çiz
                Lines.DrawLine(kalem2, new Point(hx + x_artim, hy), new Point(hx + x_artim, hy - y_artim));
                //hx değerine 60px ilave et
                hx += 60;
                //Şimdi y çizgisinin üst ucuna x çizgisini çiz
                Lines.DrawLine(kalem, new Point(hx, hy - y_artim+2), new Point(hx + x_artim, hy - y_artim+2));
                //x çizgisi tamam, şimdi aşağıya doğru y çizgisini çiz
                Lines.DrawLine(kalem2, new Point(hx + x_artim, hy), new Point(hx + x_artim, hy - y_artim));
                //bir tur tamamlandı, hx i 60px ileri götür
                hx += 60;
            }
            //grafik aracını yok et
            Lines.Dispose();
        }
        
    }
}


C# İle Kare Dalga Çizimi


C# İle Sinusoidal Dalga Çizimi


SANATSAL BİLGİ

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