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

Вход на сайт

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

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

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

Спасибо за реализацию, она действительно быстрая. Но не все линии отрисовывает в нужную сторону... Необходимо добавить проверку для случая X-линии if(y1 "<" y0) grad=-grad; и аналогично для Y-линии if(x1 "<" x0) grad=-grad; P.S. На...
Отличные уроки(учу GL по ним), только в renderScene нужно добавить очистку буфера цвета и буфера глубины. При изменении размеров треугольники размножаются)
как исправить это , сделал все по инструкции
Timer1 - выдает ошибку. Использовал IdleTimer1, работает! unit Unit1; {$mode objfpc}{$H+} interface uses Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, ExtCtrls, OpenGLContext, GL, GLU; type { TForm1 } TForm1 =...
в коде присутствуют ошибки! // Считываем координаты procedure TForm1.getCoords(Sender: TObject); var j1:longint; begin n:= StrToInt(Edit2.Text); //число точек s1:=Edit1.Text; s2:=''; i := 1; j:=1; k:=0...

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

Яндекс.Метрика Рейтинг@Mail.ru
Скриншот к примеру
Среда программирования: 
Visual Studio 2013
Статья по теме: 

Построить фрактал папоротник Барнсли, используя библиотеку System.Drawing.
Создаем проект Windows Form, на форму добавляем PictureBox
(FernPictureBox, размер - 800х640)

Код программы: 

using System;
using System.Drawing;
using System.Windows.Forms;
 
namespace Fern
{
    public partial class Form1 : Form
    {
        // Задаем диапазон значений для точек
        private const float MinX = -6;
        private const float MaxX = 6;
        private const float MinY = 0.1f;
        private const float MaxY = 10;
        // Количество точек для отрисовки
        private const int PointNumber = 200000;
        // Массив коэффциентов вероятностей
        private float[] _probability = new float[4]
        {
            0.01f,
            0.06f,
            0.08f,
            0.85f
        };
        // Матрица коэффициентов
        private float[,] _funcCoef = new float[4, 6]
        {
            //a      b       c      d      e  f
            {0,      0,      0,     0.16f, 0, 0   }, // 1 функция
            {-0.15f, 0.28f,  0.26f, 0.24f, 0, 0.44f},// 2 функция
            {0.2f,  -0.26f,  0.23f, 0.22f, 0, 1.6f}, // 3 функция
            {0.85f,  0.04f, -0.04f, 0.85f, 0, 1.6f}  // 4 функция
        };
 
        // коэффициент масштабируемости высоты и ширины
        // изображения фрактала для высоты и ширины нашей формы
        private int _width;
        private int _height;
        // Bitmap для папоротника
        private Bitmap _fern;
        // используем для отрисовки на PictureBox
        private Graphics _graph;
 
        public Form1()
        {
            InitializeComponent();
 
            // вычисляем коэффициент
            _width = (int)(FernPictureBox.Width/(MaxX - MinX));
            _height = (int)(FernPictureBox.Height/(MaxY - MinY));
            // создаем Bitmap для папоротника
            _fern = new Bitmap(FernPictureBox.Width, FernPictureBox.Height);
            // cоздаем новый объект Graphics из указанного Bitmap
            _graph = Graphics.FromImage(_fern);
            // устанавливаем фон
            _graph.Clear(Color.Black);
 
            DrawFern();
        }
 
        private void DrawFern()
        {
            Random rnd = new Random();
            // будем начинать рисовать с точки (0, 0)
            float xtemp = 0, ytemp = 0;
            // переменная хранения номера функции для вычисления следующей точки
            int numF = 0;
 
            for (int i = 1; i <= PointNumber; i++)
            {
                // рандомное число от 0 до 1
                var num = rnd.NextDouble();
                // проверяем какой функцией воспользуемся для вычисления следующей точки
                for (int j = 0; j <= 3; j++)
                {
                    // если рандомное число оказалось меньше или равно
                    // заданного коэффициента вероятности,
                    // задаем номер функции
                    num = num - _probability[j];
                    if (num <= 0)
                    {
                        numF = j;
                        break;
                    }
                }
 
                // вычисляем координаты
                var x = _funcCoef[numF, 0] * xtemp + _funcCoef[numF, 1] * ytemp + _funcCoef[numF, 4];
                var y = _funcCoef[numF, 2] * xtemp + _funcCoef[numF, 3] * ytemp + _funcCoef[numF, 5];
 
                // сохраняем значения для следующей итерации
                xtemp = x;
                ytemp = y;
                // вычисляем значение пикселя
                x = (int)(xtemp * _width + FernPictureBox.Width / 2);
                y = (int)(ytemp * _height);
                // устанавливаем пиксель в Bitmap
                _fern.SetPixel((int)x, (int)y, Color.LawnGreen);
            }
            // Отображаем результат
            FernPictureBox.BackgroundImage = _fern;
        }
    }   
}

Прикрепленный файлРазмер
FernFractal.zip56.84 кб