Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Соколиный глаз
C#
224 / 164 / 113
Регистрация: 25.07.2014
Сообщений: 3,118
Записей в блоге: 10
Завершенные тесты: 2
1

Кривая Госпера

16.09.2017, 21:09. Просмотров 326. Ответов 1
Метки нет (Все метки)

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
using System;
using System.Drawing;
using System.Windows.Forms;
*
namespace Gosper_curve
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        Graphics g;
        Pen pen = new Pen(Color.Black);
*
        void Draw(double x, double y, double l, double u, int t, int q)
        {
            // начало построения ломанных
            if (t > 0)
            {
                if (q == 1)
                {
                    //формулы построения
                    x += l * Math.Cos(u);
                    y -= l * Math.Sin(u);
                    u += Math.PI;
                }
                u -= 2 * Math.PI / 19;//соединение линий
                l /= Math.Sqrt(7); //масштаб
                //функции рисования
                Paint(ref x, ref y, l, u, t - 1, 0);
                Paint(ref x, ref y, l, u + Math.PI / 3, t - 1, 1);
                Paint(ref x, ref y, l, u + Math.PI, t - 1, 1);
                Paint(ref x, ref y, l, u + 2 * Math.PI / 3, t - 1, 0);
                Paint(ref x, ref y, l, u, t - 1, 0);
                Paint(ref x, ref y, l, u, t - 1, 0);
                Paint(ref x, ref y, l, u - Math.PI / 3, t - 1, 1);
            }
            else g.DrawLine(pen, (float)Math.Round(x), (float)Math.Round(y), (float)Math.Round(x + Math.Cos(u) * l), (float)Math.Round(y - Math.Sin(u) * l));
        }
*
        void Paint(ref double x, ref double y, double l, double u, int t, int q)    
        {
            Draw(x, y, l, u, t, q);
            x += l * Math.Cos(u);
            y -= l * Math.Sin(u);
        }
*
        private void button1_Click(object sender, EventArgs e)
        {
            g = Graphics.FromHwnd(pictureBox1.Handle);
            Draw(150, 350, 300, 0, 3, 0);
        }
    }
}
Вы могли бы помочь понять сам алгоритм построения этой кривой? Желательно, прокомментировать код (описать для чего нужны параметры функций тоже не помешало бы).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.09.2017, 21:09
Ответы с готовыми решениями:

Кривая Серпинского (фракталы)
Добрый вечер! Необходимо сделать построение кривой Серпинского. Написал код, однако строит только...

Кривая Безье: нужно, чтобы было не 4 точки а 7
нужно переделать чтобы было не 4 точки а 7, не могу не как переделать, помогите пожалуйста using...

Кривая расстановка указателей при удалении элемента из очереди
При заполнении и просмотре всё работает в обоих направлениях, но после удаления элементов( которые...

Кривая Гильберта: чем заменить Canvas в примере на Delphi
Добрый всем день. есть код в дельфи для проги кривой Гильберта procedure a(i:integer; canvas:...

Кривая Серпинского: как строить линии и что использовать для рисования
Дали мне курсовую "Кривые Серпинского" и условие, что будет написано на C#.А я в C# работаю всего...

1
Aael
394 / 296 / 170
Регистрация: 02.06.2016
Сообщений: 516
Завершенные тесты: 1
17.09.2017, 04:09 2
Volobuev Ilya, возьми систему Линденмайера из википедии, она понятнее будет
попроще
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 partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }
 
    protected override void OnPaint(PaintEventArgs e)
    {
        e.Graphics.TranslateTransform(230, 100);
        Draw(e.Graphics, "A", 3, 60, new Dictionary<char, string>()
        {
            ['A'] = "A-B--B+A++AA+B-",
            ['B'] = "+A-BB--B-A++A+B"
        });
    }
 
    void Draw(Graphics g, string rule, int level, int angle, Dictionary<char, string> rules)
    {
        // Если дошли до нулевого уровня то рисуем линию и выходим
        if (level < 0)
        {
            g.DrawLine(Pens.Black, 0, 0, 0, 10);
            g.TranslateTransform(0, 10);
            return;
        }
 
        // Иначе, следуя правилу,
        foreach (var r in rule)
        {
            switch(r)
            {
                // поворачиваемся
                case '-': g.RotateTransform(+angle); break;
                case '+': g.RotateTransform(-angle); break;
                // или рекурсивно запускаем отрисовку правила из словаря
                default: Draw(g, rules[r], level - 1, angle, rules); break;
            }
        }
    }
}
посложнее (адаптивный размер и нет лишних вычислений)
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
public partial class Form1 : Form
{
    LFractal Fractal;
 
