Algorithm 数学:缩放坐标系,使某些点获得整数坐标

Algorithm 数学:缩放坐标系,使某些点获得整数坐标,algorithm,math,geometry,Algorithm,Math,Geometry,这更像是一个数学问题。我正在寻找伪代码中的算法来解决它 给定的是一个一维坐标系,包含多个点。点的坐标可以是浮点。 现在我正在寻找一个缩放此坐标系的因子,以便所有点都位于固定数量(即整数坐标) 如果我没有弄错的话,这个问题应该有一个解决方案,只要点数不是无限的 如果我错了,并且这个问题没有解析解,我对一个尽可能接近这个解的算法感兴趣。(即坐标看起来像15.0001) 如果您对具体问题感兴趣: 我想克服adobe flash中众所周知的像素捕捉问题,如果整个阶段被缩放,位图边界将减少一半像素。我想为

这更像是一个数学问题。我正在寻找伪代码中的算法来解决它

给定的是一个一维坐标系,包含多个点。点的坐标可以是浮点。

现在我正在寻找一个缩放此坐标系的因子,以便所有点都位于固定数量(即整数坐标)

如果我没有弄错的话,这个问题应该有一个解决方案,只要点数不是无限的

如果我错了,并且这个问题没有解析解,我对一个尽可能接近这个解的算法感兴趣。(即坐标看起来像15.0001)

如果您对具体问题感兴趣: 我想克服adobe flash中众所周知的像素捕捉问题,如果整个阶段被缩放,位图边界将减少一半像素。我想为舞台找出一个理想的比例因子,使我的位图位于整个(屏幕)像素坐标上

由于我在舞台上放置了两个位图,每个方向(x,y)上的点数将为4


谢谢

如果我处在你的处境,我自己的倾向是使用有理数,而不是浮点数。
您正在寻找的算法是寻找最小公分母。

浮点数是一个整数,乘以二的幂(幂可能是负数)

因此,在你的输入中找出二的最大必要幂,这会给你一个有效的比例因子。2的幂不只是浮点指数的-1倍,它还不止这个数(根据最低有效1位在有效位的位置)

它也是最优的,因为如果
x
乘以2的幂是一个奇数整数,那么
x
在其浮点表示中已经是最简单的有理形式,没有更小的整数可以乘以
x
得到整数

显然,如果在输入中混合了大小值,那么得到的整数往往会大于64位。所以有一个解析解,但考虑到你想对结果做什么,可能不是一个很好的解析解

请注意,这种方法将浮点视为精确表示,而事实并非如此。通过将每个浮点数表示为分母较小的有理数(在某些定义的公差范围内),然后取所有分母的最小公倍数,可以得到更合理的结果

但问题是近似过程——如果输入浮点值是0.334[*],那么我通常无法确定给我的人是否真的是0.334,或者是1/3,有一些不准确。因此,我不知道是使用比例因子3表示缩放结果为1,还是使用比例因子500表示缩放结果为167。这只是一个输入,更不用说一堆输入了

对于4个输入,允许的最终公差为0.0001,您可能会找到与每个输入最接近的10个具有某个最大分母的有理数,然后尝试10^4种不同的可能性,并查看结果比例因子是否给出任何与整数相差太远的值。蛮力似乎令人讨厌,但你至少可以在前进的过程中限制搜索。此外,“最大分母”可能用因子分解中的素数来表示,而不仅仅是数字,因为如果你能在它们之间找到很多公因子,那么它们的lcm会更小,因此在缩放后与整数的偏差会更小


[*]不是说0.334是一个精确的浮点值,而是诸如此类的东西。十进制示例更容易。

正如建议的那样,您必须将浮点数转换为有理数。确定一个公差ε,对于每个坐标,在ε内找到其最佳有理近似值

中概述了算法和定义

将所有坐标转换为有理数后,将按分母的最小公倍数进行缩放

请注意,后一个数字可能会变得非常巨大,因此您可能希望尝试使用ε来控制分母。

如果您谈论的是数字,那么根据维基百科,数字可以这样表示:

从这个公式你可以推断,如果你乘以2127+23,你总是得到一个整数。(实际上,当
e
0
时,您必须使用另一个公式来计算“次正常”数字的特殊范围,因此2126+23就足够了。有关详细信息,请参阅链接的wikipedia文章。)


要在代码中实现这一点,您可能需要从浮点值中的位提取上述公式中的因子。然后,您将需要某种对无限大小数字的支持,以表示缩放的整数结果(例如,在.NET中)。大多数语言/平台中的正常基元类型通常被限制为更小的大小。

这确实是统计推断与降噪相结合的问题。这是我即将尝试的方法。我假设你试图得到一个规则间隔的二维网格,但是类似的方法可以在一个规则间隔的三维网格上工作

首先,将所有差异制成表格,注意(dx,dy)和(-dx,-dy)表示相同的位移,因此存在一个等价关系。将在预先分配的阈值(ε)内的差异分组。Epsilon应足够大,以捕获由于随机噪声或缺乏图像分辨率而产生的测量误差,但应足够小,以避免意外组合簇

按簇的平均大小对簇进行排序(dr=root(dx^2+dy^2))

如果原始网格是