Кривая Серпинского (фракталы) - 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);
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 4 из 5
Похожие ответы