【问题标题】:how to calculate scale factor between 2 NON-SIMILAR rectangles如何计算2个非相似矩形之间的比例因子
【发布时间】:2013-07-01 17:14:01
【问题描述】:

希望有人可以帮助我:)

我正在尝试将一个点从地图(纬度、经度)缩放到图像(x、y)。 为此,我需要找到 2 个非相似矩形之间的比例因子(我认为)。

我会澄清一下,比如说:

矩形 1:A(40.0, 50.0) B(40.0, 56.0) C(43.0, 56.0) D(43.0, 50.0)

(纬度增量 = 3,经度增量 = 6)。

矩形2:E(0, 0) F(500, 0) G(500, 300) H(0, 300)

(X 增量 = 500,Y 增量 = 300)。

如何将点 P(41.5, 52.5) 从矩形 1 缩放到矩形 2 上的点 (x, y)?

更新:

总体思路:

我正在尝试在自定义图像(不是地图图像,我自己的绘图)上显示用户当前位置(纬度、经度),因此我无法使用地图(MKMapKit、谷歌、汤姆汤姆) .

我有用户当前位置(通过 CoreLocation)和一张图片 (800x460)。

我正在绘制的区域很小,所以我不需要担心地球的曲线。

我正在尝试找到一个公式来帮助我将我的用户(经纬度)位置缩放到我的图像中(在我的 iPhone 屏幕上)

谢谢!!!

【问题讨论】:

  • 嗯,您需要找到从 rect1 到 rect2 的比例,然后将您的点乘以该比例。由于矩形不相似,我认为您必须找到与 rect1 相似且适合 rect2 的最大矩形。希望这可以帮助。干杯!
  • 谢谢乔治!不过,我知道存在这样的公式,但我就是找不到/不记得了。
  • 查看我的答案以获得公式。

标签: ios image map scale


【解决方案1】:

嗯,得到与第一个相似但适合第二个的矩形并不难。方法如下:

CGRect rect1, rect2; //your rectangles.
float scale = MIN(rect1.size.width / rect2.size.width , rect1.size.height / rect2.size.height);
CGRect resultedRect;
resultedRect.origin = rect2.origin;
resultedRect.size = CGSizeMake(rect2.size.width * scale, rect2.size.height * scale); 
//resultedRect is similar with rect1 but fits in rect2. You can now multiply your point with "scale" and get the new position.

我不确定这是你想要达到的目标。

问候,

乔治

【讨论】:

  • 嘿乔治!感谢您的代码!我试过了。不幸的是,正如我所怀疑的那样,我的图像变形并且缩放点关闭:(我试图在自定义图像(不是地图图像,我自己的绘图)上显示用户当前位置(纬度,经度)因此可以'不使用地图(MKMapKit,Google,Tom-Tom)。我有用户当前位置(通过 CoreLocation)和图像(800x460)。我正在映射的区域很小,所以我不需要担心关于地球的曲线。几天来,我一直在尝试找到一个公式来帮助我将我的用户(纬度,经度)位置缩放到我的图像中(在我的 iPhone 屏幕上)。
  • Ooooh , ok ,那么你应该首先得到图像区域角落的地图坐标。然后很容易获得该矩形内的位置。抱歉,一开始我没看懂目标
  • 酷 :) 顺便说一句,我有十进制值(不是度数)区域(纬度,经度)的地图坐标(4 个角)。我只是将随机(Lat,Lon)点(x,y)“翻译”(或显示)到(或显示)我的图像。有什么想法吗?谢谢!
  • 我认为与我的回答中的想法相同。 rect1 应该是坐标的矩形(图像的 lat , lon 以及适当的宽度和高度,表示 lat 点的宽度和 lon 点的高度), rect2 应该类似于CGRectMake(0,0,yourImageWidth , yourImageHeight)。此外,该点应表示用户在 rect1 中的位置。所以先做point.x -= rect1.origin.x;point.y -= rect1.origin.y;之类的事情,然后做我在答案中写的事情。我认为只是初始值好的问题。
  • 一件事......你可以使用这个:- (CGRect)convertRegion:(MKCoordinateRegion)region toRectToView:(UIView *)view。还要确保将视网膜显示考虑在内*例如将给定矩形的原点和大小乘以[UIScreen mainScreen].scale
【解决方案2】:

如果您对它引入的扭曲感到满意,您可以分别处理 x(latitude) 和 y(longitude) 坐标。

如果您认为您不会对这种扭曲感到满意,您建议如何处理 latitudelongitude 中不相称的尺度? 1°lat != 1°long 在您问题的纬度中。

如果您需要帮助从一种长度的线扩展到另一种长度的线,请更新您的问题。

编辑跟随 OP 的评论。

好的,所以您想将纬度 3° 的间隔映射到 Y 中 300 像素的间隔(我猜),将经度 6° 的间隔映射到 X 中 500 像素的间隔。

我仍然不完全确定您是否担心引入进一步的扭曲;如果你不是这很容易。我假设屏幕区域的左下角是像素 (1,1),这就是您想要映射 (40°,56°) 的位置。对于该点以东的每分钟经度,向右移动(500/360) 像素。对于拐角以北纬度的每一分钟,向上移动(300/180) 像素。

这种粗略的现成投影不会保留 2D 形状的外观(例如,正方形将投影为矩形),但有许多广泛使用的地图投影不保留形状。

【讨论】:

  • 感谢您的回答!我已经按照您的要求更新了我的问题:) 我想对了吗?这是正确的方法吗?
  • 哦...对不起,我的意思是十进制的纬度和经度,而不是度数。我非常关心扭曲,不能允许任何扭曲。出于某种原因,我认为这是一个单一公式的问题......我猜我错了:)谢谢你的时间!
猜你喜欢
  • 1970-01-01
  • 2021-03-30
  • 2023-03-25
  • 2015-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-20
  • 1970-01-01
相关资源
最近更新 更多