我一直用铅笔坐在晚上的大部分时间试图回忆如何实现可以导航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的位置时显示一个点。我对么 ?如果没有,请证明我错了。
答案 0 :(得分:2)
是的,这是正确的。视口中的所有点都将显示在画布上 - 并且只显示那些点 - 并且所有内容都会在保持距离的情况下正面显示。
答案 1 :(得分:0)
您可能会发现为视口创建一个管理比例和范围的类很有用。它可以有诸如
之类的方法Point2 vp = viewport.transformFromWorld(Point2 pw);
和逆:
Point2 pw = viewport.transformToWorld(Point2 vp);
如果您在具有视口坐标的视点中选择一个点并希望转换为世界,这将非常有用。