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

Фрактал молнии

19.03.2019, 19:47. Показов 2308. Ответов 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
56
57
using System;
using System.Drawing;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Collections.Generic;
using System.Threading;
namespace Project
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private Graphics g;
        private Pen p;
        private void Form1_Load(object sender, EventArgs e)
        {
 
        }
 
 
        List<double> listOfA = new List<double>();
        private void FirstLine(int x, int y, double a, double b)
        {
            g.DrawLine(p, x, y,(int)a,(int)b);
        }
 
 
 
 
        private void Draw(int x, int y, double a, double b, int degrees)
        {
            Random random = new Random();
            var bNew = b;
            var aNew = a;
            listOfA.Add(aNew);
            if (degrees < 7)
            {
                Thread.Sleep(200);
                g.DrawLine(p, x, y, (int)a, (int)b);
                Draw((int)aNew,(int)bNew, (int)(a+random.Next(20,30)), (int)(b+random.Next(20, 30)), degrees+1);
            }
 
                  
        }
 
 
       private void Draaw_Click(object sender, EventArgs e)
       {
           
                g = pictureBox.CreateGraphics();
                p = new Pen(Color.Black);
                g.FillRectangle(Brushes.White, 0, 0, pictureBox.Width, pictureBox.Height);
                Draw(1,1,15,20,1);
       }
}
как можно сделать разлет молний(аля ветки молнии). Пытался через List запоминать конец линии перед разлетам. Но в итоге он рисовал белеберду
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.03.2019, 19:47
Ответы с готовыми решениями:

Стохастический фрактал
помогите, пожалуйста, никак не получается

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

Фрактал «Квадратная спираль»
Помогите нарисовать фрактал, пожалуйста.

Программа не рисует фрактал
Код программы выглядит вот так. Это должно было рисовать круговой фрактал. Помогите найти...

1
384 / 184 / 107
Регистрация: 07.01.2016
Сообщений: 492
19.03.2019, 22:03 2
Лучший ответ Сообщение было отмечено showtime200 как решение

Решение

showtime200, проще создать модель молнии, определить метод ее развития и отрисовки
Кликните здесь для просмотра всего текста
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
    public class Lightning
    {
        static Random rand = new Random(1);
        static float _dMin = 10, _dMax = 25; // параметры сегментов
        static double angleLMin = Math.PI / 3, angleLMax = Math.PI / 2; // углы ответвлений
        static double angleSMin = Math.PI / 18, angleSMax = Math.PI / 9; // углы по одной ветке
        static double _p = 0.5; // вероятность породить новую ветвь
        List<Segment> S { get; set; } = new List<Segment>(); // сегменты в составе молнии
        List<Lightning> L { get; set; } = new List<Lightning>(); // порожденные молнии
        public int Level { get; set; } // уровень порождения
        public Lightning(PointF start, double a0, int level)
        {
            Level = level;
            Add(start, a0);
        }
        double RandomLAngle => Math.Pow(-1, rand.Next(0, 2)) * rand.NextD(angleLMin, angleLMax); // случайный приращение угла при переходе на другую ветку
        double RandomSAngle => Math.Pow(-1, rand.Next(0,2)) * rand.NextD(angleSMin, angleSMax); // случайное приращение угла по ходу ветки
        public void NextStage()
        {
            if (Level == 0) return;
            foreach (var l in L) l.NextStage();
            Add(EndPoint, End.Angle + RandomSAngle); // добавить сегмент
            if (rand.NextDouble() < _p)
            {
                L.Add(new Lightning(EndPoint, End.Angle + RandomLAngle, Level - 1)); // Добавить ветку
            }
        }
        PointF EndPoint => S.Last().End;
        Segment End => S.Last();
        // Добавить новый сегмент
        private void Add(PointF start, double angle)
        {
            float delta = rand.NextF(_dMin, _dMax);
            S.Add(new Segment(start, new PointF(start.X + delta * (float)Math.Cos(angle), start.Y - delta*(float)Math.Sin(angle))));
            Level--;
        }
        public void Draw(Graphics g, Pen p)
        {
            foreach (var s in S) s.Draw(g, p);
            foreach (var l in L) l.Draw(g, p);
        }
    }
    // сегмент
    public class Segment
    {
        public PointF Start { get; set; }
        public PointF End { get; set; }
        public double Angle { get; set; }
        
        public Segment(PointF start, PointF end)
        {
            Start = start;
            End = end;
            Angle = Math.Atan2(Start.Y - End.Y, End.X - Start.X);
        }
        public void Draw(Graphics g, Pen p)
        {
            g.DrawLine(p, Start, End);
        }
    }
    public static class Ext
    {
        public static float NextF(this Random rand, float min, float max)
        {
            return min + (max - min) * (float)rand.NextDouble();
        }
        public static double NextD(this Random rand, double min, double max)
        {
            return min + (max - min) * rand.NextDouble();
        }
    }

а в формах сделать так
C#
1
2
3
4
5
6
7
8
9
10
11
12
        private void Draw(int x, int y, double a, double b, int degrees)
        {
            Random random = new Random();
            int count = 15;
            Lightning l = new Lightning(new PointF(200,0), -Math.PI/2, count);
            while(count-->0)
            {
                l.Draw(g, Pens.Black);
                l.NextStage();
                Thread.Sleep(200);
            }
        }
Миниатюры
Фрактал молнии  
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.03.2019, 22:03

Фрактал. Ошибка KeyNotFoundException
Вот код: public partial class Form1 : Form { public Form1() { ...

Фрактал Герасимова. Фракталы в простых числах
Напишите, пожалуйста, реализацию Фрактала Герасимова

Как нарисовать фрактал "Крест Ньютона"?
Здравствуйте. По заданию мне нужно нарисовать Крест Ньютона, который выглядит примерно та У меня...

Шаровые молнии
Во время битвы Флэш кидает в профессора Зума шаровую молнию. Чтобы создать новую молнию, ему...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru