Уроки, алгоритмы, программы, примеры

Вход на сайт

Материалы по разделам

Построения
на плоскости (2D)
Графика
в пространстве (3D)
Вычислительная
геометрия
Физическое
моделирование
Фрактальная
графика

Новые комментарии

dobryj den, popytalas otkryt prikreplionnyj fail ctoby posmotret kak rabotaet, no mne ego ne pokazyvaet vydajet osibku. Pochemu?
Очень интересно! ии сайт крутой жалко что умирает(
У Вас число превысит максимальное число int. Можно использовать в Вашем случае uint, но лучше все переписать на double.
Добавление к программе строки glutReshapeFunc(changeSize); приводит к тому, что треугольник перестаёт совсем отрисовываться.
Выдаёт ошибку glut32.dll не найден! При том, что он лежит в System32! Всё решил) Нужно отправить не в System32, а в System.

Счетчики и рейтинг

Рейтинг@Mail.ru Яндекс.Метрика
Скриншот к примеру
Среда программирования: 
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.zip74.08 кб