Похоже, вы хорошо начали.
По первому вопросу: я считаю, что есть способы автоматически выбрать «интересную» часть набора для увеличения, но я не знаю, что это такое. И я совершенно уверен, что это включает в себя нечто большее, чем просто применение какой-либо линейной функции к вашему текущему ограничивающему прямоугольнику, что, как кажется, вы делаете.
Таким образом, вы можете попытаться выяснить, что это за методы (могут оказаться математически сложными), но если вы новичок в программировании, вам, вероятно, будет проще позволить пользователю выбирать, где масштабировать. В начале это также более увлекательно, поскольку вы можете запускать свою программу несколько раз и каждый раз исследовать новую часть набора.
Простой способ сделать это - позволить пользователю нарисовать прямоугольник над изображением и использовать функцию map
для преобразования пиксельных координат нарисованного прямоугольника в новые действительные и мнимые координаты вашей области увеличения.
Вы также можете комбинировать оба подхода: найдя где-то интересное, вручную выбирая область масштабирования, вы можете установить ее как «конечный пункт назначения» и постепенно и плавно увеличивать код, чтобы создать хороший фильм.
Тем не менее, он будет постепенно становиться все медленнее, поскольку вы начнете использовать все более точные координаты, пока не достигнете пределов точности с помощью double
, и это не станет пиксельным беспорядком. Оттуда, если вы хотите увеличить масштаб, вам придется взглянуть на арифметику произвольной точности с BigDecimal
- и она будет становиться все медленнее и медленнее.
По второму вопросу: начинать с вычисления значения numIterations / maxIterations
(то есть между 0 и 1) для каждого пикселя - правильная идея (я думаю, что это в основном то, что вы делаете).
Оттуда есть все виды способов преобразовать это значение в цвет, пришло время проявить творческий подход!
Простой способ - иметь массив из нескольких очень разных цветов. Например. если бы у вас было белое (0,0), красное (0,25), зеленое (0,5), синее (0,75), черное (1,0), то, если рассчитанное вами число было точно одним из перечисленных, вы бы использовали соответствующий цвет. Если это где-то между, вы смешиваете цвета, например за 0,3 вы бы взяли:
((0.5-0.3)*red + (0.3-0.25)*green) / (0.5 - 0.25)
= 0.8*red + 0.2*green
Взяв средневзвешенное значение двух цветов, я оставлю это упражнение;)
(подсказка: возьмите отдельные средние значения r, g и b. Может также подойти игра со значениями альфа).
Еще один вариант, если вы хотите получить больше математики, - это взять уравнение для спирали и использовать его для вычисления точки на плоскости в цветовом пространстве HSB (вы может поддерживать яркость на некотором фиксированном значении, скажем, 1). Фактически, любая кривая в 2D или 3D, которую вы знаете, как написать уравнение одной реальной переменной, может быть использована для плавного изменения цвета, если вы интерпретируете координаты как точки в некотором цветовом пространстве.
Надеюсь, этого будет достаточно, чтобы вы продолжали! Дайте мне знать, если неясно.