Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.98/50: Рейтинг темы: голосов - 50, средняя оценка - 4.98
0 / 0 / 0
Регистрация: 30.03.2014
Сообщений: 25

Множество Мандельброта - как сделать масштабирование

24.05.2014, 21:11. Показов 9735. Ответов 33
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, пишу программу, строящую множество Мандельброта на C#.
Написал основную часть, построил фрактал, не могу разобраться как сделать масштабирование, помогите пожалуйста.
Вот код, который есть:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
namespace Fractal
{
    public partial class Form1 : Form
    {
        Graphics Gr;
        Pen pen = new Pen(Color.Green);
 
        protected decimal q_1 = 3m, w = -2m, e = -1.5m, koef = 0.5m, x_m, y_m, x_n, y_n, p, q, x_0, y_0, x_2, y_2;
        
        public Form1()
        {
            this.InitializeComponent();
            Bitmap flag = new Bitmap(pictureBox1.Width, pictureBox1.Height);             
            pictureBox1.Image = flag;           
            this.Gr = Graphics.FromImage(this.pictureBox1.Image);
        }
 
        public void Pixel(Graphics g, int x, int y)
        {
            g.DrawLine(pen, x, y, x+1, y+1);           
        }
 
        public void Draw_Fractal_Alg()
        {
 
            int i,j,k;
 
            int wid, hei;
 
            wid = this.pictureBox1.Width;
            hei = this.pictureBox1.Height;
 
            for(j=1; j<wid; j++)
            {
 
                 p = w + j * (q_1 / wid);
 
                for(k=1; k<=hei; k++)
                {
 
                    q = k * (q_1 / hei) + e;
 
                    x_n = 0;
 
                    y_n = 0;
 
                    for (i = 1; i <= 110; i++)
                    {
 
                        x_0 = x_n;
 
                        y_0 = y_n;
 
                        x_2 = x_n * x_n;
 
                        y_2 = y_n * y_n;
 
                        x_n = x_2 - y_2 + p;
 
                        y_n = 2 * x_0 * y_n + q;
 
                        if (x_2 + y_2 > 4)
                        {
                            pen.Color = Color.FromArgb(255, 255, 255);
                            Pixel(Gr, wid - j, k);
                            break;
                        }
 
                    }
 
                    if (i > 99)
                    {
                        pen.Color = Color.FromArgb(i + 50, i + 100, i + 140);
                        Pixel(Gr,wid-j,k);
                    }
 
                }
                this.pictureBox1.Refresh();
            }
            this.pictureBox1.Refresh();
            MessageBox.Show("Построение закончено");
        }
 private void button1_Click(object sender, EventArgs e)
        {
            Draw_Fractal_Alg();
        }
 
