Cassandra & Luntik
Привет, Кассандра. Я тут набросал одну безумную фрактальную штуку, как радуга, где каждый завиток выглядит как медуза из неоновых огней. Хочешь взглянуть, сможем ли мы посчитать и заставить её оживиться на экране?
Звучит как интересный проект! У тебя уже есть какая-то конкретная формула фрактала на примете – например, набор Мандельброта или набор Юлии? И какие-нибудь пожелания по цветовой гамме или эффекту неоновой подсветки? Если пришлешь параметры, я смогу быстро набросать скрипт для генерации изображения и поиграть с цветами, чтобы добиться этого сияния, как у медузы.
Подумал вот о чём: создадим фрактал, многомерный комплексный аттрактор Жюлиа, с магической константой c = 0.285+0.01i. Прогоним его на 200 итераций, увеличим масштаб так, чтобы структура была похожа на щупальце медузы. Потом отобразим количество итераций на неоновую палитру – ну, типа яркого маджента, электрического синего, кислотного розового и лаймового зелёного – с добавлением эффекта свечения, чтобы подчёркнуть края, и казалось бы, медуза светится изнутри. И завершим всё лёгкой размытостью, чтобы добавить мягкости и загадочности. Давай закодируем это?
Вот тебе набросок, который ты можешь просто скопировать в ячейку Jupyter или в скрипт.
```python
import numpy as np
import matplotlib.pyplot as plt
from scipy.ndimage import gaussian_filter, sobel
# grid
res = 800
x = np.linspace(-1.5, 1.5, res)
y = np.linspace(-1.5, 1.5, res)
X, Y = np.meshgrid(x, y)
Z = X + 1j*Y
c = 0.285 + 0.01j
max_iter = 200
diverge = np.full(Z.shape, False, dtype=bool)
iterations = np.zeros(Z.shape, dtype=int)
for i in range(max_iter):
mask = ~diverge
Z[mask] = Z[mask]**2 + c
diverge[mask] = np.abs(Z[mask]) > 2
iterations[mask] = i
# color palette: magenta, blue, pink, lime
palette = np.array([
[1.0, 0.0, 1.0], # magenta
[0.0, 0.0, 1.0], # blue
[1.0, 0.0, 1.0], # pink (same as magenta, tweak if needed)
[0.0, 1.0, 0.0] # lime
])
# map iterations to 0-3
norm_iter = (iterations / iterations.max() * 3).astype(int)
rgb = palette[norm_iter]
# edge glow
edges = sobel(rgb.mean(axis=2))
glow = gaussian_filter(edges, sigma=5)
rgb += np.expand_dims(glow, -1) # broadcast to RGB
# final blur
rgb = gaussian_filter(rgb, sigma=1)
plt.figure(figsize=(8,8))
plt.imshow(np.clip(rgb,0,1))
plt.axis('off')
plt.show()
```
Поиграй со значением `sigma` в фильтре гаусса и с палитрой, чтобы добиться более неонового эффекта. Дай знать, что получится!
Отличный код, здорово! Сейчас запущу, немного подкручу сигму для более мягкого свечения, возможно, розовый поменяю на яркий циан, и добавлю немного случайной дрожи в палитру, чтобы больше на медузу было. Жду не дождусь, как эти неоновые щупальца затанцуют!
Отлично! Просто подкрути сигму, чтобы свечение было идеальным, и не забудь про этот акцент синего для щупалец. Жду неоновые волны.
Получил! Подкручу немного сигму, поменяю этот розовый на яркий циан, и посмотрю, как заиграют неоновые волны – здорово!
Должно получиться очень нежно и загадочно. Напиши, как финальный вариант выглядит!
Выглядит просто волшебно. Эти голубые щупальца светятся, как медузы в неоновом океане, с такой нежной, почти невидимой дымкой, что все это кажется живым и немного плывущим. Отличная работа!