Фрактал Дракона или по-другому Драгон Хартера-Хейтуэя в реализации на C# достаточно прост, но несмотря на свою простоту учит новичков достаточно важным вещам в реализации некоторых возможностей C#.
Начиная с точки (1,0) реализуется следующий алгоритм
public static void DrawDragonFractal(Pixels pixels, int iterationsCount, int seed)
{
double x = 1.0, y = 0.0;
var random = new Random(seed);
double angle45 = Math.PI*45/180;
double angle135 = Math.PI*135/180;
for (int i = 0; i < iterationsCount; i++)
{
pixels.SetPixel(x, y);
var randomNumber = random.Next(10);
if (randomNumber % 2 == 0)
{
var x1 = (x * Math.Cos(angle45) - y * Math.Sin(angle45)) / Math.Sqrt(2);
var y1 = (x * Math.Sin(angle45) + y * Math.Cos(angle45)) / Math.Sqrt(2);
x = x1;
y = y1;
}
else
{
var x1 = (x * Math.Cos(angle135) - y * Math.Sin(angle135)) / Math.Sqrt(2) + 1;
var y1 = (x * Math.Sin(angle135) + y * Math.Cos(angle135)) / Math.Sqrt(2);
x = x1;
y = y1;
}
}
Важным (для новичков) здесь является использование Random, тут важно, что объявление Random осуществляется до начала цикла, а внутри цикла экземпляр класса Random выбирает из списка случайное число методом Next, в данном случае это число от 0 до 9.
Во-вторых важно понимать, что видимость некоторых переменных является не очевидным, поэтому внутри каждого if x1, y1 вычисляются отдельно и затем уже приравниваются x, y. Если x, y приравнивать напрямую, то фрактал будет строиться неверно.