Алгоритм построения 2d xy графа - PullRequest
2 голосов
/ 11 марта 2019

Я пытаюсь построить график XY в реальном времени, используя Java. Функции, которые полагаются только на X, просты. Просто переберите x0...xn, получите значение и проведите линии между точками. На нем много руководств, и он интуитивно понятен.

Но буквально нет руководства по построению графиков, где x AND y является переменной. Рассмотрим это уравнение: sin(x^3 * y^2) = cos(x^2 * y^3)

С помощью графопостроителя онлайн я получаю это: Using desmos.com

В то время как мой лучший результат построения той же функции такой: I tried

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

У меня вопрос, как я могу сделать свою программу быстрее и сделать так, чтобы графики выглядели лучше? Может быть, есть какие-то алгоритмы для этой цели?

Ответы [ 2 ]

1 голос
/ 12 марта 2019

Задача состоит в том, чтобы выбрать правильный порог.Пиксели, где abs(f(x,y)) ниже порога, должны быть цветными.Пиксели выше порога должны быть белыми.

Проблема в том, что если пороговое значение слишком низкое, в местах, где ни один пиксель не находится точно на линии, появляются пропуски.С другой стороны, если порог слишком высок, линии расширяются в местах, где функция близка к нулю, и функция меняется медленно.

Так какой же правильный порог?Ответом является величина градиента , умноженная на радиус пикселя.Другими словами, пиксель должен быть цветным, когда

abs(f(x,y)) < |g(x,y)| * pixelRadius

. Причина в том, что величина градиента равна максимальному наклону поверхности (в данной точке).Таким образом, пересечение нуля происходит в пикселе, если наклон достаточно велик, чтобы уменьшить функцию до нуля внутри пикселя.

Это, конечно, только грубое приближение.Предполагается, что градиент существенно не изменяется в пределах области, ограниченной пикселем.Функция в вопросе достаточно хорошо соответствует этому предположению, за исключением правого верхнего угла.Обратите внимание, что на приведенном ниже графике в правом верхнем углу есть узоры Муара .Я полагаю, что это связано с ошибкой в ​​моем расчете сглаживания: я не компенсирую быстро меняющийся градиент.

На приведенном ниже графике пиксели белого цвета, если

abs(f(x,y)) > |g(x,y)| * pixelRadius

В противном случаеинтенсивность пикселей - это число от 0 до 1, где 0 - черный, а 1 - белый:

intensity = abs(f(x,y)) / (|g(x,y)| * pixelRadius)

enter image description here

0 голосов
/ 12 марта 2019

Я не знаю, как это сделал онлайн-плоттер, но вот несколько советов.

  • Упростите ваше уравнение, в этом конкретном случае вы можете легко получить x^2 * y^2 * (x ± y) = (2 * n + 1 / 2) * pi, где nдля любого целого числа.Это намного яснее, чем оригинал.
  • Рисуйте линии, а не точки.Каждое n здесь обозначает 4 кривые, теперь вы можете перебрать x, вычислить y и нарисовать линию между соседними точками.

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...