        private void pictureBox1_MouseClick(object sender, MouseEventArgs e)
        {
            MessageBox.Show("x="+e.X.ToString()+" y="+e.Y.ToString());
            x_m = (decimal) e.X;
            y_m = (decimal) e.Y;
        }
    }
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.05.2014, 21:11
Ответы с готовыми решениями:

Масштабирование фрактала Мандельброта
Помогите, пожалуйста, есть программа рисующая фрактал Мандельброта, которое выполняет масштабирование, там используются комплексные числа. ...

Рассчитывать множество Мандельброта с помощью GPU
Хочу быстро рассчитывать множество Мандельброта с помощью GPU, но опыта работы с OpenCL нет. Быстренько набросал код, но возникает ошибка...

Интерпретатор brainfuck не строит множество Мандельброта
Здравствуйте! Написал интерпретатор brainfuck, простые программы исполняются верно. Но при попытке вывести множество Мандельброта (код не...

33
0 / 0 / 0
Регистрация: 30.03.2014
Сообщений: 25
25.05.2014, 00:48  [ТС]
Студворк — интернет-сервис помощи студентам
rRczZZ, я бы не отказался от любой помощи, потому как язык как можно понять я не знаю, приходится учить наскоком, что не есть хорошо, а совет взять не у кого и сроки поджимают. Так что буду премного благодарен за любую помощь
0
101 / 101 / 15
Регистрация: 23.05.2012
Сообщений: 260
25.05.2014, 00:57
Лучший ответ Сообщение было отмечено Distatic как решение

Решение

НУ вот смотри это твоя с Decimal форма
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
public partial class Form1 : Form
    {
        Bitmap flag;
        Color color;
        Size size;
 
        Decimal SizeArea;
        Decimal CenterX, CenterY;
        Decimal ScaleArea;
 
        public Form1()
        {
            this.InitializeComponent();
 
            flag = new Bitmap(pictureBox1.Width, pictureBox1.Height);
            pictureBox1.Image = flag;
            color = new Color();
            size = pictureBox1.Size;
 
            CenterX = -0.5m;
            CenterY = 0;
            SizeArea = 3;
            ScaleArea = 3;
        }
 
        public void Draw_Fractal_Alg()
        {
            flag = new Bitmap(pictureBox1.Width, pictureBox1.Height);
            pictureBox1.Image = flag;
            size = pictureBox1.Size;
 
            Complex Z;
            Complex Z0;
            Complex C;
 
            int i, x, y;
 
            for (x = 1; x < size.Width; x++)
            {
                for (y = 1; y < size.Height; y++)
                {
                    C = new Complex(
                        (CenterX - SizeArea / 2) + x * (SizeArea / size.Width),
                        (CenterY - SizeArea / 2) + y * (SizeArea / size.Height));
                    Z = new Complex();
 
                    for (i = 1; i <= 110; i++)
                    {
                        Z0 = Z;
                        Z = Z0 * Z0 + C;
 
                        if (Z.MagnitudeSQ > 4)
                        {
                            color = Color.FromArgb(255, 255, 255);
                            flag.SetPixel(x, y, color);
                            break;
                        }
                    }
 
                    if (i > 99)
                    {
                        color = Color.FromArgb(i + 50, i + 100, i + 140);
                        flag.SetPixel(x, y, color);
                    }
                }
                this.pictureBox1.Refresh();
            }
            this.pictureBox1.Refresh();
            MessageBox.Show("Построение закончено");
        }
        private void button1_Click(object sender, EventArgs e)
        {
            Draw_Fractal_Alg();
        }
 
        private void pictureBox1_MouseClick(object sender, MouseEventArgs e)
        {
            int X = e.X,
                Y = e.Y;
            switch (e.Button)
            {
                case MouseButtons.Left:
                    CenterX = (CenterX - SizeArea / 2) + X * (SizeArea / size.Width);
                    CenterY = (CenterY - SizeArea / 2) + Y * (SizeArea / size.Height);
                    SizeArea /= ScaleArea;                    
                    Draw_Fractal_Alg();
                    break;
                case MouseButtons.Middle:
                    CenterX = -0.5m;
                    CenterY = 0;
                    SizeArea = 3;
                    ScaleArea = 3;
                    Draw_Fractal_Alg();
                    break;
                case MouseButtons.Right: 
                    CenterX = (CenterX - SizeArea / 2) + X * (SizeArea / size.Width);
                    CenterY = (CenterY - SizeArea / 2) + Y * (SizeArea / size.Height);
                    SizeArea *= ScaleArea;
                    Draw_Fractal_Alg();
                    break;
                default:
                    break;
            }
        }
    }
И не знаю какой у тебя фреймворк в System.Numeric есть класс Complex но с 4.0
Поэтому пусть будет самописный
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
public class Complex
    {
        public Decimal X { get; set; }
        public Decimal Y { get; set; }
 
        public Decimal MagnitudeSQ
        {
            get
            {
                return X * X + Y * Y;
            }
        }
 
        public Complex()
        {
            X = 0;
            Y = 0;
        }
 
        public Complex(Decimal x, Decimal y)
        {
            X = x;
            Y = y;
        }
 
        public Complex(Complex C)
        {
            X = C.X;
            Y = C.Y;
        }
 
        public static Complex operator +(Complex c1, Complex c2)
        {
            return new Complex(c1.X + c2.X, c1.Y + c2.Y);
        }
 
        public static Complex operator *(Complex c1, Complex c2)
        {
            return new Complex(c1.X * c2.X - c1.Y * c2.Y, c1.X * c2.Y + c2.X * c1.Y);
        }
    }
Добавлено через 58 секунд
rRczZZ Не надо завидовать
Можешь помоги

А у людей есть и свои дела правда?

Добавлено через 5 минут
Distatiс в целом оставил твой проект только причесал его
переменные w и e заменил на центр картинки
q_1 это точь в точь SizeArea т.е размер изначально 3х3
ScaleArea это во сколько раз будет увеличиваться или уменьшаться масштаб

Там на левую кнопку увеличить
на правую уменьшить
Но т.к. rRczZZ торопит то ... картинка смещается ведь изменяется центр поэтому на среднюю вернуть к исходному сосоянию

Добавлено через 17 секунд
Если возникнут вопросы спрашивай
2
814 / 422 / 169
Регистрация: 08.02.2013
Сообщений: 711
25.05.2014, 01:04
DPW, я никого не тороплю успокойся
0
0 / 0 / 0
Регистрация: 30.03.2014
Сообщений: 25
25.05.2014, 01:05  [ТС]
DPW, с ума сойти, спасибо огромное, даже больше, чем я просил.
Позволю себе еще пару вопросов по этой теме:
1. я слышал про так называемый резиновый тип данных в C# он существует? могли бы Вы дать мне наводку на него, никак не могу найти.
2. каким образом можно сделать разные цвета в зависимости от "глубины" значения? пробовал делать в зависимости от итерации, но цвет почему-то все равно один.
А по коду все понятно, жаль что сам я пока до таких вещей не дорос.
0
101 / 101 / 15
Регистрация: 23.05.2012
Сообщений: 260
25.05.2014, 01:10
Цитата Сообщение от Distatic Посмотреть сообщение
резиновый тип данных
Не очень понял о чем ты если это про массивы с меняющимся размером то пожалуйста
ArrayList а вообще просто List<T>

У тебя цвет формируется линейно по каждому надо цветоделалку править
там творчество как хочешь от туда и разные цветные картинки
Ну вот допустим вразноход сча скину
0
0 / 0 / 0
Регистрация: 30.03.2014
Сообщений: 25
25.05.2014, 01:11  [ТС]
DPW, я имел ввиду тип данных как тот же самый decimal, но больше, пока оператива не кончится, в decimal же нельзя слишком малые значения записывать и слишком большие, если я ничего не путаю
0
101 / 101 / 15
Регистрация: 23.05.2012
Сообщений: 260
25.05.2014, 01:47
Лучший ответ Сообщение было отмечено Distatic как решение

Решение

Смотри если заменить на рисовалку

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
for (i = 1; i <= 110; i++)
                    {
                        Z0 = Z;
                        Z = Z0 * Z0 + C;
 
                        if (Z.MagnitudeSQ > 4)
                        {
                            break;
                        }
                    }
if (i >110)
                    {
                        color = Color.FromArgb(0, 0, 0);
                    }
                    else
                    {
                        int R =255-2*i;
                        int G = 5; ;
                        int B=2*i;
                        color = Color.FromArgb(R, G, B);
                    }
                    flag.SetPixel(x, y, color);
то все где точка застряла она будет черной а дальше экспериментируй с RGB
Фон это когда считай i=0

и еще если чуть выше заменить

C#
1
2
3
4
5
6
7
8
9
Z = new Complex(
                        (CenterX - SizeArea / 2) + x * (SizeArea / size.Width),
                        (CenterY - SizeArea / 2) + y * (SizeArea / size.Height));
                    C = new Complex(0.33m, 0.05m);
 
                    //C = new Complex(
                    //    (CenterX - SizeArea / 2) + x * (SizeArea / size.Width),
                    //    (CenterY - SizeArea / 2) + y * (SizeArea / size.Height));
                    //Z = new Complex();
То получишь множество жулиа т.е. перебираться будет не С а Z
с - остается фиксированной при этом выбирая разные параметры для С получишь разные картинки
Только сильно в разброс не иди

Жулиа они и по-красивше будут

Добавлено через 5 минут
про резину - нет такие только рукописные
но они не нужны
Тебе любой препод физик должен был объяснить что такое погрешность
Например
Представь что ты метровой палкой меряешь дачу - ну можно
А стерку?
100+ 0.005 все равно 100 т.к. эти мелочи несущественны
поэтому пользуются Float или Double
Хотя есть маленький баг с потерей единички в мантисе если это важно то тип Decimal умеет грамотно округлять чтоб грубо говоря 1/3*3 не получалось 0.99999
2
0 / 0 / 0
Регистрация: 30.03.2014
Сообщений: 25
25.05.2014, 01:50  [ТС]
DPW, спасибо, а Жюлиа они ведь и по контору так и так идут)
А про погрешности естественно в курсе, препод считает, что от этого как-то будет зависеть быстродействие алгоритма, он далек от программирования, онли псевдокод и то не в лучшем виде)
Спасибо огромное за помощь, выручил не то слово.
0
101 / 101 / 15
Регистрация: 23.05.2012
Сообщений: 260
25.05.2014, 02:02
Ну значит никак

