Набор Мандельброта: полосы, появляющиеся в более глубоких масштабах (> 1E14) (Java) - PullRequest
1 голос
/ 09 января 2020

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

Messed Up Mandelbrot Zoom

Выше приведена картина проблемы (предполагается, что быть в 4k).

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

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

Когда мы создали программу, мы попытались использовать затенение, показанное на изображениях в статье в Википедии о наборе Мандельброта. Единственная информация, которую мы могли узнать об этом, заключалась в том, что это была интерполированная схема раскраски cubi c, которая дала ей плавный переходный вид. Мы потратили много времени, пытаясь понять это, но в конце концов, мы сделали. Сложно было то, что кривая не могла превышать пределы RGB в 255, поэтому кривые также должны были быть однообразными c, и единственной вещью, которую мы могли действительно найти, были две статьи Википедии об этом типе. интерполяции. Мы создали код с нуля, и когда мы выяснили, как использовать интерполяцию cubi c, я работал над получением идеальных цветов для использования с ним. Прикрепленный файл .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 (вы должны нажать клавишу ввода после ввода каждого значения)

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

1 Ответ

0 голосов
/ 09 января 2020

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

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

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

Менее устрашающее чтение - здесь .

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

...