Ik ben al een tijdje bezig een fractal te maken volgens de formule f(z)=z^2 + p.
het is de bedoeling dat ik voor elke pixel coordinaat een functie bereken en dan probeer te zien of het reele deel of het imaginaire deel buiten een bepaald straal komt te liggen.(in dit geval 1 of 2)
f(z)=z^2 + p
z= a+bj, dus z^2 levert dus (a+bj)(a+bj)=((a*a)-(b*b)) + ((b*a)+(a*b))j
p= c+dj maar is pixel afhankelijk dus: p=px+pyj we vermenigvuldigen px en py met een geschikte waarde om binnen het bereik van het venster te blijven.
in dit geval (omdat mijn venster zo groot is) px*(1/354) en py*(1/333).
Je krijgt dat een reel deel:
FZNreel=((az*az)-(bz*bz))+ (x*(1/354));
en een formule voor het imaginaire deel:
FZNimaginair=((bz*az)+(az*bz))+ (y*(1/333));
volgens mij gaat het fout in het onderste gedeelte van de code die ik voor het gemak maar even gedeeltelijk heb geplaatst.
Het echte probleem is dat wanneer ik het programma start, hij de berekeningen uitvoert en het hele scherm geel maakt (dat betekend dat voor alle pixels direct na 1 aanroep van de functie het reele deel of het imaginaire deel groter is geworden dan de straal, of hij tekent het hele scherm zwart; wat betekend dat het aantal recursieve aanroepen groter is geworden dan 55.
heeft iemand enig idee waarom er geen middenweg in deze code zit? volgens de theorie zou de cirkel verlaten moeten worden na een willekeurig aantal recursieve aanroepen. oftewel: er zouden iig een flink aantal pixels moeten zijn met verschillende kleuren, en niet het hele scherm met 1 kleur.
----edit---
thx!
het is de bedoeling dat ik voor elke pixel coordinaat een functie bereken en dan probeer te zien of het reele deel of het imaginaire deel buiten een bepaald straal komt te liggen.(in dit geval 1 of 2)
f(z)=z^2 + p
z= a+bj, dus z^2 levert dus (a+bj)(a+bj)=((a*a)-(b*b)) + ((b*a)+(a*b))j
p= c+dj maar is pixel afhankelijk dus: p=px+pyj we vermenigvuldigen px en py met een geschikte waarde om binnen het bereik van het venster te blijven.
in dit geval (omdat mijn venster zo groot is) px*(1/354) en py*(1/333).
Je krijgt dat een reel deel:
FZNreel=((az*az)-(bz*bz))+ (x*(1/354));
en een formule voor het imaginaire deel:
FZNimaginair=((bz*az)+(az*bz))+ (y*(1/333));
volgens mij gaat het fout in het onderste gedeelte van de code die ik voor het gemak maar even gedeeltelijk heb geplaatst.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
| public void berekenKleur()
{
//bepaal nieuw startpunt z0, een getal tussen de 0 en de 1
Random randomGetal1 = new Random();
Random randomGetal2 = new Random();
az=randomGetal1.NextDouble();
bz=randomGetal2.NextDouble();
for (y=0; y<=333; y++)//doorloop alle pixel coordinaten
{
for (x=0; x<=354; x++)
{
//maak de teller van het aantal recursieve aanroepen weer nul
i=1;
start:
//bereken het reele en imaginaire deel van F(Zn)
FZNreel=((az*az)-(bz*bz))+ (x*(1/354));
FZNimaginair=((bz*az)+(az*bz))+ (y*(1/333));
//controleer of het maximale aantal van i is bereikt, of dat het reele deel
//of het imaginaire deel groter is geworden dan de straal van de cirkel(2)
if((FZNreel > straal )|(FZNimaginair > straal)|(i > 55) )
{
//vul het array met waarden van de recursieve aanroepen (i).
//uit dit array lezen we later de waarden terug en kunnen we zo bepalen
//welke kleuren de pixels moeten krijgen. b.v. als i < 15 pixel is geel
//als i >=15 & <25 blauw, als i >55 zwart. (dat idee)
aKleurArray[x,y] = i;
//initialiseer az en bz opnieuw met dezelfde z0 waarde als de eerste pixel
az=temp_az;
bz=temp_bz;
}//end if
//als dat allemaal nog niet het geval is dan moet de functie opnieuw
//worden aangeroepen.
else
{
i=i+1;
az=FZNreel;
bz=FZNimaginair;
goto start;
}//end if
}//end for
}//end for
}//end berekenPixelKleur |
Het echte probleem is dat wanneer ik het programma start, hij de berekeningen uitvoert en het hele scherm geel maakt (dat betekend dat voor alle pixels direct na 1 aanroep van de functie het reele deel of het imaginaire deel groter is geworden dan de straal, of hij tekent het hele scherm zwart; wat betekend dat het aantal recursieve aanroepen groter is geworden dan 55.
heeft iemand enig idee waarom er geen middenweg in deze code zit? volgens de theorie zou de cirkel verlaten moeten worden na een willekeurig aantal recursieve aanroepen. oftewel: er zouden iig een flink aantal pixels moeten zijn met verschillende kleuren, en niet het hele scherm met 1 kleur.
----edit---
thx!
[ Voor 33% gewijzigd door ungarmax op 29-10-2004 15:17 ]