Почему графики рвутся на краях...
Мизантропия, простуда. :)
На самом деле, ни единого разрыва в том же овале Кассини нет, но поскольку формула определена с точностью до знака и под квадратным корнем могут оказаться отрицательные числа, то независимо от того, строим ли мы только "половинку" кривой, а вторую попиксельно "переворачиваем" (как в приложенном скрипте) или рисуем отдельно обе кривых, во многих случаях на стыках "половинок" будут разрывы, и не только в этой конкретной задаче и не только при "ручном" программировании, но и в готовых продуктах:
Овал Кассини в Mathcad Prime, верхняя кривая выделена
Разрывы на графике Mathcad неудивительны, ведь y1(-3,2,2)=y1(3,2,2)=0.592i
, то есть, комплексное число с нулевой действительной частью. Но даже уточнив область определения функции и проверками условий избегая мнимостей, как сделано в приложенном скрипте, а также ставя в код разного рода костыли (что само по себе плохо), связанные с отдельным учётом разрывов (см. закомментированный блок "хвосты" в коде - он лишь создаст дополнительные дефекты отрисовки), мы редко можем избежать проблем при некоторых значениях параметров, особенно если таковых больше одного.
В общем случае не поможет, а скорее усугубит проблемы и уменьшение шага - сколько не мельчи, а в "физическом" шаге меньше пикселя особого смысла нету.
Иногда может помочь математический анализ функции, но в общем случае мы всё равно упрёмся в неизбежные дефекты дискретизации непрерывного по своей природе отображения.
Максимум, что нам светит - симметрия, но не непрерывность.
Конечно, мы могли бы масштабировать построение не отдельно по осям, а единым коэффициентом, считать не в декартовых координатах, а в полярных, что нередко бывает гораздо удобнее (розетки, звёздочки), но в общем виде проблема, мне кажется, останется.
Открыть скрипт Cassini в текущем окне/вкладке, исходник виден из исходника страницы (4 Кб)
Скрипт "Кассини" из сети - реализация другая, а проблемы те же
P.S. Зато поиздевавшись над параметризацией уравнения, можно получать стильные "восьмёрки", это и будем считать итогом заметки. :(
"Восьмёрка" из параметризованного овала Кассини
Документ .mcdx Mathcad Prime 7 и выше с этим расчётом (13 Кб)
16.09.2023, 16:34 [285 просмотров]