C#使用递归创建分形

C#使用递归创建分形,c#,recursion,C#,Recursion,尝试在线搜索,但只能找到一些过时的信息。 本质上,我试图编写一个程序,使用递归绘制正方形(和圆形)分形。 对于正方形部分,我尝试在一个字段中绘制一个正方形,然后使用递归将其大小减少50%(大约一半),并将其旋转90度,然后根据用户输入的递归深度重复 诚然,我还没有取得那么大的进步,但希望有人能为我指明正确的方向,因为我正在努力理解如何去做 具体来说,我将创建一个递归函数,该函数将减小正方形的大小,然后将其旋转90度并绘制它 namespace MD2 { public partial c

尝试在线搜索,但只能找到一些过时的信息。 本质上,我试图编写一个程序,使用递归绘制正方形(和圆形)分形。 对于正方形部分,我尝试在一个字段中绘制一个正方形,然后使用递归将其大小减少50%(大约一半),并将其旋转90度,然后根据用户输入的递归深度重复

诚然,我还没有取得那么大的进步,但希望有人能为我指明正确的方向,因为我正在努力理解如何去做

具体来说,我将创建一个递归函数,该函数将减小正方形的大小,然后将其旋转90度并绘制它

namespace MD2
{
    public partial class Form1 : Form
    {
        int recursionDepth;
        bool drawCircle, drawSquare;

        public Form1()
        {
            InitializeComponent();
        }

        private void drawButton_Click(object sender, EventArgs e)
        {
            recursionDepth = int.Parse(textBox1.Text);

            if (drawSquare == true)
            {
                textBox3.Text = "Square is being drawn"; //used for testing pursposes
                DrawRectangle();
            }

            if(drawCircle == true) //used later when something similar to squares will be drawn
            {
                textBox3.Text = "Circles are being drawn";
            }
        }

public void DrawRectangle()
        {
/*/////////////////////////////////////
        Graphics dc = pictureBox1.CreateGraphics();
        Pen myPen = new Pen(Color.Black, 3);
        Point[] points =
    {
                new Point(0, 0),
                new Point(0, 400),
                new Point(0, 400),
                new Point(400,400),
                new Point(400, 0),
                new Point(0,0),
                };
            dc.DrawLines(myPen, points);
    }*///////////////////////////////////

//Two options, either drawing a square or drawing lines that form a square.

            Graphics dc = pictureBox1.CreateGraphics();
            Pen myPen = new Pen(Color.Black, 3);
            int width = 400;
            int height = 400;


            for (int i = 0; i <4; i++) //experimenting with for loops, but recursions would be necessary
            {
                Rectangle rect = new Rectangle(0, 0, width/2, height/2);
                dc.DrawRectangle(myPen, rect);
            }

}

        private void circle_Click(object sender, EventArgs e)
        {
            drawSquare = false;
            drawCircle = true;
            textBox4.Text = "";
            textBox4.Text = "Circle option selected"; //using for testing at this stage
        }


        private void square_Click(object sender, EventArgs e)
        {
            drawCircle = false;
            drawSquare = true;
            textBox4.Text = "";
            textBox4.Text = "Square option selected"; //using for testing at this stage
        }
    }
}
名称空间MD2
{
公共部分类Form1:Form
{
int递归深度;
bool-drawCircle,drawSquare;
公共表格1()
{
初始化组件();
}
私有void drawButton_单击(对象发送者,事件参数e)
{
recursionDepth=int.Parse(textBox1.Text);
如果(drawSquare==true)
{
textBox3.Text=“正在绘制正方形”;//用于测试钱包
DrawRectangle();
}
if(drawCircle==true)//稍后在绘制类似于正方形的图形时使用
{
textBox3.Text=“正在绘制圆”;
}
}
公共空矩形()
{
/*/////////////////////////////////////
Graphics dc=pictureBox1.CreateGraphics();
Pen myPen=新笔(颜色:黑色,3);
点[]点=
{
新点(0,0),
新点(0,400),
新点(0,400),
新点(400400),
新点(400,0),
新点(0,0),
};
dc.抽绳(我的笔,点);
}*///////////////////////////////////
//两个选项,绘制正方形或绘制形成正方形的线。
Graphics dc=pictureBox1.CreateGraphics();
Pen myPen=新笔(颜色:黑色,3);
整数宽度=400;
内部高度=400;

对于(int i=0;i下面的代码演示了如何使用递归函数绘制圆。您需要指定初始状态(第一个圆的中心,每次迭代后新的圆应该小多少)以及递归方法应该终止的时间。如果您忘记程序将因堆栈溢出异常而崩溃

Program.cs

using System;
using System.Windows.Forms;

namespace WindowsFormsApp9
{
    static class Program
    {
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.Run(new Form1());
        }
    }
}
using System;
using System.Drawing;
using System.Windows.Forms;

namespace WindowsFormsApp9
{
    public partial class Form1 : Form
    {
        const int initialRadius = 120; 
        const int centerX = 400; 
        const int centerY = 200;

        const double factor = 0.45; // Factor to determine the size of the next smaller radius

        const int recursionDepth = 5;

        public Form1()
        {
            InitializeComponent();
        }

        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);

            DrawRecursionStage(centerX, centerY, initialRadius, e.Graphics);
        }

        private void DrawRecursionStage(int x, int y, int radius, Graphics g)
        {
            if (IsRecursionDepthReached(radius))
                return;

            DrawCircle(x, y, radius, g);

            int newRadius = (int)(radius * factor);
            DrawRecursionStage(x - radius, y, newRadius, g);
            DrawRecursionStage(x, y - radius, newRadius, g);
            DrawRecursionStage(x + radius, y, newRadius, g);
            DrawRecursionStage(x, y + radius, newRadius, g);
        }

        private void DrawCircle(int x, int y, int radius, Graphics g)
        {
            g.DrawEllipse(Pens.Black, x - radius, y - radius, 2 * radius, 2 * radius);
        }

        private static bool IsRecursionDepthReached(int radius)
        {
            return radius < Math.Pow(factor, recursionDepth) * initialRadius;
        }
    }
}
Form1.cs

using System;
using System.Windows.Forms;

namespace WindowsFormsApp9
{
    static class Program
    {
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.Run(new Form1());
        }
    }
}
using System;
using System.Drawing;
using System.Windows.Forms;

