Набор Мандельброта: полосы, появляющиеся при более глубоком увеличении (›1Э14) (Java)

Несколько лет назад мы с братом написали Java-код для набора Мандельброта. Вчера я хотел найти несколько классных зумов с его помощью, но когда я сделал более интенсивные зумы, я начал замечать проблему (при значении зума около 1E14). Похоже, что пиксели группируются вместе и иногда создают странный полосатый эффект.

Неудачный зум Мандельброта

Выше изображение проблемы (это должно быть в формате 4k).

Вот несколько ссылок на другие, менее глубокие зумы (они должны быть ссылками Google, потому что они слишком большие): https://photos.app.goo.gl/c2hUHM7sSmvKxYbQ6 https://photos.app.goo.gl/nG2cgjJ7vn7XYf8KA https://photos.app.goo.gl/TtpF1Q6hjojHSn747 < / а>

Проблема усугубляется по мере того, как вы увеличиваете масштаб, пока не появится только один цвет. Набор Мандельброта работает

Когда мы создавали программу, мы пытались использовать штриховку, показанную на изображениях в статье Википедии о множестве Мандельброта. Единственная информация, которую мы смогли узнать об этом, заключалась в том, что это была кубическая интерполированная схема окраски, которая придавала ему плавный переходный вид. Мы долго пытались это понять, но, в конце концов, у нас это получилось. Сложность заключалась в том, что кривая не могла превышать пределы RGB, равные 255, поэтому кривые также должны были быть монотонными, и единственное, что мы действительно могли найти, это две статьи в Википедии об этом типе интерполяции. Мы создали код с нуля, и как только мы выяснили, как кадрировать кубическую интерполяцию, я работал над получением идеальных цветов для использования с ним. Прилагается .jar и наш код (он очень беспорядочный, извините, были любители):

код: https://drive.google.com/file/d/186o_lkvUQ7wux5y-9qu8I4VSC3nV25xw/view?usp=sharing

исполняемый файл (если хотите): https://drive.google.com/file/d/1Z12XI-wJCJmI9x0_dXfA3pcj5CNay3K-/view?usp=sharing (вы должны нажимать Enter после ввода каждого значения)

Я надеюсь, что кто-нибудь поможет мне решить эту проблему. Или дайте мне знать, сталкивались ли они с этой проблемой.


person Dermot McMillan    schedule 09.01.2020    source источник


Ответы (1)


Во-первых, не очевидно, что предоставленное вами изображение неверно. Природа Мандельброта такова, что при увеличении масштаба появляются новые детали.

Если есть проблема, то это почти наверняка числовая стабильность. Двойники имеют 53 бита точности. Ваш код довольно нечитабелен, поэтому я не пытаюсь его читать. Но если вы делаете такие вещи, как вычитание верхней границы окна из нижней, когда окно центрировано от начала координат, скажем, в (-1,0), но с крошечным размером ... Вы упомянули ~ 10 ^ -14. Тогда результат вычитания отбрасывает значимость примерно 10 ^ 14. Это около 47 бит. Осталось всего 6 бит, поэтому точность вычислений упала до 1/64. Это не очень точно. Чем дальше от источника и при меньших различиях, тем хуже становится.

Попробуйте прочитать Что должен знать каждый компьютерный ученый об арифметике с плавающей запятой. Это позволит вам увидеть свой код в новом свете. Математика, переведенная непосредственно в вычисления с плавающей запятой, часто взрывается. В этой статье объясняется, как избежать боли.

Менее пугающее чтение можно найти здесь.

Еще одно замечание: я кратко просканировал ваш код. Ознакомьтесь с правилом Хорнера, чтобы повысить точность и скорость.

person Gene    schedule 09.01.2020