math - 如何比较两个矩形/大小的比率以确定它们的差异百分比?
问题描述
我有一个比例为 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
我不确定这是一个有效或正确的形式,我不知道它是否可以生成任何返回错误百分比相似性的条件。
解决方案
这个问题的答案很大程度上取决于您到底要做什么,或者您打算使用这个相似函数。我发现说相反的纵横比导致 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) |
推荐阅读
- postman - 邮递员自动回复
- c# - 使用 serilog 的多个项目中的相同日志文件
- java - 如何使用逗号和换行符解析 .txt 文件
- excel - Firebase with angular:仅将所选字段导出到使用 angular 检索的 firebase 中的 excel
- ruby - 我可以在我的 Vagrantfile 运行的 Ruby 脚本中运行 GETS
- javascript - 我们可以在 sql 中将对象作为参数传递给数组,以防止使用 promise-mysql 模块在 nodejs 中注入 sql
- azure-devops - 自定义 Azure DevOps 项目的首页
- python - 为什么 numpy.int16 在我位掩码后变成 numpy.float64?
- python - 时间序列数据的 sqlalchemy 查询,格式为 (step, next_step) 时间相邻样本对
- java - 如何使用 Java 读取 XML 响应