Среда программирования:
Visual Studio 2010
Статья по теме:
Программа демонстрирует построение фрактала Ляпунова. В поле для ввода необходимо ввести строку, состоящую из символов А и В. При нажатии на кнопку Draw получаем изображение фрактала.
На рисунке жёлтый цвет соответствует стабильности, а темно-серый - хаосу.
Код программы:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace Lyapunov_fractal { public partial class Form1 : Form { //Инициализация bitmap и графики Bitmap myBitmap; Graphics g; //эпсилон для сравнивания действительных чисел const double Eps = 1E-5; //входная строка string S; //массив для запоминания предела в каждой точке double[,] mas = new double[510, 510]; //объявление предела (экспоненты Ляпунова) double limit = 0.0; public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { } private void pictureBox1_Click(object sender, EventArgs e) { } //функция прорисовки фрактала private void Draw() { //проходим по всем точкам экрана for (int a = 1; a <= 500; a++) { for (int b = 1; b <= 500; b++) { //в зависимости от значения предела в данной точке закрашиваем пиксель определенным цветом if (mas[a, b] > 0) g.FillRectangle( new SolidBrush(Color.FromArgb((Math.Abs((int)mas[a, b]) * 25 + 10) % 255, (Math.Abs((int)mas[a, b]) * 25 + 10) % 255, 0)), a, b, 1, 1); else g.FillRectangle( new SolidBrush(Color.FromArgb(Math.Abs(240 - ((Math.Abs((int)mas[a, b] * 20)+30) % 255)), (Math.Abs(255 - (Math.Abs((int)mas[a, b] * 20) + 50) % 255)), 0)), a, b, 1, 1); } } } private void button1_Click(object sender, EventArgs e) { //Создаем bitmap и графику из bitmap myBitmap = new Bitmap(pictureBox1.Width, pictureBox1.Height); g = Graphics.FromImage(myBitmap); //Сглаживание для графики g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; //считываем строку, состоящую из символов А и В S = textBox1.Text; //перебираем каждую точку for (int a = 1; a <= 500; a++) { for (int b = 1; b <= 500; b++) { //переводим а и b в точки отрезка [0,4] double x = a / 125.0; double y = b / 125.0; //начальное значение присваиваем 0.5 double xn = 0.5; //переменная, которая в зависимости от значения символа строки будет изменяться double rn; //обнуление предела limit = 0; //вычисление предела for (int i = 0; i < 1000; i++) { //проходимся по строке и в зависимости от символа (А или В) присваиваем переменной rn текущее значение x или у int index = i % S.Length; if (S[index] == 'A') rn = x; else rn = y; //на каждом шаге вычисляем значение xn и предел xn = rn * xn * (1 - xn); limit += (Math.Log(Math.Abs(rn * (1 - 2 * xn)))); } //для лучшего отображения предел уменьшаем limit /= 500; //если предел уходит на бесконечность, то присвоим ему новое значение if (limit < -1000000000) { limit = -50.0; } if (limit > 1000000000) { limit = 50.0; } //запишем в массив значение предела в данной точке mas[a, b] = limit; } } //вызываем функцию прорисовки фрактала Draw(); //отображаем bitmap на PictureBox pictureBox1.Image = myBitmap; } private void textBox1_TextChanged(object sender, EventArgs e) { } private void label1_Click(object sender, EventArgs e) { } } }
Прикрепленный файл | Размер |
---|---|
yakubova_Lyapunov_fractal.zip | 74.08 кб |