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

Graphics 如何将点从一个矩形转换为缩放矩形中的点?,graphics,scaling,Graphics,Scaling,我有一个图像(I),它从原始大小(rectlagle)缩放到了一个较小的矩形(rectlagle)。给定rectSmall中的点p,如何将其转换为rectLarge中的点 为了使它具体化,假设我有一个20x20的图像,它被缩放成10x10的矩形。较小矩形中的点(1,1)应放大到较大矩形中的点(即(2,2)) 我正试图通过以下方式实现这一目标: result.x = point.x * (destRect.size.width / srcRect.size.width ); result.y =

我有一个图像(I),它从原始大小(rectlagle)缩放到了一个较小的矩形(rectlagle)。给定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);

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

什么是“适当点”?如果
srrect
的大小大于
destect
,则您的代码是正确的。另外,不要忘记,
result.x
result.y
将是一个浮点数,要在图像中使用它们,您需要对其进行四舍五入或双线性插值等。在此之前,我可以给出更详细的答案,您将如何处理
result

什么是“合适的点”?如果
srrect
的大小大于
destect
,则您的代码是正确的。另外,不要忘记,
result.x
result.y
将是一个浮点数,要在图像中使用它们,需要对其进行四舍五入或双线性插值等。在此之前,我可以给出更详细的答案,您将如何处理
结果

我想问题在于您的矩形未定位在
(0,0)
处,因此,您无法以与缩放其尺寸相同的方式缩放其中的每个点

您必须确定与矩形中某个定位点(例如,左上点)的偏移量,然后生成的点将是
定位点.x+offset.x*(水平比例)
,对于
y
(使用
垂直比例
)也是如此


有两种比率:新宽度/旧宽度和新高度/旧高度。我想问题在于矩形的位置不在
(0,0)
,因此,不能像缩放其尺寸一样缩放其中的每个点

您必须确定与矩形中某个定位点(例如,左上点)的偏移量,然后生成的点将是
定位点.x+offset.x*(水平比例)
,对于
y
(使用
垂直比例
)也是如此


有新/旧宽度和新/旧高度之比,你用的是什么语言

如果这是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
,这就是您想要的


请注意,您仍然有一个轻微的取整问题,但除非您能够获得亚像素位置,否则这将是您所能获得的最接近的位置。

您使用的是什么语言

如果这是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
,这就是您想要的


请注意,您仍然有一个轻微的舍入问题,但除非您能够获得亚像素位置,否则这将是您所能获得的最接近的位置。

这些点以什么方式没有正确定位?请记住,有时缩放到除最大公分母的倍数以外的其他值会在除法中产生非整数值,而不是某种形式的四舍五入。加布里埃尔,我在下面对雅各布的回答作了一些补充解释。你能给出一些给出错误结果的大小示例吗?destRect.size、srcRect.size、point和result,这样我们就可以更好地帮助调试它了?这些点以什么方式没有正确定位?请记住,有时缩放到除最大公分母的倍数以外的其他值会在除法中产生非整数值,而不是某种形式的四舍五入。加布里埃尔,我在下面对雅各布的回答作了一些补充解释。你能给出一些给出错误结果的大小示例吗?destRect.size、srrect.size、point和result,这样我们就可以更好地帮助调试它了?Objective-C,所以C算术规则适用。这些值都是float.Objective-C,因此应用C算术规则。这些值都是浮点数。(点.x,点.y)相对于较小矩形的左上角。那么我想你的问题要么在另一个地方,要么像这样。您发布的代码块看起来不错,我不怀疑其中有任何问题。(点.x,点.y)相对于较小矩形的左上角。然后我认为您的问题要么在另一个地方,要么在smth这样的地方。您发布的代码看起来不错,我不怀疑其中有任何问题。更详细地说,我有一个比可用屏幕稍大的图像。在“预览”模式下,用户单击一个点以指示一个区域,图像会稍微缩小。我需要将该点从预览图像的矩形转换为原始图像,以便处理该区域。srcRect比destRect大一点,我有一个比t稍大一点的图像