Form ekranı X ve Y düzlemlerinden oluşan 2 boyutlu bir form ekranı olduğundan 3. boyutu kazandırmak için farklı yollar denemeliyiz. Bunlardan birisi de içini doldurmaktır. Herhangi bir yıldız çizdirdikten sonra yapmamız gereken yıldızın içini düzgün bir şekilde doldurmak olacaktır. Öncelikle işe yıldız çizdirme ile başlayalım.
İlk olarak genel tanımlamaları yapalım
Kod:
Graphics g;
Bitmap bmp;
Pen p;
private **** Form1_Load(object sender, EventArgs e)
{
p = new Pen(Color.Violet, 4);
g = this.CreateGraphics();
this.Size = new Size(1800, 800);
bmp = new Bitmap(3000, 3000, System.Drawing.Imaging.PixelFormat.Format32bppPArgb);
}
1- 2 tane farklı yarıçap belirle (yarıçaplar aynı olursa kaç kenarlı ise o kadar köşesi olur çokgen olur)
2- merkez koordinatlarını belirle
3- yarıçapların büyük ve küçük olanını bul
4- kaç köşeli olacağını gir .
5-döngü içinde açıyı 0 dan 360 kadar devam ettir. her adımda açıyı 360/n artır.
6-merkezden itibaren büyük yarıçap ve küçük yarıçap için noktalar belirle. Büyük ve küçüğü birleştir.
her adımda 2 doğru çiz.2 yeni nokta bul. Bir önceki aşamadaki noktayla yeni olanlardan birini birletir.
7- Üç boyut kazandırmak içinse çizilen 2 boyutlu yıldızın yarıçaplarını belli oranlarda düzgün bir şekilde merkeze kadar azalt.
Şimdi işe 2 boyutlu kenar sayısı dinamik olan bir yıldız çizmekle başlayalım.
Kod:
int maxR, minR;
private **** Yildiz_ciz(int centerX, int centerY, int orjin, Color renk1, Color renk2, int minR, int maxR)
{
int n = Convert.ToInt32(text_kenar.Text);
int firstX, firstY;
firstX = Convert.ToInt32(centerX + (maxR * Math.Cos((0))));
firstY = Convert.ToInt32(centerY + (maxR * Math.Sin(0)));
for (int i = orjin; i < 360 + orjin; i += 360 / n)
{
int secondX = Convert.ToInt32(centerX + minR * (Math.Cos((i + (180 / n)) * Math.PI / 180)));
int secondY = Convert.ToInt32(centerY + minR * (Math.Sin((i + (180 / n)) * Math.PI / 180)));
int[,] dizi = class1.drawMyLine(firstX, firstY, secondX, secondY);
for (int j = 0; j < dizi.Length / 2; j++)
{
bmp.SetPixel(dizi[j, 0], dizi[j, 1], renk1);
}
g.DrawImage(bmp, 0, 0);
firstX = secondX;
firstY = secondY;
secondX = Convert.ToInt32(centerX + maxR * (Math.Cos((i + 360 / n) * Math.PI / 180)));
secondY = Convert.ToInt32(centerY + maxR * ((Math.Sin((i + 360 / n) * Math.PI / 180))));
int[,] dizi2 = class1.drawMyLine(firstX, firstY, secondX, secondY);
for (int j = 0; j < dizi2.Length / 2; j++)
{
bmp.SetPixel(dizi2[j, 0], dizi2[j, 1], renk2);
}
g.DrawImage(bmp, 0, 0);
firstX = secondX;
firstY = secondY;
}
}
Yıldızı çizdirdik.Şimdi 3 boyutlu yıldız çizdirmeye... bunun için toolBox'tan aldığımız Timer nesnesi içine yazacağımız kod ile 3 boyutlu yıldızı aşama aşama çizdirmiş olacağız.
Kod:
private **** timer1_Tick(object sender, EventArgs e)
{
if (maxCap < 0 || minCap < 0) return;
Yildiz_ciz(centerX, centerY, orjin, Color.Tomato, Color.BlueViolet, minCap, maxCap);
minCap -= 4;
maxCap -= Convert.ToInt16(4 * capOran);
}
Kod:
private **** Form1_MouseDoubleClick(object sender, MouseEventArgs e)
{
int r1 = Convert.ToInt32(text_r1.Text), r2 = Convert.ToInt32(text_r2.Text);
minR = Math.Min(r1, r2);
maxR = Math.Max(r1, r2);
minCap = minR;
maxCap = maxR;
capOran = Convert.ToDouble(maxR / minR);
}
Örneğin min=100 max=300 ise capOran=3 olacak min 4 azalacak; max 12 azalacak her timer çalıştığında.
NOT:arkadaşlar yıldızlı yerler v0id sözcüğüdür.
Son düzenleme: