Алгоритм 2D Референциальная традукция - PullRequest
2 голосов
/ 05 декабря 2008

Я пытаюсь построить графическую функцию,

Пользователь вводит функции xmin, xmax, ymin, ymax,. Я получил x, y для всех точек.

Теперь я хочу перевести эту исходную ссылку на Canvas, начиная с 0,0 до 250250.

Есть короткий путь или я должен просто проверить

if x < 0 
new x = (x - xmin) * (250 / (xmax - xmin)) ?

и т. Д.

Также этот базовый подход не оптимизирует выборку. Например, если моя функция f (x) = 5, мне не нужно выбирать xrange в 500 точках, мне нужно только два очка. Я мог бы сделать несколько эвристических проверок.

Но для такой функции, как sin (2 / x), мне нужно больше выборок около x (-1,1), как бы вы подошли к такой вещи?

Спасибо

Ответы [ 3 ]

1 голос
/ 05 декабря 2008

Вместо итерации по x в исходных координатах, итерации по холсту, а затем преобразование обратно в исходные координаты:

for (int xcanvas = 0; xcanvas <= 250; i++) {
    double x = ((xmax - xmin) * xcanvas / 250.0) + xmin;
    double y = f(x);

    int ycanvas = 250 * (y - ymin) / (ymax - ymin) + .5;

    // Plot (xcanvas, ycanvas)
}

Это дает вам ровно одну оценку функции для каждого столбца холста.

0 голосов
/ 05 декабря 2008

Я думаю, что начну с рассуждений об этом с точки зрения трансформации из холста в математический контекст.

(canvas_x, canvas_y) -> (maths_x, maths_y)
(maths_x, maths_y)   -> (canvas_x, canvas_y)

maths_x -> maths_y

Вы перебираете точки, которые можно отобразить, зацикливаясь на canvas_x.

Это будет означать несколько простых функций:

maths_x = maths_x_from_canvas_x(canvas_x, min_maths_x, max_maths_x)
maths_y = maths_y_from_maths_x(maths_x) # this is the function to be plotted.
canvas_y = canvas_y_from_maths_y(maths_y, min_maths_y, max_maths_y)

if (canvas_y not out of bounds) plot(canvas_x, canvas_y)

Как только вы попадаете сюда, эти простые функции относительно просто записать в код.

Оптимизируйте отсюда.

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

0 голосов
/ 05 декабря 2008
  1. Вы можете оценить производную (если она есть).
  2. Вы можете использовать двунаправленный (дихотомический) подход: оценить разницу и при необходимости разделить сегмент.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...