Обнаружение особенностей в графике

Я создаю калькулятор построения графика в Java как проект для моего класса программирования. Существует два основных компонента к этому калькулятору: сам график, который разграничивает (s) и средство анализа уравнения, которое берет в уравнении как a String и... хорошо, оценивает его.

Для создания строки я создаю a Path2D.Double экземпляр и цикл через точки на строке. Чтобы сделать это, я вычисляю столько точек, сколько график широк (например, если сам график 500 пкс шириной, я вычисляю 500 точек), и затем масштабируйте его к окну графика.

Теперь, это работает отлично на большую часть любой строки. Однако это не делает при контакте с особенностями.

Если при вычислении точек график встречается с доменной ошибкой (такой как 1/0), график окружает форму Path2D.Double экземпляр и запускает новую строку, так, чтобы взгляды строки математически исправили. Пример:

Good Asymptote
(источник: imagesocket.com)

Однако из-за пути это масштабируется, иногда это представляется правильно, иногда это не. Когда это не, фактическую асимптотическую строку показывают, потому что в тех 500 точках, это перескочило x = 2.0 в уравнении 1 / (x-2), и только сделал x = 1.98 и x = 2.04, которые совершенно допустимы в том уравнении. Пример:

Bag Asymptote
(источник: imagesocket.com)

В этом случае я увеличил окно слева, и исправьте одну единицу каждый.

Мой вопрос: существует ли способ иметь дело с особенностями с помощью этого метода масштабирования так, чтобы получающиеся взгляды строки математически исправили?

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

Спасибо за любую справку можно дать!

10
задан Glorfindel 27 June 2019 в 07:03
поделиться

4 ответа

Наконец-то я нашел способ правильно рисовать сингулярности.

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

Я продолжаю вычислять точки и проверять, находятся ли они внутри видимого клипа, а не графически отображаю те, которые находятся за пределами клипа. Как только я снова попадаю в точку, которая находится внутри клипа, я рисую точку перед этой точкой, а затем рисую текущую точку.

Я продолжаю делать это, пока не построю график всей линии. Это создает иллюзию того, что начинается рисование всей линии, когда только видимые части.

Это не сработает, если окно большое, а фактический размер графика в пикселях небольшой, но мне этого достаточно.

1
ответ дан 4 December 2019 в 04:01
поделиться

Я думаю, что вы в основном на правильном пути.

  1. Я не думаю, что цифра 2 математически неверна.
  2. Для получения бонусных очков, у вас должна быть процедура, которая проверяет разницу между двумя последовательными значениями y1 и y2, и если она больше порога, вставляет больше точек между y1 и y2, пока разница не станет больше порога. Если после 10 итераций или около того этот итерационный цикл не может выйти из цикла while, то это указывает на наличие сингулярности, и вы можете удалить участок между y1 и y2. Это даст вам рисунок 1.
1
ответ дан 4 December 2019 в 04:01
поделиться

Можно использовать интервальную арифметику ( http://en.wikipedia.org/wiki/Interval_arithmetic ) и вычислить интервал функции на каждом отрезке [x(i), x(i+1)]. Если полученный интервал бесконечен, пропустите этот отрезок. По скорости это должно быть лишь в пару раз медленнее, чем простое вычисление функции.

2
ответ дан 4 December 2019 в 04:01
поделиться

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

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

0
ответ дан 4 December 2019 в 04:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: