Dobrý den,
potřebuji do svého webu nějaké fajné pozadí. Co vystihne programátora a nebude takovým klišé? Napadá mne fraktál. Jako algoritmus patří k programování a navíc dává pěkný výstup... A tak si chci udělat pořádný generátor. Pročež jsem předělal JS Juliovu množinu - zatím do této podoby:
using System;
using System.Drawing;
namespace FraGtal
{
public class JuliaSet
{
public int OffsetX { get; set; }
public int OffsetY { get; set; }
public int ExtentX { get; set; }
public int ExtentY { get; set; }
public Action<int, int, Color> Draw { get; set; }
float
realMin = -1.8f,
realMax = 1.8f,
imagMin = -1,
imagMax = 1,
CI = .156f,
CR = -.8f;
int
maxIter = 2000,
x = 0,
y = 0;
bool done = false;
public JuliaSet(int offsetX, int offsetY, int extentX, int extentY)
{
OffsetX = offsetX;
OffsetY = offsetY;
ExtentX = extentX;
ExtentY = extentY;
}
private int Iterate(float real, float imag)
{
int iterations = 0;
while(real < 4 && imag < 4)
{
iterations++;
if(iterations > maxIter)
return 0;
float
realN = real * real - imag * imag + CR,
imagN = 2 * imag * real + CI;
real = realN;
imag = imagN;
}
return iterations;
}
public bool Render()
{
if(!done)
{
float
real = realMax - realMin,
imag = imagMax - imagMin;
for(int xp = x + 10; x < xp; ++x)
for(y = 0; y < ExtentY; ++y)
Draw
(
x + OffsetX,
y + OffsetY,
GetColor(Iterate((x / ExtentX) * real + realMin, (y / ExtentY) * imag + imagMin))
);
done = x >= ExtentX;
}
return done;
}
private Color GetColor(int i)
{
float
r = 0,
g = 0,
b = 0,
p = (i / 200) * 180;
if(p > 0)
{
if(i > 400)
r = g = (i / 400) * (i > 800 ? 255 : 128);
else if(p > 120)
r = (p / 180 * 255) * .55f;
else if(p > 60)
{
g = 75 - (p / 120 * 255);
r = 50 - g;
}
else
{
b = 75 - (p / 60 * 255);
g = 50 - b;
}
}
return Color.FromArgb((int)r, (int)g, (int)b);
}
}
}
public void Generate(int width, int height)
{
JuliaSet algorithm = new JuliaSet(0, 0, width, height);
algorithm.Draw = (x, y, color) => Canvas.DrawRectangle(new Pen(new SolidBrush(color)), x, y, 1, 1);
while(!algorithm.Render());
}
Nejsem si jistý některými datovými typy a ještě to bude chtít lepší návrh, avšak fungovat by to již mělo. Break u barvy nasvědčuje tomu, že to jede. Jenže výsledkem je černý obrázek... Nevidí nějaká dobrá duše chybu?
Děkuji...