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.

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