да по контуру но
C#
1
Z = Z0 * Z0 + C
меняй как хочешь ...
добро пожаловать в мир фракталов

C = new Complex(-0.74543m, 0.11301m);

для жулия тоже ничего
1
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
25.05.2014, 04:26
Distatic, гугл + полчаса кодинга = результат
Вложения
Тип файла: rar WindowsFormsApplication3.rar (31.2 Кб, 59 просмотров)
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
25.05.2014, 04:42
Черно-белый вариант:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
public static class Malderbrot
    {
        public static int Max { get; set; }
 
        static Malderbrot()
        {
            Max = 100;
        }
        public static Bitmap Draw(Size size)
        {
            var bmp = new Bitmap(size.Width, size.Height);
            int[,] map = GetMap(size);
            var max = map.Cast<int>().Max();
            for (int i = 0; i < map.GetLength(0); i++)
            {
                for (int j = 0; j < map.GetLength(1); j++)
                {
                    int a = map[i, j];
                    bmp.SetPixel(i, j, Color.FromArgb(a*255/max, a*255/max, a*255/max));
                }
            }
            return bmp;
        }
 
        private static int[,] GetMap(Size size)
        {
            int[,] result = new int[size.Width, size.Height];
            for (int i = 0; i < size.Width; i++)
                for (int j = 0; j < size.Height; j++)
                {
                    result[i, j] = GetPixel(i, j, size);
                }
            return result;
        }
 
        private static int GetPixel(int px, int py, Size size)
        {
            double x0 = px*3.5/size.Width - 2.5;
            double y0 = py*2.0/size.Height - 1;
            double x = 0, y = 0;
            int iterCount = 0;
            for (; iterCount < Max && x*x+y*y < 2*2; iterCount++)
            {
                var xtemp = x*x - y*y + x0;
                y = 2*x*y + y0;
                x = xtemp;
            }
            return iterCount;
        }
    }
