如何比较两个矩形/大小的比率以确定它们的差异百分比?

问题描述 投票:0回答:1

我有一个小数比,其比例为80:40,而其他矩形具有类似的宽高比,例如80:35、85:45,则本义是十进制或整数。

我的问题是,我需要将其他矩形与第一个矩形进行比较,并确定它们各自的纵横比的百分比差异,例如: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

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

math discrete-mathematics
1个回答
0
投票

这个问题的答案在很大程度上取决于您到底想做什么,或者您打算使用此相似性函数。说相反的长宽比会导致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)|

© www.soinside.com 2019 - 2024. All rights reserved.