Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# Windows Forms
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
Nooby1
0 / 0 / 1
Регистрация: 15.05.2013
Сообщений: 32
1

Как нарисовать фрактал "Крест Ньютона"?

15.10.2014, 15:08. Просмотров 1047. Ответов 2
Метки нет (Все метки)

Здравствуйте. По заданию мне нужно нарисовать Крест Ньютона, который выглядит примерно та
У меня получается не особо, увидел как реализовывали на Delphi, но переписанный под 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
public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        struct Complex
        {
            public double x;
            public double y;
        };
        const int iter = 50;
        const double min = 1e-6;
        const double max = 1e+6;
        Graphics g;
        public void Draw(int mx, int my, Pen pen)
        {
            int n;
            double p;
            Complex z, t, d = new Complex();
            for (int y = -my; y < my; y++)
                for (int x = -mx; x < mx; x++)
                {
                    n = 0;
                    z.x = x * 0.005;
                    z.y = y * 0.005;
                    d = z;
                    while ((Math.Pow(z.x, 2) + Math.Pow(z.y, 2) < max) && (Math.Pow(d.x, 2) + Math.Pow(d.y, 2) > min) && (n < iter))
                    {
                        t = z;
                        p = Math.Pow(Math.Pow(t.x, 2) + Math.Pow(t.y, 2), 2);
                        z.x = 2 / 3 * t.x + (Math.Pow(t.x, 2) - Math.Pow(t.y, 2)) / (3 * p);
                        z.y = 2 / 3 * t.y * (1 - t.x / p);
                        d.x = Math.Abs(t.x - z.x);
                        d.y = Math.Abs(t.y - z.y);
                        n++;
                    }
                    pen.Color = Color.FromArgb(255, (n * 9) % 255, 0, (n * 9) % 255);
                    g.DrawLine(pen, mx + x, my + y, mx + x + 1, my + y);
                }
        }
        private void button1_Click(object sender, EventArgs e)
        {
            g = pictureBox1.CreateGraphics();
            Draw(300, 300, new Pen(Color.Red));
        }
 
    }
Слева фрактал, который должен быть, справа - который на данный момент рисует программа.
0
Миниатюры
Как нарисовать фрактал "Крест Ньютона"?   Как нарисовать фрактал "Крест Ньютона"?  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.10.2014, 15:08
Ответы с готовыми решениями:

Как исправить "преобразование типа из "string" в "System.Net.IPEndPoint" невозможно"?
Здравствуйте, не могу отправить массив байт, может кто-то знает как правильно...

Фрактал Ньютона
Переписал код построения фрактала Ньютона, но что-то рисует он совсем те то,...

Классы "Работник", "Календарь", "Оплата труда за месяц". Вывод табеля рабочего времени сотрудника
1. Реализовать класс работник, у класса свойства фамилия (строка), имя...

Как исправить ошибку «Не удается преобразовать из "System.Windows.Forms.TextBox" в "bool"?
Функция: Proxy.Set(new WebProxy(&quot;ip адрес&quot;, порт)); Хочу сделать что бы...

Как можно описать классы "ячейка" и "предмет" для игры типа RPG
Помогите представить то, как можно написать инвентарь и предмет. Допустим я...

2
ViterAlex
6822 / 3797 / 1552
Регистрация: 11.02.2013
Сообщений: 8,343
Завершенные тесты: 3
15.10.2014, 22:30 2
Ну пока что результат не такой, как на картинке, но хоть что-то для начала пусть будет. Мне не совсем понятно условие прерывания цикла, но сделал насколько понял.
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
106
107
108
109
110
111
112
113
114
115
116
117
using System;
using System.Drawing;
using System.Windows.Forms;
 
namespace NewtonsFractal {
    public partial class Form1 : Form {
        Complex z;
        Bitmap bmp;
        double xMin = -1, xMax = 1, yMin = -1, yMax = 1;
        const double EPS = 1E-5;
 
        public Form1() {
            InitializeComponent();
            pictureBox1.Paint += pictureBox1_Paint;
        }
 
        void pictureBox1_Paint(object sender, PaintEventArgs e) {
            if (bmp == null) return;
            e.Graphics.DrawImage(bmp, 0, 0);
        }
        void Draw(int width, int height) {
            bmp = new Bitmap(width, height);
            double xStep = (xMax - xMin) / width, yStep = (yMax - yMin) / height;
            int iter = 0, opacity = 255;
            z.Re = xMin;
            for (int x = 0; x < width; x++) {
                z.Im = yMin;
                for (int y = 0; y < height; y++) {
                    iter = Calc(z);
                    opacity = iter <= 2 ? 255 : (int)(255 * (iter - 2) / iter);
                    bmp.SetPixel(x, y, Color.FromArgb(opacity, 255, 0, 0));
                    z.Im += yStep;
                }
                z.Re += xStep;
            }
        }
        int Calc(Complex z) {
            int iter = 0;
            while (Math.Pow((z.Pow(4) - 1).Abs, 2) > EPS) {
                z = (3 * z.Pow(4) + 1) / (4 * z.Pow(3));
                iter++;
            }
            return iter;
        }
 
