如何将点从一个矩形转换为缩放矩形中的一个点?

时间:2010-04-29 00:03:27

标签: graphics scaling

我有一个图像(i)已从其原始大小(rectLarge)缩放以适合较小的矩形(rectSmall)。给定rectSmall中的点p,我该如何将其转换为rectLarge中的一个点。

为了使这个具体化,假设我有一个20x20的图像,它被缩放到10x10矩形。较小矩形中的点(1,1)应缩放到较大矩形中的一个点(即(2,2))。

我正试图通过以下方式实现这一目标:

result.x = point.x * (destRect.size.width / srcRect.size.width );
result.y = point.y * (destRect.size.height / srcRect.size.height);

但是,此代码生成的点不正确 - 它们不会映射到原始图像中的适当点。我做错了什么?

3 个答案:

答案 0 :(得分:1)

您使用的是哪种语言?

如果这是C,并且rect.size.height等是整数,那么你有一个重大的舍入问题。假设您将尺寸10, 10从尺寸20x20缩放到尺寸30x30。您的计算结果如下:

result.x = 10 * (30 / 20);

这简化为:

result.x = 10 * (1);

解决这个问题的最简单方法是删除括号:

result.x = point.x * destRect.size.width / srcRect.size.width;
result.y = point.y * destRect.size.height / srcRect.size.height;

现在,您的计算10 * 30 / 20简化为300 / 20,然后简化为15,这就是您想要的。

请注意,您仍然会遇到轻微的舍入问题,但除非您能够获得子像素位置,否则这个问题就像您将要获得的那样接近。

答案 1 :(得分:0)

什么是“适当的点”?如果srcRect的大小大于destRect,那么您的代码是正确的。此外,不要忘记result.xresult.y将是一个浮点数,并在图像中使用它们需要围绕它或进行双线性插值等。之前,我可以给出更多详细的答案,您将如何处理result

答案 2 :(得分:0)

我想问题是你的矩形不是(0, 0),因此,你不能像缩放它的尺寸一样缩放其中的每个点。

您必须确定矩形中某些定位点的偏移量(例如,左上角),然后结果点为anchor_point.x + offset.x * (horizontal_scale_ratio)yvertical_scale_rationew_width / old_width 1}})。

比率有new_height / old_height和{{1}}。