Алгоритм 2D Референциальная традукция

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

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

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

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

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

так далее..

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

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

Спасибо

3 ответа

Вместо итерации по 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)
}

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

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

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

(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 Это хороший пример, но вы гарантированно не будете пробовать больше, чем можете показать.

Другие вопросы по тегам