A Mandelbrot-halmaz egy síkbeli alakzat, amelyet egy alapvetően nagyon egyszerű algebrai összefüggés bonyolultabb (végtelennel kapcsolatos, analitikus fogalmakat, határértékszámítást igénylő) elemzése ad meg, rajzol ki. Ezeknek az összefüggéseknek a még legegyszerűbb (bár nem az egyetlen lehetséges) megközelítési módja a komplex számok felhasználásával történhet. A Mandelbrot-halmaz a komplex számsíkon ábrázolható alakzat, amely számsík geometriailag semmiben sem különbözik a jól ismert („euklideszi”) síktól, csak a pontok számokkal való leírása más.
-----------------------
import numpy as np
import matplotlib.pyplot as plt
def mandelbrot(h, w, max_iter=256):
"""Létrehozza a Mandelbrot-halmazt numpy tömbként."""
y, x = np.ogrid[-1.5:1.5:h*1j, -2.5:0.5:w*1j]
c = x + 1j * y
z = c
divtime = max_iter + np.zeros(z.shape, dtype=int)
for i in range(max_iter):
z = z**2 + c
diverge = z * np.conj(z) > 2**2 # Divergencia vizsgálata
div_now = diverge & (divtime == max_iter)
divtime[div_now] = i
z[diverge] = 2 # Megelőzi a túlcsordulást
return divtime
# A kép felbontása (növelésével szebb, de lassabb lesz a kép)
width, height = 1000, 800
iterations = 100
# Szimuláció futtatása
fraktal = mandelbrot(height, width, max_iter=iterations)
# Látványos megjelenítés
plt.figure(figsize=(10, 8), dpi=150)
plt.imshow(fraktal, extent=[-2.5, 0.5, -1.5, 1.5], cmap='twilight_shifted')
plt.axis('off') # Eltünteti a tengelyeket a látványért
plt.title("Mandelbrot-halmaz", color='white', fontsize=14)
# Háttérszín feketére állítása a szebb kontrasztért
ax = plt.gca()
ax.set_facecolor('black')
plt.show()
---------------
Eredmény;
A Mandelbrot-halmaz körlapjainak és a szatelliták kardiodlapjainak a határciklusai az adott lapra jellemző hosszúságúak. Ezeknek a lapoknak a helye egyértelműen megadja a határciklusok hosszát. Minden körlap érintkezik egy alaptesttel, egy nagyobb körlappal, vagy kardioiddal.
Egy lap határciklusainak hossza megegyezik az ugyanazt az alaptestet érintő két nála nagyobb szomszédos lap határciklusainak hosszának összegével. Ha csak kisebb lapok vannak, akkor az alaptest járul hozzá az összeghez. A leghíresebb próbálkozás a Mandelbulb, egy háromdimenziós szerkezet, amit a térbeli Mandelbrot-halmaznak is neveznek.
import math
import random
from PIL import Image
# K p m rete
imgx = 512
imgy = 512
image = Image.new("RGB", (imgx, imgy))
pixels = image.load()
# Param terek
maxIt = 128 # Maxim lis iter ci s sz m
power = 8 # A Mandelbulb hatv nya
xa = -1.5
xb = 1.5
ya = -1.5
yb = 1.5
# V letlenszer forgat si sz gek a 3D t r 2D-s lek pez s hez
pi2 = math.pi * 2.0
xy = random.random() * pi2
xz = random.random() * pi2
yz = random.random() * pi2
sxy = math.sin(xy); cxy = math.cos(xy)
sxz = math.sin(xz); cxz = math.cos(xz)
syz = math.sin(yz); cyz = math.cos(yz)
# Iter ci s folyamat
for i in range(imgx):
for j in range(imgy):
# Koordin t k normaliz l sa
x0 = xa + (xb - xa) * i / imgx
y0 = ya + (yb - ya) * j / imgy
z0 = 0.0
# Forgat s a 3D t rben
# X tengely k r li forgat s
x1 = x0
y1 = y0 * cxy - z0 * sxy
z1 = y0 * sxy + z0 * cxy
# Y tengely k r li forgat s
x2 = x1 * cxz + z1 * sxz
y2 = y1
z2 = -x1 * sxz + z1 * cxz
# Z tengely k r li forgat s
x = x2 * cyz - y2 * syz
y = x2 * syz + y2 * cyz
z = z2
cx, cy, cz = x, y, z # Kezd pont (C)
# Mandelbulb iter ci
for iteration in range(maxIt):
r = math.sqrt(x*x + y*y + z*z)
if r > 2.0:
# Sz nez s az iter ci k sz ma alapj n
brightness = int(iteration * 255 / maxIt)
pixels[i, j] = (brightness, brightness // 4, brightness // 2)
break
# G mbkoordin t k sz m t sa
theta = math.atan2(math.sqrt(x*x + y*y), z)
phi = math.atan2(y, x)
# Hatv nyoz s s a pont eltol sa
zr = r ** power
theta = theta * power
phi = phi * power
# Vissza a Descartes-koordin tarendszerbe
x = zr * math.sin(theta) * math.cos(phi) + cx
y = zr * math.sin(theta) * math.sin(phi) + cy
z = zr * math.cos(theta) + cz
else:
# Ha a pont a halmaz r sze marad
pixels[i, j] = (0, 0, 0)
# A k p ment se s megjelen t se
image.save("mandelbulb_cross_section.png")
image.show()
-------------

Nincsenek megjegyzések:
Megjegyzés küldése