    public Form1()
    {
        InitializeComponent();
        SetStyle(ControlStyles.ResizeRedraw, true);
 
        // задаем фрактал L-системой
        Fractal = new LFractal("A", (float)Math.PI / 3, new Dictionary<char, string>()
        {
            ['A'] = "A-B--B+A++AA+B-",
            ['B'] = "+A-BB--B-A++A+B"
        });
 
        // строим фрактал (тут указвается глубина)
        Fractal.Draw(4);
    }
 
    protected override void OnPaint(PaintEventArgs e)
    {
        if (Fractal.Path == null) return;
        var g = e.Graphics;
 
        // вычисляем размеры фрактала и масштаб, чтобы он вписался в окно
        var rect = Fractal.Path.GetBounds();
        var scale = Math.Min(
            (ClientSize.Width - 50) / rect.Width,
            (ClientSize.Height - 50) / rect.Height);
 
        // Перемещаем (0, 0) в центр окна и устанавливаем масштаб
        e.Graphics.TranslateTransform(ClientSize.Width / 2, ClientSize.Height / 2);
        e.Graphics.ScaleTransform(scale, scale);
        e.Graphics.TranslateTransform(-rect.X - rect.Width / 2, -rect.Y - rect.Height / 2);
 
        // Рисуем фрактал
        e.Graphics.DrawPath(new Pen(Color.Black, 1f / scale), Fractal.Path);
    }
}
 
class LFractal
{
    // координаты отрезков фрактала
    public GraphicsPath Path { get; private set; }
 
    // Правила построения фрактала (из L-системы)
    Dictionary<char, string> Rules;
    string MainRule;
 
    // Текущая точка, направление (куда смотрит черепашка) и величина поворота(если нужно будет повернуться)
    PointF Current;
    float Angle, DeltaAngle;
 
    public LFractal(string MainRule, float DeltaAngle, Dictionary<char, string> Rules)
    {
        this.DeltaAngle = DeltaAngle;
        this.MainRule = MainRule;
        this.Rules = Rules;
    }
 
    // Начинает рисовать фрактал с главного правила
    public void Draw(int Level, float Angle = 0)
    {
        this.Angle = Angle;
        Current = new PointF(0, 0);
        Path = new GraphicsPath();
        Draw(MainRule, Level);
    }
 
    // Отрисовка любого правила
    private void Draw(string Rule, int Level)
    {
        // Если дошлии до нулевого уровня фрактала
        // то рисуем отрезок и сдвигемся вдоль него
        if (Level < 0)
        {
            var next = new PointF(
                Current.X + (float)Math.Cos(Angle), 
                Current.Y + (float)Math.Sin(Angle));
 
            Path.AddLine(Current, next);
            Current = next;
            return;
        }
 
        // Если уровень не нулевой, то смотрим на правило
        foreach (var r in Rule)
        {
            switch(r)
            {
                // или поворачиваем черепашку
                case '+': Angle += DeltaAngle; break;
                case '-': Angle -= DeltaAngle; break;
                // или рисуем по правилу из словаря
                default: Draw(Rules[r], Level - 1); break;
            }
        }
    }
}
2
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.09.2017, 04:09

Фрактал, кривая Госпера. Ошибка, видимость переменных. Перевод с Паскаля на VB6
Задача была такая написать программу на VB переведя ее с Pascal ABC. Эта программа рисует фрактал...

Алгоритм Госпера и подсчет завершающих нулевых битов
Есть три вопроса: 1.Реализовать алгоритм Госпера. Множество – одномерный статический массив целых...

Кривая Коха, кривая Серпинского
Добрый вечер. Помогите пожалуйста. Очень срочно нужна готовая программа кривой Коха и кривой...


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

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

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