Mandelbrot set: Difference between revisions

Content added Content deleted
Line 10,916: Line 10,916:


direction, height = 45, 1.5 # direction and height of the incoming light
direction, height = 45, 1.5 # direction and height of the incoming light
stripes, damping = 5.0, 2.0 # stripe density and damping parameter
stripes, damping = 10, 2.0 # stripe density and damping parameter


x = np.linspace(0, 2, num=d+1)
x = np.linspace(0, 2, num=d+1)
Line 10,932: Line 10,932:
Z[M], dZ[M], ddZ[M] = Z[M] ** 2 + C[M], 2 * Z[M] * dZ[M] + 1, 2 * (dZ[M] ** 2 + Z[M] * ddZ[M])
Z[M], dZ[M], ddZ[M] = Z[M] ** 2 + C[M], 2 * Z[M] * dZ[M] + 1, 2 * (dZ[M] ** 2 + Z[M] * ddZ[M])


N = abs(Z) > 2 # exterior distance estimation
N = abs(Z) >= r # normal map effect 1 (potential function)
D[N] = np.log(abs(Z[N])) * abs(Z[N]) / abs(dZ[N])

plt.imshow(D ** 0.1, cmap=plt.cm.twilight_shifted, origin="lower")
plt.savefig("Mandelbrot_distance_est.png", dpi=200)

N = abs(Z) > 2 # normal map effect 1 (potential function)
P, Q = S[N] / T[N], (S[N] + np.sin(stripes * np.angle(Z[N]))) / (T[N] + 1)
P, Q = S[N] / T[N], (S[N] + np.sin(stripes * np.angle(Z[N]))) / (T[N] + 1)
F = 1 - np.log2(np.log(np.abs(Z[N])) / np.log(r))
F = np.log2(np.log(np.abs(Z[N])) / np.log(r)) # fraction between 0 and 1 (for interpolation)
H = P + (Q - P) * F * F * (3 - 2 * F) # hermite interpolation
H = F * P + (1 - F) * Q # height perturbation (by linear interpolation)
U = Z[N] / dZ[N] # normal vectors to the equipotential lines
U = Z[N] / dZ[N] # normal vectors to the equipotential lines
U, v = U / abs(U), np.exp(direction / 180 * np.pi * 1j) # unit normal vectors and unit 2D vector
U, v = U / abs(U), np.exp(direction / 180 * np.pi * 1j) # unit normal vectors and unit 2D vector
Line 10,949: Line 10,943:
plt.savefig("Mandelbrot_normal_map_1.png", dpi=200)
plt.savefig("Mandelbrot_normal_map_1.png", dpi=200)


N = abs(Z) > 2 # normal map effect 2 (distance estimation)
N = abs(Z) >= r # normal map effect 2 (distance estimation)
U = Z[N] * dZ[N] * ((1 + np.log(abs(Z[N]))) * np.conj(dZ[N] ** 2) - np.log(abs(Z[N])) * np.conj(Z[N] * ddZ[N]))
U = Z[N] * dZ[N] * ((1 + np.log(abs(Z[N]))) * np.conj(dZ[N] ** 2) - np.log(abs(Z[N])) * np.conj(Z[N] * ddZ[N]))
U, v = U / abs(U), np.exp(direction / 180 * np.pi * 1j) # unit normal vectors and unit 2D vector
U, v = U / abs(U), np.exp(direction / 180 * np.pi * 1j) # unit normal vectors and unit 2D vector