1

在晚上的大部分时间里,我一直坐在铅笔上,试图回想如何实现可以导航 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'坐标是倒置的

换句话说:上面的数学应该注意显示一个点,同时考虑到比例和视口的位置。我对么 ?如果不是,请证明我错了。

4

2 回答 2

2

对,那是正确的。视口中的所有点都将出现在画布上——而且只有那些点——并且所有内容都将正面朝上出现,并保留距离。

于 2009-10-20T22:27:14.417 回答
0

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

Point2 vp = viewport.transformFromWorld(Point2 pw);

和相反的:

Point2 pw = viewport.transformToWorld(Point2 vp);

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

于 2009-10-20T23:30:12.947 回答