我必须使用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();
}
有人可以向我解释我做错了什么,还是可以帮助我建立绘制曲线的新方法?拜托,老实说,我不知道该怎么办。 谢谢!