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

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

15.10.2014, 15:08. Показов 2514. Ответов 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

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Миниатюры
Как нарисовать фрактал "Крест Ньютона"?   Как нарисовать фрактал "Крест Ньютона"?  
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.10.2014, 15:08
Ответы с готовыми решениями:

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

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

Цель - при нажатии на кнопку создать еще одну кнопку. Ошибка "Button" не содержит определения для "Location" и "Text""
int Control ; private void Button2_Click(object sender, RoutedEventArgs e) {...

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

2
8314 / 4537 / 1772
Регистрация: 11.02.2013
Сообщений: 9,614
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
Миниатюры
Как нарисовать фрактал "Крест Ньютона"?  
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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.10.2014, 22:37

Выдает ошибку - "Не удалось привести тип объекта "TheMaze.FormLevel1" к типу "System.Windows.Forms.Label"."
Ругается вот на эту строчку: ((Label)sender).Visible = false; Вот код: using System; using...

Ошибка после конвертации метода на С++ к С#: "Неявное преобразование типа "int" в "bool" невозможно"
Ошибка после преобразования метода на С++ к С#: &quot;Неявное преобразование типа &quot;int&quot; в &quot;bool&quot;...

Текстовый файл. строка с 3 "объектами" разделенные разделителем "," как обратиться к каждому из объектов?
Всем добрый день. Имеется текстовый файл. содержимое: более 31.000 строк. каждая строка...

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


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

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

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