C# İLE DOĞRUSAL FONKSİYON GRAFİĞİ
C# programlama dili ile doğrusal fonksiyonların grafiğini nokta, nokta çizmek. C# ile koordinat sisteminde doğrusal fonksiyon grafiği. Konu anlatımı ve tüm kodlar.
Programlama dilleri ile çizilmesi en kolay olan fonksiyon grafiği doğrusal fonksiyonlardır. Bu tür uygulamalarda x ve y koordinatlarının başlangıç ve bitiş noktasını ve eğimini belirttiğinizde grafiğiniz tek aşamada çizilir.
Parabolik, sinüs ve kosinüs fonksiyonları böyle değildir. Bu fonksiyonları çizmek daha zordur. Kosinüs ve sinüs fonksiyonunun çizimi aynıdır. Bu sitede hem sinüs fonksiyonunun hem kare dalganın hem de üçgen dalganın C# ile çizilmiş örnekleri mevcuttur, linkleri yazı sonunda verilmiştir.
Gelelim doğrusal fonksiyonlara, doğrusal fonksiyonlarda fonksiyonun eğimini doğru belirlemelisiniz. Ekrana çizdiğiniz grafiğin eğimi doğru olmalıdır. Örnek olarak y = 3x fonksiyonunun eğimi y/x = 3 tür.
y = 3x + 5 fonksiyonunun çizimi,
x = 0 için y = 5 tir. Çizgi y eksenini y = 5 noktasında kesmelidir.
y = 0 için, x = -5/3 tür. Grafik x eksenini -5/3 = -1,67 noktasında kesmelidir.
x = -3 için, y = -4 tür.
x = 2 için, y = 11 dir.
x1 = -3, y1 = -4
x2 = 2, y2 = 11
Bu noktalarda geçecek bir grafik çizmeliyiz.
Fonksiyonu nokta nokta çizdiğimden her bir parça yukarıdaki fonksiyonun özelliklerini taşımalıdır.
f2t_an += 0.005F;
f2xt = f2t_an;
f2yt = b * (float)f2xt * f2y_max;
f2y2 = (float)f2yt + c;
f2x2 = (float)f2xt;
Yukarıdaki kod bloklarının sonucu 3x + 5 tir.
b = 3, c = 5 tir.
f2t_an += 0.005F; küçük pikseller üretecektir.
f2xt = f2t_an; f2xt, x değişkenidir. Yukarıdaki mini sayılarla değişim gösterir.
f2yt = b * (float)f2xt * f2y_max; ax ifadesinin yerini tutar. Minik x parçalarını 3 ile ve ayarladığımız bir max değişkeni ile çarpar.
f2y2 = (float)f2yt + c; ax + b ifadesini yazar. Çok küçük x değişkenine karşılık c değeri sabittir. f2y2 değeri sürekli değişir.
Biz fonksiyonu doğru yazsak da koordinat sistemi üzerine doğru oturtmazsak doğru çizim yapamaz. Aşağıdaki kodlar grafiği koordinat sistemine yerleştiriyor.
fark = (5 / 3) * 64;
s_left = x_left - fark;
y = 0 için, x = 5/3 idi. Bu değer koordinat sisteminin merkez noktasından kaç birim öteleyeceğimizi bulmamıza yardım edecektir.
S_left değişkeni grafiği orjinden x_left-fark kadar sola öteleyecektir.

