【问题标题】:Translating axes while changing bounds在更改边界时平移轴
【发布时间】:2015-08-12 18:35:43
【问题描述】:

所以我理解翻译:

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

其中 (x,y) 是相对于 xy 系统的旧坐标,(x',y') 是相对于 x'y' 系统的新坐标,(x0,y0) 是相对于旧 xy 系统的坐标。

我希望在翻译系统的同时也改变界限。我想在固定窗口内“放大”图形的特定部分,这将改变原点和边界。

作为参考,我问了一个类似的问题here,但我认为这有点令人困惑。

【问题讨论】:

    标签: c++ allegro5 cartesian-coordinates


    【解决方案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) = 0p(2) = 600q(-1) = 600q(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)
    

    【讨论】:

    • 非常感谢。看来这正是我所需要的。
    • 您介意解释一下这些转换是如何以及为什么起作用的吗?或者可能是指向解释它的页面的链接?
    • 它们都是经过两点的直线方程,两点是屏幕和绘图中两个角的已知坐标。所以我们知道(pll, qll) 应该被转换为(xll, yll)(pur, qur)(xur, yur)。现在,我们为xy 选择的任何其他值在pq 中都有一个对应部分,它位于通过这两个点的线上。
    • 您甚至不必使用我提到的两个角。例如,您甚至可以使用其中一个角和中心,或中心和窗口的宽度和高度,但所有的转换只是线性插值:-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-12
    • 1970-01-01
    • 2013-02-06
    • 2015-09-03
    • 2011-09-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多