需要有人来验证我的数学是否正确

时间:2009-10-20 22:16:51

标签: math scaling viewport

我一直用铅笔坐在晚上的大部分时间试图回忆如何实现可以导航2D区域的可缩放视口。自从我第一次听说它以来已经有一段时间了,但我想我已经弄明白了,我只需要验证一下。

我们有一个带有“经典”笛卡尔坐标系的2D世界,x轴指向右边,y轴指向顶部。

在世界范围内,我们有一个由2个点Pmin和Pmax定义的矩形视口,其中: Pmin(xmin,ymin),Pmax(xmax,ymax)。这些点定义了视口的大小,位置和比例

在世界范围内,我们有一个点P,其中 Pmin< P(x,y)< PMAX 即可。 (P在视口矩形中)

要显示整个该死的东西,我们有一个画布(例如)有一个“改变”的坐标系,x轴指向右, y轴指向下。画布的大小为 MaxX和MaxY 。画布的大小是固定的。

现在,为了在画布中显示点 P'(x',y'),我需要像这样计算它的位置:

x' = (x - xmin) * Sx,其中Sx = MaxX / (xmax - xmin)

y' = MaxY - (y - ymin) * Sy,其中Sy = MaxY / (ymax - ymin)

*请注意,由于画布的坐标系,y'坐标被反转

换句话说:上面的数学应该考虑到在考虑比例和vieport的位置时显示一个点。我对么 ?如果没有,请证明我错了。

2 个答案:

答案 0 :(得分:2)

是的,这是正确的。视口中的所有点都将显示在画布上 - 并且只显示那些点 - 并且所有内容都会在保持距离的情况下正面显示。

答案 1 :(得分:0)

您可能会发现为视口创建一个管理比例和范围的类很有用。它可以有诸如

之类的方法
Point2 vp = viewport.transformFromWorld(Point2 pw);

和逆:

Point2 pw = viewport.transformToWorld(Point2 vp);

如果您在具有视口坐标的视点中选择一个点并希望转换为世界,这将非常有用。