        private void button1_Click(object sender, EventArgs e) {
            Draw(pictureBox1.ClientSize.Width, pictureBox1.ClientSize.Height);
            pictureBox1.Refresh();
        }
    }
 
    struct Complex {
        public double Re;
        public double Im;
        #region Операторы
        public static Complex operator -(Complex a, Complex b) {
            Complex c;
            c.Re = a.Re - b.Re;
            c.Im = a.Im - b.Im;
            return c;
        }
        public static Complex operator +(Complex a, Complex b) {
            Complex c;
            c.Re = a.Re + b.Re;
            c.Im = a.Im + b.Im;
            return c;
        }
        public static Complex operator -(Complex a, int b) {
            Complex c;
            c.Re = a.Re - b;
            c.Im = 0;
            return a - c;
        }
        public static Complex operator +(Complex a, int b) {
            Complex c;
            c.Re = a.Re + b;
            c.Im = 0;
            return a + c;
        }
        public static Complex operator *(Complex a, Complex b) {
            Complex c;
            c.Re = a.Re * b.Re - a.Im * b.Im;
            c.Im = a.Im * b.Re + a.Re * b.Im;
            return c;
        }
        public static Complex operator *(int b, Complex a) {
            Complex c;
            c.Re = a.Re * b;
            c.Im = a.Im * b;
            return c;
        }
        public static Complex operator /(Complex a, Complex b) {
            Complex c;
            c.Re = (a.Re * b.Re + a.Im * b.Im) / (Math.Pow(b.Re, 2) + Math.Pow(b.Im, 2));
            c.Im = (a.Im * b.Re - a.Re * b.Im) / (Math.Pow(b.Re, 2) + Math.Pow(b.Im, 2));
            return c;
        }
        #endregion
        public Complex Pow(int n) {
            Complex c;
            c = this;
 
            for (int i = 0; i < n; i++)
                c = c * c;
 
            return c;
        }
        public Double Abs {
            get {
                return Math.Sqrt(Math.Pow(this.Re, 2) + Math.Pow(this.Im, 2));
            }
        }
        public override string ToString() {
            return string.Format("{0:g}{1}{2:g}i", this.Re, this.Im < 0 ? "-" : "+", Math.Abs(this.Im));
        }
    }
}
0
Миниатюры
Как нарисовать фрактал "Крест Ньютона"?  
Nooby1
0 / 0 / 1
Регистрация: 15.05.2013
Сообщений: 32
15.10.2014, 22:37  [ТС] 3
Очень интересно! Я в данный момент тоже всё ещё работаю, написал класс комплексных чисел для простоты, и мне абсолютно так же непонятен эпсилон в условии прерывания. Так или иначе, конечным результатом должно стать подобие левого рисунка в топик посте

Добавлено через 4 минуты
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
public void Draw(int mx, int my, Pen pen)
        {
            int n;
            Complex  t, d = new Complex();
            Complex z = new Complex();
            for (int y = -my; y < my; y++)
                for (int x = -mx; x < mx; x++)
                {
                    n = 0;
                    z.x = x * 0.005;
                    z.y = y * 0.005;
                    double module=0;
                    while ((n<255)  && (module<epsilon))
                    {
                        t = z;
                        Complex z4 = t * t * t * t;
                        Complex z3 = t * t * t;
                        z = (3 * z4 + 1) / (4 * z3);         
                        n++;
                        d = z * z * z * z-1;
                        module = Complex.abs(d) * Complex.abs(d);
                    }
                    pen.Color = Color.FromArgb(255, (n * 9) % 255, 0, (n * 9) % 255);
                    g.DrawLine(pen, mx + x, my + y, mx + x + 1, my + y);
                }
        }
С этим кодом рисует совсем уж какую то вакханалию )
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.10.2014, 22:37

"System.Windows.Forms.Application" не содержит определение для "Current". Как исправить?
Вот такая функция есть, для добавления строк текста в textBox3(windows form) ...

Как вырезать часть текста из документа что начинается с "qwerty" и заканчивается "qwerty1"?
Нужна помощь, нкжно вырезать часть текста из док что начинается с &quot;qwerty&quot; и...

Как запретить использовать клавиши масштабирования и "Ctrl + Колесу прокрутки" и обновления страницы "F5" в WebBrowser - е ?
Как запретить использовать клавиши масштабирования и &quot;Ctrl + Колесу прокрутки&quot;...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru