首页 > 解决方案 > 如何比较两个矩形/大小的比率以确定它们的差异百分比?

问题描述

我有一个比例为 80:40 的 ractangle 和其他具有相似纵横比的矩形,例如 80:35、85:45,unbral 是小数或整数。

我的问题是我需要将其他矩形与第一个矩形进行比较,并确定它们各自纵横比的百分比差异,例如:80:30 的纵横比与 80:40 相差 20%。

(20%不是计算出来的数据,只是一个例子,因为我不知道怎么做)。

难道一个完全相反的纵横比是 100% 不同的吗?例如:80:40 与 40:80 有 100% 的差异

想象一下,你有一个矩形集合和一个目标矩形,你必须过滤集合,只留下那些长宽比与目标矩形相似的矩形。

样本:

private float GetDiffRatio(FloatSize size1, FloatSize size2) {
    float fixedR1 = size1.Width / size1.Height;
    if (fixedR1 >= 0)
        // Invert and negative.
        fixedR1 = -(size1.Height / size1.Width);

    float fixedR2 = size2.Width / size2.Height;
    if (fixedR2 >= 0)
        // Invert and negative.
        fixedR2 = -(size2.Height / size1.Width);

    float rDiff = fixedR1 - fixedR2;
    return rDiff * 100f;
}

测试:

float diffRatio = GetDiffRatio(new FloatSize(100f, 50f), new FloatSize(50f, 100f));

结果= -100f

Test2(参数倒序):

float diffRatio = GetDiffRatio(new FloatSize(50f, 100f), new FloatSize(100f, 50f));

结果= 100f

我不确定这是一个有效或正确的形式,我不知道它是否可以生成任何返回错误百分比相似性的条件。

标签: mathdiscrete-mathematics

解决方案


这个问题的答案很大程度上取决于您到底要做什么,或者您打算使用这个相似函数。我发现说相反的纵横比导致 0% 的相似性是非常不直观的。我认为比较两个矩形 r1=(2.1,2) 和 r2=(2,2.1) 应该更相似,例如 r3=(1,5) r4=(5,1)。这并不是我说在某些情况下拥有像你这样的相似函数没有用,我只是想解释一下,这在很大程度上取决于你在做什么......

我想说一个非常明显的解决方案是将每个矩形的宽度除以高度,并将减去两个值的绝对值作为相似度函数 s1。因此,对于我提供的示例,结果将是:

s1(r1,r2) = | 2.1/2 - 2/2.1 | = 0.0976...

s1(r2,r3) = | 1/5 - 5/1 | = 4.8

如果您的值介于 0 和 1 之间也很重要,您可以另外插入此值,例如此函数...

在哪里

b 必须小于 0,并且是一个参数,您可以控制函数收敛到 1 的速度。您可以在此处使用它:https ://www.desmos.com/calculator/nwlq3ujouq

如果您真的想要您建议的东西,我只需执行以下操作:

您接受每个矩形都在比率 a:b 和 c:d 之间的约束。比你计算 x1=a/b 和 x2=c/d 然后你在这些值之间插入从零到一的值,所以:

h(x1) = 0

h(x2) = 1

如果您需要有关如何执行此操作的更多详细信息,请查看https://en.wikipedia.org/wiki/Linear_interpolation但我认为这非常简单。

然后可以使用差异的绝对值再次构建相似度函数 s3

s3=| h(r1)-h(r2) |


推荐阅读