我有一个小数比,其比例为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
我不确定这是有效还是正确的形式,我不知道它是否会生成任何会返回相似百分比错误的条件。
这个问题的答案在很大程度上取决于您到底想做什么,或者您打算使用此相似性函数。说相反的长宽比会导致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)|