Wymiar fraktalny.
Liczenie wymiaru fraktalnego obiektu, który nie ma objętości (np. łańcucha SAW, linii brzegowej morza, figury Kocha) najłatwiej wykonać tzw. metodą pudełkową. Polega ona na tworzeniu coraz mniejszych pudełek i liczeniu pudełek zawierających fragmenty obiektu.
Najpierw tworzymy jedno duże pudełko, które obejmuje cały obiekt (w naszym przypadku wszystkie cząsteczki). Weźmy na przykład pudełko o dł. boku L=18. Takich pudełek zawierających cząsteczki jest N=1. Następnie dzielimy bok pudełka na dwa (zawsze zaokrąglamy w górę) i teraz L=9, teraz mamy N=4 pudełka zawierające cząsteczki. kolejne kroki:
L=5 N=13 ; L=3 N=24
L=2 N=41 ; L=1 N=100

Następnie logarytmujemy L i N i tworzymy wykres f(x), gdzie x = log(L), y = log(N). Nachylenie prostej aproksymowanej do otrzymanego wykresu odpowiada wymiarowi fraktalnemu obiektu.
Trudność w liczeniu wymiaru fraktalnego sprowadza się głównie do "chodzenia" po poszczególnych pudełkach i sprawdzania czy jest w nich jakakolwiek cząstka. Taką przykładową pętlę przedstawiam poniżej.
minX,minY,maxX,maxY - graniczne wartości położeń cząstek na płaszczyźnie (tak żeby można było określić główny kwadrat (największy) od którego zaczynamy)
l - krawędź tego głównego kwadratu (w przykładzie powyżej oznaczone to jest jako L)
n - ilość pudełek w których jest jakakolwiek cząstka
skala - w moim programie cząstki mają położenia xy niezależnie od tego co jest wyświetlane na ekranie; na ekranie ich położenia są mnożone przez skale siatki - w sumie to jest nieważne dla samego algorytmu liczenia wymiaru
tabL - iksy naszego wykresu
tabN - igreki naszego wykresu
else l = maxX-minX+1;
while (l>=1) {
n=0;
for (curX = minX; curX <= maxX; curX=curX+l) {
for (curY = minY; curY <= maxY; curY=curY+l) {
iter = this.moleculesList.listIterator ();
while (iter.hasNext ()) {
curMolecule = (DrawableMolecule) iter.next ();
if (curMolecule.isInBox (curX,curY,l,skala)) {
n=n+1;
break;
}
}
}
}
tabL.add (Math.log10 (l));
tabN.add (Math.log10 (n));
if (l==1) l=0;
l= (int) Math.ceil (l/2f);
}
return tab;
Sprawdzenie czy cząstka jest w pudełku (sprawdzam położenia cząstek pomnożone przez skale, równie dobrze można nie mnożyć):
/*** Sprawdzamy czy cząsteczka jest w pudełku
* @param curX - wspolrzedna x lewego gornego rogu pudełka
* @param curY - współrzędna y lewego górnego rogu pudełka
* @param l - długość krawędzi pudełka
* @param skala - skala siatki
* @return Czy cząsteczka jest w pudełku?
*/
public boolean isInBox (int curX, int curY, int l, float skala) {
return (this.getX (skala) > ((curX*skala) - (skala/2)))
&& (this.getX (skala) < (((curX+l) *skala) - (skala/2)))
&& (this.getY (skala) > ((curY*skala) - (skala/2)))
&& (this.getY (skala) < (((curY+l) *skala) - (skala/2))) ;
}
Ta ostatnia metoda jest włożona do obiektu cząsteczka więc this.getX itp. określają położenie cząsteczki.
Posted on Thu, 16 Dec 2004 01:03 by leeloo (1350 day(s) old) Trackbacks [11109]