Добавлено через 3 минуты
DPW, поменьше констант используй магических, это плохо выглядит

Добавлено через 11 секунд
А так красавчик, лови плюсы)

Добавлено через 1 минуту
а вот масштабирование провтыкал, надо подумать...
1
101 / 101 / 15
Регистрация: 23.05.2012
Сообщений: 260
25.05.2014, 07:45
Psilon

А константы "магические" так они из масштабирования и повыползали
без претензий на оригинальность и эффективность решил через центр экрана-клик сделать ну и радиус

К тому же раз задание преподское, главное - читабельность
0
0 / 0 / 0
Регистрация: 30.03.2014
Сообщений: 25
02.06.2014, 17:51  [ТС]
Psilon, да, спасибо, но в твоем варианте нет масштабирования, такой вариант я приводил в начале темы)
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
02.06.2014, 19:06
Distatic, с масштабированием был вариант, то он криво работал, поэтому не стал выкладывать Под кривостью я имел ввиду выбор области для увеличения.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.06.2014, 19:06

Множество Мандельброта
Здраствуйте. Мне нужно нарисовать Множество мандельброта в Borland C++ builder. Найденные в гугле исходники, к сожелению, жалуются на...

Множество Мандельброта
Здравствуйте! Помогите пожалуйста сделать в PascalABC Множество Мандельброта

Множество Мандельброта
Необходимо написать программу выполняющую построение фрагтала Мондельброта задающегося следующимися формулами: Zj+1 = Zj^2 + C j = 1,...

Множество Мандельброта
У меня есть исходник, множество Мандельброта рисует на КАНВЕ. Как мне сделать его ПРОГРЕССИВНОЕ построение, подключить потоки? И...

Множество Мандельброта. Perturbation Theory
http://www.superfractalthing.co.nf/sft_maths.pdf Помогите построить множество по этой формуле. Заготовка есть, да только формулу как...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
34
Ответ Создать тему
Новые блоги и статьи
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru