Построить треугольник серпинского - C#
Формулировка задачи:
Ну в общем нужно построить треугольник серпинского 3-го порядка , используя рекурсивный метод в С# . Проблема в том , что даже не знаю с чего нужно начать . До этого смотрел похожую тему , но в ней описано как построить треугольник с помощью точек , а мне нужно с помощью линий .
Решение задачи: «Построить треугольник серпинского»
textual
Листинг программы
using System;
using System.Drawing;
using System.Windows.Forms;
namespace WindowsFormsApplication2
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
Point NextPoint(Point p1, Point p2)
{
return new Point
{
X = p2.X + (int)Math.Round((p1.X - p2.X) / 2F, 0),
Y = p2.Y + (int)Math.Round((p1.Y - p2.Y) / 2F, 0)
};
}
void DrawYourFigure(int degree, Point[] point, Action<Point[]> renderMethod)
{
if (degree <= 0 || renderMethod == null || point == null) throw new ArgumentNullException("input params", "");
if (point.Length % 3 != 0) throw new ArgumentException();
if ((int)point.Length / Math.Pow(3, degree - 1) <= 3)
{
System.Collections.Generic.List<Point> result = new System.Collections.Generic.List<Point>();
for (int i = 0; i < point.Length; )
{
var middle = new[] {
NextPoint(point[i], point[i + 1]),
NextPoint(point[i + 1], point[i + 2]),
NextPoint(point[i], point[i + 2])
};
//1
var renderResult = new[] { point[i], middle[0], middle[2] };
result.AddRange(renderResult);
renderMethod(renderResult);
//2
renderResult = new[] { middle[0], point[i + 1], middle[1] };
result.AddRange(renderResult);
renderMethod(renderResult);
//3
renderResult = new[] { middle[2], middle[1], point[i + 2] };
result.AddRange(renderResult);
renderMethod(renderResult);
i += 3;
}
DrawYourFigure(degree, result.ToArray(), renderMethod);
}
}
protected override void OnShown(EventArgs e)
{
int degree = 4;//your degree
DrawYourFigure(degree, new[] {
new Point{ X=10, Y=200},
new Point{ X=210, Y=200},
new Point{ X=105, Y=10}
}, elem =>
{
var result = this.CreateGraphics();
result.DrawPolygon(new Pen(Color.Red,2), elem);
});
base.OnShown(e);
}
private void Form1_Load(object sender, EventArgs e)
{
}
}
}