C# ile 3 boyutlu yıldız çizimi

turkish_adanali0142

Uzman üye
17 May 2009
1,112
0
Adana
hj.gif


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);
        }
Düzgün bir yıldızın çizim algoritması
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 (n).
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;

            }
        }
Buradaki açı değerleri radyan olmak zorundadır. 0- 2Pi arasında olmalıdır. her adımda 2 nokta arasında açı farkı açıortay kadar olacaktır. Diyelimki 5 kenarlı bir yıldız çizilecek. 72 dereceyle yıldız çizilmeli. Büyük ve küçük yarıçapa ait kenar noktaları arasında 36 derece fark olmalıdır. Bu düzgün bir yıldız tasarımı içindir.drawMyLine fonsiyonu class ile oluşturduğumuz bir dll dosyası içindeki özel fonksiyondur. Bu çizgi çiziminde bize aradaki noktaları gönderiyor. İstersek Onun yerine g.drawLine(firstX, firstY, secondX, secondY);yazabilirdik.

yldz.gif



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.

ytimer.gif



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);
}
Burada yeralan capOran değişkeni ise;

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:

turkish_adanali0142

Uzman üye
17 May 2009
1,112
0
Adana
belki senin işine yaramaz fakat kodları incelersen pratiğin artar en azından. yıldızın çizim şeklini öğrenerek senin çizeceğin projerlerde faydalı olur.
 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.