Я создаю калькулятор построения графика в Java как проект для моего класса программирования. Существует два основных компонента к этому калькулятору: сам график, который разграничивает (s) и средство анализа уравнения, которое берет в уравнении как a String
и... хорошо, оценивает его.
Для создания строки я создаю a Path2D.Double
экземпляр и цикл через точки на строке. Чтобы сделать это, я вычисляю столько точек, сколько график широк (например, если сам график 500 пкс шириной, я вычисляю 500 точек), и затем масштабируйте его к окну графика.
Теперь, это работает отлично на большую часть любой строки. Однако это не делает при контакте с особенностями.
Если при вычислении точек график встречается с доменной ошибкой (такой как 1/0), график окружает форму Path2D.Double
экземпляр и запускает новую строку, так, чтобы взгляды строки математически исправили. Пример:
(источник: imagesocket.com)
Однако из-за пути это масштабируется, иногда это представляется правильно, иногда это не. Когда это не, фактическую асимптотическую строку показывают, потому что в тех 500 точках, это перескочило x = 2.0
в уравнении 1 / (x-2)
, и только сделал x = 1.98
и x = 2.04
, которые совершенно допустимы в том уравнении. Пример:
(источник: imagesocket.com)
В этом случае я увеличил окно слева, и исправьте одну единицу каждый.
Мой вопрос: существует ли способ иметь дело с особенностями с помощью этого метода масштабирования так, чтобы получающиеся взгляды строки математически исправили?
Я сам думал о реализации метода двоичного-поиска-esque, где, если она находит, что вычисляет одну точку и затем следующий вопрос дико далеко от последней точки, она ищет промежуточный те точки доменную ошибку. Я испытал затруднения при выяснении, как заставить их работать на практике, как бы то ни было.
Спасибо за любую справку можно дать!
Наконец-то я нашел способ правильно рисовать сингулярности.
По сути, я проверяю каждую точку на графике, чтобы увидеть, находится ли она внутри видимого графического клипа. Если я попадаю в точку на графике, которая находится за пределами видимого клипа, я рисую эту первую точку вне клипа, а затем прекращаю рисовать любые невидимые точки после этого.
Я продолжаю вычислять точки и проверять, находятся ли они внутри видимого клипа, а не графически отображаю те, которые находятся за пределами клипа. Как только я снова попадаю в точку, которая находится внутри клипа, я рисую точку перед этой точкой, а затем рисую текущую точку.
Я продолжаю делать это, пока не построю график всей линии. Это создает иллюзию того, что начинается рисование всей линии, когда только видимые части.
Это не сработает, если окно большое, а фактический размер графика в пикселях небольшой, но мне этого достаточно.
Я думаю, что вы в основном на правильном пути.
Можно использовать интервальную арифметику ( http://en.wikipedia.org/wiki/Interval_arithmetic ) и вычислить интервал функции на каждом отрезке [x(i), x(i+1)]. Если полученный интервал бесконечен, пропустите этот отрезок. По скорости это должно быть лишь в пару раз медленнее, чем простое вычисление функции.
Если решение morpehus слишком медленное для вас, вы можете рассмотреть все абсолютные значения переходов между двумя последовательными значениями функции и попытаться определить большие выбросы - это будут бесконечные скачки.
Если вы решили попробовать это и вам нужна помощь, оставьте здесь комментарий.