Перевод осей при изменении границ

Я так понимаю переводить:

x = x' + x0     or     x' = x - x0
y = y' + y0     or     y' = y - y0

где (x,y) — старые координаты относительно системы xy, (x',y') — новые координаты относительно системы x'y', а (x0,y0) — координаты относительно старой системы xy.

Я хочу перевести систему, а также изменить границы. Я хочу «увеличить» конкретный участок графика в фиксированном окне, что изменит начало координат и границы.

Для справки, я задал аналогичный вопрос здесь, но я думаю, что это был немного более запутанно.


person mchoy25    schedule 12.08.2015    source источник


Ответы (1)


Надеюсь, это ответит на ваш вопрос:

Предположим, что окно, в котором вы рисуете (в координатах пикселя), таково, что нижний левый угол равен (p_ll, q_ll), а верхний правый угол — (p_ur, q_ur).

Однако в ваших декартовых координатах одни и те же местоположения — (x_ll, y_ll) и (x_ur, y_ur). Тогда вам нужны следующие преобразования:

p(x) = p_ll + (p_ur - p_ll) * (x - x_ll) / (x_ur - x_ll)
q(y) = q_ll + (q_ur - q_ll) * (y - y_ll) / (y_ur - y_ll)

Так, например, если размер окна x from 0 to 600 and y from 0 to 600, а границы графика x from -2 to 2 and y from -1 to 1, то точка с координатой (0.0, 0.0) будет находиться в (p(0), q(0)) или

p(0.0) = 0 + (600 - 0) * (0 -(-2)) / (2 - (-2)) = 300
q(0.0) = 600 + (0 - 600) * (0 - (-1)) / (1 - (-1)) = 300

то же самое для любой другой точки. Вы можете попробовать уравнение, и вы должны найти, что p(-2) = 0, p(2) = 600, q(-1) = 600 и q(1) = 0.

Обратите внимание, что здесь я предполагаю, что координата y пикселя указывает вниз (как это делают почти все координаты монитора), а декартова координата y указывает вверх.

Если вы хотите перейти от координаты экрана к координате графика (например, если вы хотите преобразовать положение щелчка мыши в его декартову эквивалентную часть), используйте эти обратные преобразования:

x(p) = x_ll + (x_ur - x_ll) * (p - p_ll) / (p_ur - p_ll)
y(q) = y_ll + (y_ur - y_ll) * (q - q_ll) / (q_ur - q_ll)
person triple_r    schedule 12.08.2015
comment
Большое спасибо. Кажется, это именно то, что мне было нужно. - person mchoy25; 12.08.2015
comment
Не могли бы вы объяснить, как и почему эти преобразования работают? Или, может быть, ссылку на страницу, объясняющую это? - person mchoy25; 13.08.2015
comment
Оба они являются уравнениями линий, проходящих через две точки, и эти две точки являются известными координатами двух углов как на экране, так и на графике. Итак, мы знаем, что (pll, qll) должно быть преобразовано в (xll, yll), а (pur, qur) в (xur, yur). Теперь любое другое значение, которое мы выбираем для x или y, имеет эквивалентную часть в p и q, которые находятся на линии, проходящей через эти две точки. - person triple_r; 13.08.2015
comment
Вам даже не нужно использовать два угла, которые я упомянул. Например, можно даже использовать один из углов и центр, или центр и ширину и высоту окна, но поверх всех преобразований будут просто линейные интерполяции :-) - person triple_r; 13.08.2015