Кривая Госпера - C#
Формулировка задачи:
using System;
using System.Drawing;
using System.Windows.Forms;
*
namespace Gosper_curve
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
Graphics g;
Pen pen = new Pen(Color.Black);
*
void Draw(double x, double y, double l, double u, int t, int q)
{
// начало построения ломанных
if (t > 0)
{
if (q == 1)
{
//формулы построения
x += l * Math.Cos(u);
y -= l * Math.Sin(u);
u += Math.PI;
}
u -= 2 * Math.PI / 19;//соединение линий
l /= Math.Sqrt(7); //масштаб
//функции рисования
Paint(ref x, ref y, l, u, t - 1, 0);
Paint(ref x, ref y, l, u + Math.PI / 3, t - 1, 1);
Paint(ref x, ref y, l, u + Math.PI, t - 1, 1);
Paint(ref x, ref y, l, u + 2 * Math.PI / 3, t - 1, 0);
Paint(ref x, ref y, l, u, t - 1, 0);
Paint(ref x, ref y, l, u, t - 1, 0);
Paint(ref x, ref y, l, u - Math.PI / 3, t - 1, 1);
}
else g.DrawLine(pen, (float)Math.Round(x), (float)Math.Round(y), (float)Math.Round(x + Math.Cos(u) * l), (float)Math.Round(y - Math.Sin(u) * l));
}
*
void Paint(ref double x, ref double y, double l, double u, int t, int q)
{
Draw(x, y, l, u, t, q);
x += l * Math.Cos(u);
y -= l * Math.Sin(u);
}
*
private void button1_Click(object sender, EventArgs e)
{
g = Graphics.FromHwnd(pictureBox1.Handle);
Draw(150, 350, 300, 0, 3, 0);
}
}
}Решение задачи: «Кривая Госпера»
textual
Листинг программы
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
protected override void OnPaint(PaintEventArgs e)
{
e.Graphics.TranslateTransform(230, 100);
Draw(e.Graphics, "A", 3, 60, new Dictionary<char, string>()
{
['A'] = "A-B--B+A++AA+B-",
['B'] = "+A-BB--B-A++A+B"
});
}
void Draw(Graphics g, string rule, int level, int angle, Dictionary<char, string> rules)
{
// Если дошли до нулевого уровня то рисуем линию и выходим
if (level < 0)
{
g.DrawLine(Pens.Black, 0, 0, 0, 10);
g.TranslateTransform(0, 10);
return;
}
// Иначе, следуя правилу,
foreach (var r in rule)
{
switch(r)
{
// поворачиваемся
case '-': g.RotateTransform(+angle); break;
case '+': g.RotateTransform(-angle); break;
// или рекурсивно запускаем отрисовку правила из словаря
default: Draw(g, rules[r], level - 1, angle, rules); break;
}
}
}
}