Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/52.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Math 如何比较两个矩形/大小的比率以确定它们的差异百分比?_Math_Discrete Mathematics - Fatal编程技术网

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

Math 如何比较两个矩形/大小的比率以确定它们的差异百分比?,math,discrete-mathematics,Math,Discrete Mathematics,我有一个ractangle,它的比率是80:40,其他的矩形有类似的长宽比,比如80:35,85:45,unbal是十进制或整数 我的问题是,我需要将其他矩形与第一个矩形进行比较,并确定它们各自的纵横比百分比的差异,例如:80:30与80:40的纵横比相差20% (20%不是一个计算数据,这是一个示例想法,因为我不知道如何做到这一点) 难道完全相反的纵横比是100%不同吗?例如:80:40与40:80有100%的不同 假设您有一个矩形集合和一个目标矩形,您必须过滤该集合,只留下那些纵横比与目标矩

我有一个ractangle,它的比率是80:40,其他的矩形有类似的长宽比,比如80:35,85:45,unbal是十进制或整数

我的问题是,我需要将其他矩形与第一个矩形进行比较,并确定它们各自的纵横比百分比的差异,例如: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));
float diffRatio = GetDiffRatio(new FloatSize(50f, 100f), new FloatSize(100f, 50f));
测试:

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));
float diffRatio = GetDiffRatio(new FloatSize(50f, 100f), new FloatSize(100f, 50f));
结果=-100f

Test2(参数的倒序):

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));
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的速度。你可以在这里玩:

如果你真的想得到你建议的东西,我只想做以下几件事:

你的约束是每个矩形都在a:b和c:d之间。然后计算x1=a/b和x2=c/d,然后在这些值之间将值从零插值到一,以便:

h(x1)=0

h(x2)=1

如果你需要更多关于如何做到这一点的细节,请看这里,但我认为这是非常直接的

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


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

这个问题的答案在很大程度上取决于你到底想做什么,或者你计划使用这个相似性函数做什么。我发现说相反的长宽比导致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的速度。你可以在这里玩:

如果你真的想得到你建议的东西,我只想做以下几件事:

你的约束是每个矩形都在a:b和c:d之间。然后计算x1=a/b和x2=c/d,然后在这些值之间将值从零插值到一,以便:

h(x1)=0

h(x2)=1

如果你需要更多关于如何做到这一点的细节,请看这里,但我认为这是非常直接的

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


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

我编辑了问题并给出了一个例子。我编辑了问题并给出了一个例子。