Алгоритм 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)
}
Это дает вам ровно одну оценку функции для каждого столбца холста.
- Вы можете оценить производную (если она у вас есть).
- Вы можете использовать двунаправленный (дихотомический) подход: оценить разницу и разделить сегмент, если необходимо.
Я думаю, что начну с рассуждений об этом с точки зрения трансформации из холста в математический контекст.
(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
Это хороший пример, но вы гарантированно не будете пробовать больше, чем можете показать.