Visual Studio Form应用程序C#中的Sierpinski曲线

时间:2019-05-28 18:17:51

标签: c# drawing processing fractals

我必须使用C#在Windows窗体应用程序(Visual Studio)中绘制Sierpinski曲线。首先,我查看了Processing中的一些代码以了解该概念。

我试图将处理代码隐藏到C#中,这就是我设法做到的。这是一个带有单个面板的简单表单。

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;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Threading;

namespace SierpinskicCurve
{
    public partial class Form1 : Form
    {
        float cx , cy;
        int h;

        void lineTo(float newX, float newY)
        {
            Graphics g = panel1.CreateGraphics();
            Pen pen = new Pen(Color.Black);
            g.DrawLine(pen, cx, cy, newX, newY);
            cx = newX;
            cy = newY;
        }

        void sierpinskiCurve(int level)
        {
            sierN(level);
            lineNE();
            sierE(level);
            lineSE();
            sierS(level);
            lineSW();
            sierW(level);
            lineNW();
        }

        void lineN() { lineTo(cx, cy - 2 * h); }
        void lineS() { lineTo(cx, cy + 2 * h); }
        void lineE() { lineTo(cx + 2 * h, cy); }
        void lineW() { lineTo(cx - 2 * h, cy); }

        void lineNW() { lineTo(cx - h, cy - h); }
        void lineNE() { lineTo(cx + h, cy - h); }
        void lineSE() { lineTo(cx + h, cy + h); }
        void lineSW() { lineTo(cx - h, cy + h); }

        void sierN(int i)
        {
            if (i == 1)
            {
                lineNE(); lineN();
                lineNW();
            }
            else
            {
                sierN(i - 1); lineNE();
                sierE(i - 1); lineN();
                sierW(i - 1); lineNW();
                sierN(i - 1);
            }
        }

        void sierE(int i)
        {
            if (i == 1)
            {
                lineSE(); lineE();
                lineNE();
            }
            else
            {
                sierE(i - 1); lineSE();
                sierS(i - 1); lineE();
                sierN(i - 1); lineNE();
                sierE(i - 1);
            }
        }

        void sierS(int i)
        {
            if (i == 1)
            {
                lineSW(); lineS();
                lineSE();
            }
            else
            {
                sierS(i - 1); lineSW();
                sierW(i - 1); lineS();
                sierE(i - 1); lineSE();
                sierS(i - 1);
            }
        }

        void sierW(int i)
        {
            if (i == 1)
            {
                lineNW(); lineW();
                lineSW();
            }
            else
            {
                sierW(i - 1); lineNW();
                sierN(i - 1); lineW();
                sierS(i - 1); lineSW();
                sierW(i - 1);
            }
        }

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            cx = panel1.Width / 3;
            cy = panel1.Height;
            h = 10;
            sierpinskiCurve(4);
        }
    }
}

原始处理代码是这样:

float cx;
float cy;
int h;

void lineTo(float newX, float newY) {
   line(cx, cy, newX, newY);
   fill(0); 
   cx = newX;
   cy = newY; 
}

void lineN(){ lineTo(cx,cy-2*h);}
void lineS(){ lineTo(cx,cy+2*h);}
void lineE(){ lineTo(cx+2*h,cy);}
void lineW(){ lineTo(cx-2*h,cy);}

void lineNW(){ lineTo(cx-h,cy-h);}
void lineNE(){ lineTo(cx+h,cy-h);}
void lineSE(){ lineTo(cx+h,cy+h);}
void lineSW(){ lineTo(cx-h,cy+h);}

void sierN(int i){
   if (i == 1) {
      lineNE(); lineN();
      lineNW();
   }
   else {
      sierN(i-1); lineNE();
      sierE(i-1); lineN();
      sierW(i-1); lineNW();
      sierN(i-1);
   }
}

void sierE(int i){
   if (i == 1) {
      lineSE(); lineE();
      lineNE();
   }
   else {
      sierE(i-1); lineSE();
      sierS(i-1); lineE();
      sierN(i-1); lineNE();
      sierE(i-1);
   }
}

void sierS(int i){
   if (i == 1) {
      lineSW(); lineS();
      lineSE();
   }
   else {
      sierS(i-1); lineSW();
      sierW(i-1); lineS();
      sierE(i-1); lineSE();
      sierS(i-1);
   }
}

void sierW(int i){
   if (i == 1) {
      lineNW(); lineW();
      lineSW();
   }
   else {
      sierW(i-1); lineNW();
      sierN(i-1); lineW();
      sierS(i-1); lineSW();
      sierW(i-1);
   }
}

void setup() {
   size(800, 800);
   cx = width/2;
   cy = height;
}

void draw() {
   background(255);
   stroke(0);
   h = 3;
   sierpinskiCurve(4);
   noLoop();
}

有人可以向我解释我做错了什么,还是可以帮助我建立绘制曲线的新方法?拜托,老实说,我不知道该怎么办。 谢谢!

0 个答案:

没有答案