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