微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何将一个范围内的值插入到另一个范围内

如何解决如何将一个范围内的值插入到另一个范围内

我有 2 个双精度值,可以从起始值 62.243 到结束值 79.495。我还有另外 2 个双精度值,可以从起始值 4.456 到结束值 7.687

double start_1 = 62.243;
double end_1 = 79.495;

double start_2 = 4.456;
double end_2 = 7.687;

现在,如果我在 start_1end_1 之间选择一个值,我想将相同的值插入到 start_2end_2间的值中。

问题:
如何在 C++ 中实现下面的函数来完成我上面描述的功能

double InterpolateAValue(const double start_1,const double end_1,const double start_2,const double end_2,double value_between_start_1_and_end_1) {
     // How to get a value between start_2 and end_2 which matches the position of value_between_start_1_and_end_1 in the range of `start_1` and `end_1`
};

我认为上述函数应该通过以下单元测试。

EXPECT_DOUBLE_EQ(40.0,InterpolateAValue(10.0,20.0,30.0,50.0,15.0));

std::lerp 似乎在做我需要的事情,但不完全是。我在 C++11 上。我在这里采用 double 作为类型。我也可以选择 float,但希望了解双打如何影响数学也是问题的一部分。

解决方法

对于数字 value_between_start_1_and_end_1

lambda = (value_between_start_1_and_end_1 - start_1) / (end_1 - start_1)

告诉您沿着 1 线有多远。 0 表示您在 start_1,1 表示您在 end_1

然后使用

start_2 + lambda * (end_2 - start_2)

得到沿2线的对应位置。我已将计算分为两个阶段,但除了放弃调试方便之外,您还可以一步合并。

就我个人而言,我总是为此使用 double。由于意外的类型转换,float 在现代系统上甚至可能更慢。当然,您需要检查 start_1end_1 是否不同。

,

从 C++20 开始就有 std::lerp

计算 a+t(b−a),即参数 t 的 a 和 b 之间的线性插值(或外推,当 t 超出范围 [0,1] 时)。

它做了你想要的一半。您的 image_picker_webt。因此你可以这样做

t = ( value - start_1) / (end_1 - start_1)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。