Diğer fonksiyonun çizimi de buna benzer. Fonksiyonu nokta, nokta çizmezseniz oldukça kolaydır. Aşağıdaki kod blokunu inceleyin.
lin_object.DrawLine(fnc1kalem, x_left - 265, y_top + 600, x_left + 135, y_top - 600);
Bu kod blokunda x_left değeri y ekseninin ekranın sağından kaç piksel ötede olduğunu, y_top değeri ise x ekseninin ekranın üst kısmından kaç piksel aşağıda olduğunu gösterir.
Buna göre x ekseninde 265 y ekseninin solunda, 135 piksel y ekseninin sağında olmak üzere 265 + 135 = 400 piksel uzunluğunda çizgi çizilecektir. Y eksenindeki uzunluk, x eksenindeki uzunluğun 3 katı olmak zorundadır. 600 px x ekseninin altında, 600 piksel x ekseninin üstünde olacak şekilde toplam 1200 px uzunluğunda çizgi çizecektir. Böylece çizgilerin y/x oranı 3 olacaktır. Bu doğru çizilmiş bir çizgidir. Şimdi çizgiyi koordinat eksenine yerleştirmek gerekiyor. Koordinat ekseninin orijini x_left, y_top tur. Bu çizgi 5 birim ötelenmiş olduğundan koordinat ekseninin orijinine göre bir miktar geri çekerek bunu x = -5/3 iken, y = 5 olacak şekilde yerleştirirsek grafik doğru çizilmiş olur. Neden böyle yapıyoruz. Normalde x ekseninin solunda 200 birim, sağında 200 birim alacaktık ama her kare aralığı 40 birim ve 40*5/3 = 65 olduğundan 65 birim ötelememiz lazım.
Bence üzerinde yarım saat kafa yorarsanız nokta, nokta çizmenin daha pratik ve eğlenceli olduğunu anlayacak ve tüm özelliklerini kavrayacaksınız.
Kolay gelsin.
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 LineerFunctions
{
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;
private Graphics lin_object;
private Brush brs;
private Font tekst;
private Pen yenikalem;
private Pen fnc1kalem;
private Pen fnc2kalem;
private Pen fnckalem;
private Timer zaman;
private Timer zaman2;
private int y_top = 500;
private int x_left = 500;
private void Form1_Load(object sender, EventArgs e)
{
this.WindowState = FormWindowState.Maximized;
this.BackColor = Color.SteelBlue;
this.BackColor = Color.Black;
this.BackColor = Color.White;
button1.Top = 600;
button1.Left = 100;
button1.Text = "K-SISTEM";
button1.Width = 100;
button2.Top = 600;
button2.Left = 250;
button2.Width = 100;
button2.Text = "y = 3x + 5";
button4.Top = 650;
button4.Left = 100;
button4.Text = "y = -2x + 6";
button4.Width = 100;
button3.Top = 650;
button3.Left = 250;
button3.Text = "DURDUR";
button3.Width = 100;
zaman = new Timer();
zaman.Tick += new EventHandler(Fonksiyon2);
zaman2 = new Timer();
zaman2.Tick += new EventHandler(Fonksiyon3);
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
Wx = Convert.ToInt32(SW);
lin_object = this.CreateGraphics();
brs = new SolidBrush(System.Drawing.Color.LightBlue);
tekst = new System.Drawing.Font("Times New Roman", 20, FontStyle.Italic);
lin_object.DrawString("SANATSAL BİLGİ \n FONKSİYON GRAFİKLERİ", tekst, brs, 100, 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 - 450, y_top, Wx - 20, y_top);
lin_object.DrawLine(yenikalem, x_left, y_top + 400, x_left, y_top - 500);
yenikalem.Dispose();
LabelWrite();
}
private void button2_Click(object sender, EventArgs e)
{
fnc1kalem = new Pen(Color.Red, 3);
zaman.Interval = 1;
zaman.Start();
}
private void button3_Click(object sender, EventArgs e)
{
zaman.Stop();
zaman2.Stop();
}
private void button4_Click(object sender, EventArgs e)
{
fnc2kalem = new Pen(Color.Blue);
fnc2kalem.Width = 3;
zaman2.Interval = 1;
zaman2.Start();
}
private void LabelWrite()
{
yenikalem = new Pen(Color.Red);
yenikalem.Width = 2;
fnckalem = new Pen(Color.LightSteelBlue);
fnckalem.Width = 1;
int deg = 1;
int xson = (Wx - 150) / 40;
int xson1 = 400 / 40;
int yson = 800 / 40;
int yson1 = 500 / 40;
int top = y_top - 40;
int left = x_left - 40;
apsis_x = new Label[xson + 1];
apsis_y = new Label[yson + 1];
for (int l = 0; l < xson1; 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 += 1;
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]);
lin_object.DrawLine(fnckalem, left, y_top + 400, left, y_top - 500);
left -= 40;
}
deg = 0;
left = x_left;
for (int n = xson1; n < xson; n++)
{
lin_object.DrawLine(yenikalem, left, y_top - 5, left, y_top + 5);
apsis_x[n] = new Label();
apsis_x[n].Text = deg.ToString();
deg += 1;
apsis_x[n].Left = left - 7;
apsis_x[n].Top = y_top + 10;
apsis_x[n].Width = 30;
apsis_x[n].Height = 20;
this.Controls.Add(apsis_x[n]);
lin_object.DrawLine(fnckalem, left, y_top + 400, left, y_top - 500);
left += 40;
}
apsis_x[xson1].Left = apsis_x[xson1].Left + 10;
apsis_x[xson] = new Label();
apsis_x[xson].Text = "x";
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 = 1;
for (int z = 0; z < yson1; z++)
{
lin_object.DrawLine(yenikalem, x_left - 5, top, x_left + 5, top);
apsis_y[z] = new Label();
apsis_y[z].Text = deg.ToString();
deg += 1;
apsis_y[z].Left = x_left - 35;
apsis_y[z].Top = top - 7;
apsis_y[z].Width = 30;
apsis_y[z].Height = 20;
this.Controls.Add(apsis_y[z]);
lin_object.DrawLine(fnckalem, x_left - 400, top, left - 40, top);
top -= 40;
}
top = y_top + 50;
deg = 1;
for (int t = yson1; t < yson; t++)
{
lin_object.DrawLine(yenikalem, x_left - 5, top, x_left + 5, top);
apsis_y[t] = new Label();
apsis_y[t].Text = "-" + deg.ToString();
deg += 1;
apsis_y[t].Left = x_left - 35;
apsis_y[t].Top = top - 7;
apsis_y[t].Width = 30;
apsis_y[t].Height = 20;
this.Controls.Add(apsis_y[t]);
lin_object.DrawLine(fnckalem, x_left - 400, top, left - 40, top);
top += 40;
}
apsis_y[yson] = new Label();
apsis_y[yson].Text = "y";
apsis_y[yson].Width = 50;
apsis_y[yson].Left = x_left + 10;
apsis_y[yson].Top = y_top - 500;
this.Controls.Add(apsis_y[yson]);
}
float b = 3;
float c = 5;
float fark = 0;
float s_left = 0;
float f2x1 = 0;
float f2y1 = 0;
float f2x2 = 1;
float f2y2 = 1;
private double f2yt = 0;
private double f2t_an = -1;
private double f2xt = 0;
float f2x_max = 100;
float f2y_max = 100;
private void Fonksiyon2(object sender, EventArgs e)
{
fark = (5 / 3) * 64;
s_left = x_left - fark;
f2t_an += 0.005F;
f2xt = f2t_an;
f2yt = b * (float)f2xt * f2y_max;
f2y2 = (float)f2yt + c;
f2x2 = (float)f2xt;
if (f2x1 != 0)
{
lin_object.DrawLine(fnc1kalem, f2x1 * f2x_max + s_left, y_top - (f2y1), f2x1 * f2x_max + s_left, y_top - (f2y2));
}
f2x1 = f2x2;
f2y1 = f2y2;
}
float f3x1 = 0;
float f3y1 = 0;
float f3x2 = 1;
float f3y2 = 1;
private double f3yt = 0;
private double f3t_an = -2;
private double f3xt = 0;
float f3x_max = 100;
float f3y_max = 100;
float c3 = 6;
float b3 = -2;
private void Fonksiyon3(object sender, EventArgs e)
{
fark = 3 * 40;
s_left = x_left + fark;
f3t_an += 0.005F;
f3xt = f3t_an;
f3yt = b3 * (float)f3xt * f3y_max;
f3y2 = (float)f3yt + c3;
f3x2 = (float)f3xt;
if (f3x1 != 0)
{
lin_object.DrawLine(fnc2kalem, f3x1 * f3x_max + s_left, y_top - (f3y1), f3x1 * f3x_max + s_left, y_top - (f3y2));
}
f3x1 = f3x2;
f3y1 = f3y2;
}
}
}
y = x2 Fonksiyon Grafiğinin Çizilmesi
C# İle Sinusoidal Dalga Çizimi
SANATSAL BİLGİ
09/04/2019