Julia Fraktal Çizimi & C#
Fraktal; matematikte, çoğunlukla kendine benzeme özelliği gösteren karmaşık geometrik şekillerin ortak adıdır. En bilinen fraktal kümelerinden birisi olan Julia kümesinin C# ile oluşturulmuş hali aşağıdadır.
using System.Drawing; using System.Numerics; namespace SG.Algoritma { public class JuliaFractal { // Julia kümesinde, yarıçağı 2'den büyük her karmaşık sayı çemberi sonsuza götürmektedir. private const int MaxMagnitude = 2; // Maksimum iterasyon sayısı private const int MaxIterations = 1000; // Karmaşık sayı koordinat sisteminde, Julia kümesinin bölgesi. // Julia kümesinin sadece bir kısmını çizmek için farklı bir bölge verilebilir. private static Complex AreaMin = new Complex(-2, -2); private static Complex AreaMax = new Complex(2, 2); private Complex C; public JuliaFractal(Complex c) { this.C = c; } /// <summary> /// Julia kümesi imajı oluşturuluyor /// </summary> /// <param name="dimension">Oluşacak imajın genişlik ve yükseklik değeri (Kare imaj oluşturulacak)</param> public Bitmap GenerateBitmap(int dimension) { return this.GenerateBitmap(dimension, JuliaFractal.AreaMin, JuliaFractal.AreaMax); } /// <summary> /// Julia kümesi imajı oluşturuluyor /// </summary> /// <param name="width">Oluşacak imajın genişliği. Yükseklik, çizilmek istenen bölgeyenin genişlik ve yükseklik değerlerine bakılarak belirlenecek.</param> /// <param name="areaMin">Karmaşık sayo kooordinat sisteminde, Julia kümesinin sadece belirli bir bölgeye karşılık düşen kısmı çizdirilmek istendiği zaman, bu bölgenin sol alt kösesi</param> /// <param name="areaMax">Sağ üst köşe</param> public Bitmap GenerateBitmap(int width, Complex areaMin, Complex areaMax) { var height = (int)(width * (areaMax - areaMin).Imaginary / (areaMax - areaMin).Real); // Boş bir bitmap oluştur var bitmap = new Bitmap(width, height); // Oluşturulacak imajın her piksel değerine karşılık düşen karmaşık sayı oluşturulacak. // Oluşturacağımız karmaşık sayıların, seçtiğimiz bölge içerisinde kalması gerekmektedir. var rScale = (areaMax - areaMin).Real / width; var iScale = (areaMax - areaMin).Imaginary / height; for (var x = 0; x < width; x++) { // Karmaşık sayısının real kısmı var real = areaMin.Real + x * rScale; for (var y = 0; y < height; y++) { // Karmaşık sayısının imaginary kısmı var imaginary = areaMin.Imaginary + y * iScale; // Julia kümesi iterasyon değeri hesaplanıyor. var iteration = this.CalculateIteration(new Complex(real, imaginary)); // Iterasyon değerine göre noktanın rengi ayarlanıyor. bitmap.SetPixel(x, y, JuliaFractal.GetColor(iteration)); } } return bitmap; } private int CalculateIteration(Complex z) { var iteration = 0; while (iteration < JuliaFractal.MaxIterations && z.Magnitude < JuliaFractal.MaxMagnitude) { z = z * z + this.C; iteration++; } return iteration; } /// <summary> /// // Iterasyona karşılık renk seçiliyor. /// </summary> private static Color GetColor(int iteration) { // Rasgele bir renk seçiliyor. // 256 tane rengin olduğu bir liste oluşturularak, listeden iteration % 256. renk de seçilebilir. // Ya da renk oluşturmak için farklı bir yöntem izlenebilir. return Color.FromArgb(0, iteration % 256, 0); } } }
Julia kümesini fraktal resmini oluşturmak için, ilgili metot aşağıdaki şekilde çağrılabilir. Bu durumda en üstte yer alan resim oluşacaktır.
var fractal = new JuliaFractal(new Complex(0.285, 0.01)); var bitmap = fractal.GenerateBitmap(800); bitmap.Save(@"D:\julia.png", ImageFormat.Png);
Julia fraktalının sadece belirli bir bölgesini çizdirmek için, ilgili metot aşağıdaki şekilde çağrılabilir. Böylece fraktalın istenilen bölgesi daha detaylı bir şekilde çizdirilebilir.
var bitmap = fractal.GenerateBitmap(800, new Complex(-0.85, 0.1), new Complex(-0.45, 0.37));