namespace WindowsFormsApp9
{
    public partial class Form1 : Form
    {
        const int initialRadius = 120; 
        const int centerX = 400; 
        const int centerY = 200;

        const double factor = 0.45; // Factor to determine the size of the next smaller radius

        const int recursionDepth = 5;

        public Form1()
        {
            InitializeComponent();
        }

        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);

            DrawRecursionStage(centerX, centerY, initialRadius, e.Graphics);
        }

        private void DrawRecursionStage(int x, int y, int radius, Graphics g)
        {
            if (IsRecursionDepthReached(radius))
                return;

            DrawCircle(x, y, radius, g);

            int newRadius = (int)(radius * factor);
            DrawRecursionStage(x - radius, y, newRadius, g);
            DrawRecursionStage(x, y - radius, newRadius, g);
            DrawRecursionStage(x + radius, y, newRadius, g);
            DrawRecursionStage(x, y + radius, newRadius, g);
        }

        private void DrawCircle(int x, int y, int radius, Graphics g)
        {
            g.DrawEllipse(Pens.Black, x - radius, y - radius, 2 * radius, 2 * radius);
        }

        private static bool IsRecursionDepthReached(int radius)
        {
            return radius < Math.Pow(factor, recursionDepth) * initialRadius;
        }
    }
}
使用系统;
使用系统图;
使用System.Windows.Forms;
命名空间WindowsFormsApp9
{
公共部分类Form1:Form
{
常数int initialRadius=120;
常数int centerX=400;
中心常数=200;
const double factor=0.45;//确定下一个较小半径大小的因子
const int recursionDepth=5;
公共表格1()
{
初始化组件();
}
受保护的覆盖无效OnPaint(PaintEventArgs e)
{
基础漆(e);
DrawRecursionStage(centerX、centerY、初始半径、e.Graphics);
}
私有void DrawRecursionStage(整数x、整数y、整数半径、图形g)
{
如果(IsRecursionDepthReached(半径))
返回;
拉深圆(x,y,半径,g);
int newRadius=(int)(半径*系数);
DrawRecursionStage(x-半径,y,新半径,g);
绘图递归阶段(x,y-半径,新半径,g);
绘图递归阶段(x+半径,y,新半径,g);
绘图递归阶段(x,y+半径,新半径,g);
}
专用空心绘制圆(整数x、整数y、整数半径、图形g)
{
g、 抽屉式(黑色笔,x-半径,y-半径,2*半径,2*半径);
}
私有静态布尔值为Recursiondepthreached(整数半径)
{
返回半径<数学功率(因子,递归深度)*初始半径;
}
}
}

分形编码日期如何确定??不要使用
CreateGraphics
-在绘画活动中进行所有绘画,这将为您提供有效的
Graphics
对象。您知道如何创建递归方法吗?您试过了吗?到底是什么问题?这比我预期的要多得多,谢谢。我如何定义是否应使用上述内容绘制图片?即,现在将其绘制在表单上,但我希望将其绘制在专用的“pictureBox1”上。您可以更改中心坐标和中心坐标以更改绘制圆的位置。根据文档,PictureBox设计用于显示图像(例如位图)但是如果你想画直线、矩形等,你应该在
OnPaint
方法中使用“e.Graphis”对象。看到了,哦,对了。我想这更有意义。我如何将其更改为非常量递归深度,因为这将由用户在textBox1.Text字段中输入?你可以删除
const
const int recursionDepth=5;
因此它成为一个字段,用户可以对其进行更改。您还需要从
IsRecursionDepthReached
中删除
static
。我这样做时不断崩溃,因此认为我做错了什么。结果是不相关的。我的电脑只是旧的。非常感谢您的帮助马吕斯!