Кривая Серпинского (фракталы) - C#
Формулировка задачи:
Добрый вечер! Необходимо сделать построение кривой Серпинского. Написал код, однако строит только 1/4 кривой (см. фото). Что необходимо подправить в коде? Помогите, пожалуйста!
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace HilbertLines_Halilova { public partial class Form1 : Form { public Form1() { InitializeComponent(); } int p = 4; //порядок кривой int lx = 5, ly = 5; //определяем значения, дающие направление,в котором должна рисоваться кривая //Графический курсор устанавливаем в начальную точку int X = 50, Y = 50; // Функция DrawPart рисует линию из точки (X,Y) к новой точке и сохраняет координаты точки в переменных X и Y. private void DrawPart(Graphics g, int lx, int ly) { g.DrawLine(Pens.Black, X, Y, X + lx, Y + ly); X = X + lx; Y = Y + ly; } // Кривую Гильберта можно получить путем // соединения элементов а,b,с и d. // Каждый элемент строит // соответствующая функция. // Рекурсивно берем четыре маленькие кривые Гильберта и соединяем их линиями. // Процедуры рисования четырех разновидностей кривых Гильберта(направленных в разные стороны) void a(int i, Graphics g) { if (i > 0) { a(i - 1, g); //От последней точки проводится вниз отрезок длиной 5 пикселей DrawPart(g, 0, ly); b(i - 1, g); //От последней точки проводится вправо отрезок длиной 5 пикселей DrawPart(g, +lx, 0); //От последней точки проводится вниз отрезок длиной 5 пикселей DrawPart(g, 0, ly); d(i - 1, g); //От последней точки проводится вправо отрезок длиной 5 пикселей DrawPart(g, +lx, 0); a(i - 1, g); } } void b(int i, Graphics g) { if (i > 0) { b(i - 1, g); //От последней точки проводится влево отрезок длиной 5 пикселей DrawPart(g, -lx, 0); c(i - 1, g); //От последней точки проводится вниз отрезок длиной 5 пикселей DrawPart(g, 0, ly); //От последней точки проводится влево отрезок длиной 5 пикселей DrawPart(g, -lx, 0); a(i - 1, g); //От последней точки проводится вниз отрезок длиной 5 пикселей DrawPart(g, 0, ly); b(i - 1, g); } } void c(int i, Graphics g) { if (i > 0) { c(i - 1, g); //От последней точки проводится вверх отрезок длиной 5 пикселей DrawPart(g, 0, -ly); d(i - 1, g); //От последней точки проводится влево отрезок длиной 5 пикселей DrawPart(g, -lx, 0); //От последней точки проводится вверх отрезок длиной 5 пикселей DrawPart(g, 0, -ly); b(i - 1, g); //От последней точки проводится влево отрезок длиной 5 пикселей DrawPart(g, -lx, 0); c(i - 1, g); } } void d(int i, Graphics g) { if (i > 0) { d(i - 1, g); //От последней точки проводится вправо отрезок длиной 5 пикселей DrawPart(g, +lx, 0); a(i - 1, g); //От последней точки проводится вверх отрезок длиной 5 пикселей DrawPart(g, 0, -ly); //От последней точки проводится вправо отрезок длиной 5 пикселей DrawPart(g, lx, 0); c(i - 1, g); //От последней точки проводится вверх отрезок длиной 5 пикселей DrawPart(g, 0, -ly); d(i - 1, g); } } // по нажатию кнопики Draw будут рисоваться кривые private void Draw(object sender, EventArgs e) { //Объявляем объект "g" класса Graphics и предоставляем //ему возможность рисования на pictureBox1: Graphics g = Graphics.FromHwnd(pictureBox1.Handle); //вызываем функцию рисования фрактала a(p, g); } private void pictureBox1_Click(object sender, EventArgs e) { } } }
Решение задачи: «Кривая Серпинского (фракталы)»
textual
Листинг программы
private void button1_Click(object sender, EventArgs e) { //Объявляем объект "g" класса Graphics и предоставляем //ему возможность рисования на pictureBox1: Graphics g = Graphics.FromHwnd(pictureBox1.Handle); //вызываем функцию рисования фрактала a(p, g); DrawPart(g, 0, ly); b(p, g); DrawPart(g, -lx, 0); c(p, g); DrawPart(g, 0, -ly); d(p, g); DrawPart(g, lx, 0); }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д