Fractal Dimension Computation in Python Code
Jake Speed
speed at ?.com
Fri Sep 29 16:01:10 EDT 2000
speed@?.com (Jake Speed) wrote in <st9rojrde4do4a at corp.supernews.com>:
>And of course, it was the actual dimension calculation
>that was incorrect.
And having said that, here's an updated version. Note
that in the examples the points aren't limited to the
0.0 -> 1.0 range anymore.
import math
def fractal_box_count(pointlist, scale):
"""Returns the box coverage of pointlist for boxes of size
scale,"""
boxlevel = 1.0 / scale
pointdict = {}
for point in pointlist:
box = (int(point[0] * boxlevel),
int(point[1] * boxlevel),
int(point[2] * boxlevel))
if not pointdict.has_key(box):
pointdict[box] = 1
return len(pointdict)
return (math.log(num), math.log(boxlevel))
def fractaldim(pointlist, scale1, scale2):
"""Returns the approximate fractal dimension of pointlist
between box scales scale1 and scale2."""
log = math.log
c1 = fractal_box_count(pointlist, scale1)
c2 = fractal_box_count(pointlist, scale2)
return (log(c2) - log(c1)) / (log(1.0/scale2) - log(1.0/scale1))
print "line dimension"
list1d = []
for x in xrange(100):
list1d.append((x/100.0, 0, 0))
for level in xrange(1,10):
scale1 = (.5 ** level)
scale2 = scale1 / 4.0
print level, fractaldim(list1d, scale1, scale2)
print "plane dimension"
list2d = []
for x in xrange(100):
for y in xrange(100):
list2d.append((x/50.0, y/50.0, 0))
for level in xrange(1,10):
scale1 = (.5 ** level)
scale2 = scale1 / 4.0
print level, fractaldim(list2d, scale1, scale2)
print "space dimension"
list3d = []
for x in xrange(30):
for y in xrange(30):
for z in xrange(30):
list3d.append((x/120.0, y/120.0, z/120.0))
for level in xrange(1,10):
scale1 = (.5 ** level)
scale2 = scale1 / 4.0
print level, fractaldim(list3d, scale1, scale2)
def makekoch(x1, y1, x2, y2, level, flist=[]):
xd = (x2 - x1)
yd = (y2 - y1)
xa = x1 + xd / 3.0
ya = y1 + yd / 3.0
xb = x1 + xd * 2.0 / 3.0
yb = y1 + yd * 2.0 / 3.0
xm = (x1 + x2) / 2.0 - 0.866 * yd / 3.0
ym = (y1 + y2) / 2.0 + 0.866 * xd / 3.0
flist.append((xa,ya,0))
flist.append((xm,ym,0))
flist.append((xb,yb,0))
if (level > 0):
makekoch(x1, y1, xa, ya, level-1, flist)
makekoch(xa, ya, xm, ym, level-1, flist)
makekoch(xm, ym, xb, yb, level-1, flist)
makekoch(xb, yb, x2, y2, level-1, flist)
return flist
print "koch dimension"
listfract = makekoch(0,0,1,0,6)
for level in xrange(1,10):
scale1 = (.5 ** level)
scale2 = scale1 / 4.0
print level, fractaldim(listfract, scale1, scale2)
More information about the Python-list
mailing list