计算矩形纵横比方差的函数
Function for calculating variance of aspect ratio of rectangles
如何实现计算两个给定矩形的纵横比方差的函数
所附图片有一些矩形。
对我个人而言,矩形 B
和矩形 C
之间纵横比的差异似乎与矩形 C
和矩形 [=14] 之间的方差相同=],但在数值上 B
和 C
之间的差异是 0.34
,而 C
和 D
之间的差异是 0.5
.
如何以编程和数学方式知道矩形 B
与矩形 C 相似,同样矩形 D
与矩形 C
相似?
也可以说矩形A
类似于矩形B
,就像矩形D
类似于矩形E
一样,因为方差他们的宽高比是一样的,但是数值上是不行的,因为A
和B
的区别是0.16
,而D
和[=的区别27=] 是 0.5
.
这是我试图编写的代码,这里有两种方法,我知道如何开始但我不知道如何继续实现它们。
class Program
{
static void Main(string[] args)
{
Rectangle A, B, C, D, E;
// First approach
double maxDiff = ???;
Console.WriteLine(IsSimilar(B, C, maxDiff)); // True
// Second approach
Console.WriteLine(GetDifference(B, C) == GetDifference(C, D)); // True
}
// -------------- First approach --------------
public static bool IsSimilar(Rectangle rectangle1, Rectangle rectangle2, double maxDiff)
{
var score1 = GetRatioScore(rectangle1);
var score2 = GetRatioScore(rectangle2);
return Math.Abs(score1 - score2) <= maxDiff;
}
private static double GetRatioScore(Rectangle rectangle)
{
...
return ...
}
// -------------- Second approach --------------
public static double GetDifference(Rectangle rectangle1, Rectangle rectangle2)
{
var ratio1 = rectangle1.Width / rectangle1.Height;
var ratio2 = rectangle2.Width / rectangle2.Height;
...
return ...
}
}
编辑
注意计算中涉及矩形的方向,所以矩形A
和矩形E
是完全不同的,长宽比不相等
给定一个边长为 a
和 b
的矩形,简单地计算比率为:
var ratio = a > b ? b/a : a/b;
矩形的方向似乎与您需要的比率无关,因此您必须想出一个与方向无关的比率;最简单的方法是始终将短边除以长边(或相反,一致性是关键)。
您需要一个描述纵横比的数字,其中:
- 宽度和高度对称,所以如果你把宽度换成高度,你会得到相同的数字,但符号相反。方块必须为零
- 如果将宽度和高度乘以相同的常数,数字不会改变
只能自己想办法了。令 F 为任意奇数单调递增函数。那么:
任何 F(w/sqrt(w * h)) - F(h/sqrt(w * h)) 都有效
任何 F(log(w) - log(h)) 都有效
我觉得我最喜欢的只是单位面积矩形的宽高之差:(w-h)/sqrt(w * h).
(w/h) - (h/w) 也有效,并且在幅度上与正常纵横比有点相似。
如何实现计算两个给定矩形的纵横比方差的函数
所附图片有一些矩形。
对我个人而言,矩形 B
和矩形 C
之间纵横比的差异似乎与矩形 C
和矩形 [=14] 之间的方差相同=],但在数值上 B
和 C
之间的差异是 0.34
,而 C
和 D
之间的差异是 0.5
.
如何以编程和数学方式知道矩形 B
与矩形 C 相似,同样矩形 D
与矩形 C
相似?
也可以说矩形A
类似于矩形B
,就像矩形D
类似于矩形E
一样,因为方差他们的宽高比是一样的,但是数值上是不行的,因为A
和B
的区别是0.16
,而D
和[=的区别27=] 是 0.5
.
这是我试图编写的代码,这里有两种方法,我知道如何开始但我不知道如何继续实现它们。
class Program
{
static void Main(string[] args)
{
Rectangle A, B, C, D, E;
// First approach
double maxDiff = ???;
Console.WriteLine(IsSimilar(B, C, maxDiff)); // True
// Second approach
Console.WriteLine(GetDifference(B, C) == GetDifference(C, D)); // True
}
// -------------- First approach --------------
public static bool IsSimilar(Rectangle rectangle1, Rectangle rectangle2, double maxDiff)
{
var score1 = GetRatioScore(rectangle1);
var score2 = GetRatioScore(rectangle2);
return Math.Abs(score1 - score2) <= maxDiff;
}
private static double GetRatioScore(Rectangle rectangle)
{
...
return ...
}
// -------------- Second approach --------------
public static double GetDifference(Rectangle rectangle1, Rectangle rectangle2)
{
var ratio1 = rectangle1.Width / rectangle1.Height;
var ratio2 = rectangle2.Width / rectangle2.Height;
...
return ...
}
}
编辑
注意计算中涉及矩形的方向,所以矩形A
和矩形E
是完全不同的,长宽比不相等
给定一个边长为 a
和 b
的矩形,简单地计算比率为:
var ratio = a > b ? b/a : a/b;
矩形的方向似乎与您需要的比率无关,因此您必须想出一个与方向无关的比率;最简单的方法是始终将短边除以长边(或相反,一致性是关键)。
您需要一个描述纵横比的数字,其中:
- 宽度和高度对称,所以如果你把宽度换成高度,你会得到相同的数字,但符号相反。方块必须为零
- 如果将宽度和高度乘以相同的常数,数字不会改变
只能自己想办法了。令 F 为任意奇数单调递增函数。那么:
任何 F(w/sqrt(w * h)) - F(h/sqrt(w * h)) 都有效
任何 F(log(w) - log(h)) 都有效
我觉得我最喜欢的只是单位面积矩形的宽高之差:(w-h)/sqrt(w * h).
(w/h) - (h/w) 也有效,并且在幅度上与正常纵横比有点相似。