Обновить

Множество Мандельброта — видео! 60 FPS и вращение палитры — анимация. И распараллеливаем. И суперсэмплингом. На C++

Уровень сложностиСредний
Время на прочтение18 мин
Охват и читатели7.2K
Всего голосов 10: ↑10 и ↓0+12
Комментарии19

Комментарии 19

Ну как? Множества Мандельброта нравится?

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

Множество Мандельброта не оно???? Вы что там, вещества что ли употребили???

слова в неправильном порядке расставил ты, юный падаван. Оно- не множество Мандельброта, так правильно. На картинках нарисовано не множество Мандельброта, а что-то другое.

Оно. Просто это не центр:

Множество Мандельброта содержит почти полные копии исходного центрального отпечатка на радиальных осях, под другими углами и уже не полностью симметричные. На видео просто не центральная точка (0;0) рендерится, а более красивые лепестки в глубинах фрактала

собственно как понимаю PRESETS в исходниках это как раз координаты и зум для каждой точки отсчёта, можете перепроверить корректность в том же XAOS для этих окрестностей:

Вот что на экране видео точно также и на программе! И есть восемь предустановленных мест Множества Мандельброта. Это C++:

const long double PRESETS[8][3] = {    {-0.7849975438787509L, 0.1465897423090329L, 0.00000000000015L},    {-1.39968383250956L, -0.0005525550160L, 0.0000000000146L},    {-0.8069595889803L, -0.1593850218137L, 0.00000000006L},    {-0.618733273138252L, -0.456605361076005L, 0.0000000000046L},    {-0.550327628L, -0.625931405602L, 0.00000000781L},    {-0.55033233469975L, 0.62593882612931L, 0.0000000000023L},    {-1.3996669964593604L, 0.0005429083913L, 0.000000000000026L},    {-0.5503493176297569L, 0.6259309572825709L, 0.00000000000031L}};

"более красивые лепестки в глубинах фрактала" - ну да. Красивые.

Я не про видео, я про картинки в статье. На них кружочки и завиточки образуют четко выраженные водоворотики относительно белой центральной ляпки, которая должна быть центральной частью множества Мандельброта. Если бы эти водоворотики были зеркальным отражением друг друга относительно вещественной оси- не вопрос, но они не являются отражениями, картинка в целом не имеет зеркальной симметрии. А потому- не оно.

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

ОНО.

картинки - это тоже множество Мандельброта НЕ в центральной точке.

"белая центральная ляпка" во множестве Мандельброта встречается больше одного раза (нужно поскролить и позумить куда-то в сторону), и только одна центральная копия полностью симметрична относительно вещественной оси

ваша логика понятна, но ошибочна. вы видите корректное изображение участка множества Мандельброта, но не понимаете этого (думаете что вам показывают центр, а это НЕ центр) и думаете что это ошибка.

обратите внимание, на картинках "белая центральная ляпка" изобрежна под разными углами. это НЕ ошибка, это реальная ориентация в других участках фрактала той же фигуры, что в центре, да не совсем той же

тогда вопрос- на этой картинке красный крестик какую координату имеет?

автор к сожалению не подписал под каждой картинкой координату, предположу исходя из вертикальной ориентации что это хорошо отзумленный радиальный луч с 0 по вещественной оси и каким то дробным положительным или отрицательным значением комплексной составляющей

если вам хочется истины скачайте XAOS вбейте каждую координату из presets в каноничный браузер Мандельброта и Жулиа и убедитесь что там есть такие несимметричные копии

там даже пресеты координат в дистрибутив вроде входят для ленивых

long double step = size_val / rawW;    
long double startY = ordi - (step* rawH / 2.0);    
     
long double n = startY + a * step;            

как я понимаю, ошибка вот в этих строках.

StartY+b*step с учетом ошибки округления при расчете этого самого степа не совсем точно попадает в ноль, поэтому расходимость последовательности Вы определяете в несколько несимметричных точках x+ c*i / x - (c+eps)-i

а так как молотите 15 тысяч точек, то исходная погрешность в районе ULP умножается примерно на 7500 уже к середине и дает в сумме существенное отклонение в расчетах, которое заметно на изображениях.

поточнее было бы, если бы Вы циклы гоняли

for (int a = -rawW % 2; a < rawW%2; ++a) {

Тогда положительные и отрицательные точки плоскости имели бы строго совпадающие координаты и картинка была бы более правдоподобной. Но вообще, чтобы считать Мандельброта (да и ваще такие чувствительные к погрешностям задачи) аккуратно- нужно повыше точность представления чисел использовать, но это отдельная песня.

алгоритм корректен

завитки там не из-за накопления ошибки а из-за того что это НЕ ЦЕНТР множества Мандельброта (хоть и с "белой центральной ляпкой" в кадре, но это не она а её не симметричные клоны в глубинах фрактала)

читайте развернутый комментарий выше

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

вот как-то так должна выглядеть картинка №2
вот как-то так должна выглядеть картинка №2
или так.
или так.

в центре Мандельброт и вокруг него- симметричныые относительное вертикали узорчики. но симметричные. а не как у Вас закрученные по часовой стрелке.

да нет же. вы троллите или реально не понимаете? то что вы осилили зеркалирование в пеинте не добавляет вам правоты

эти участки фрактала ДОЛЖНЫ БЫТЬ НЕ СИММЕТРИЧНЫ потому что это НЕ ЦЕНТР

аааа. дошло.

вы видите белое пятно и думаете что это центр. ЭТО НЕ ЦЕНТР учите матчасть структуры множества Мандельброта

Надеялся, что оно заведётся на любой платформе, а оно только под windows окошки делает. Взяли б какой-нибудь SDL или raylib для универсальности.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации