如何找到三个间隔之间的交点?

时间:2017-03-07 17:53:16

标签: c++ algorithm

我正在尝试找到三个行号之间的交集。

例如:

    line 1 = 1.1 - 9.9
    line 2 = 2.4 - 8.5
    line 3 = 6.4 - 9
答案是6.4- 8.5

我目前的方式还有很多其他方面。还有其他方法可以做到这一点,然后有很多,如果否则。

2 个答案:

答案 0 :(得分:3)

您可以使用递归模板执行此操作:

#include <algorithm>

template<typename T>
auto intersection(const T& a, const T&b)
{
    return std::make_pair(std::max(a.first, b.first), std::min(a.second, b.second));
}

template<typename T, typename... Rest>
auto intersection(const T& a, const T&b, const Rest&... r)
{
    return intersection(intersection(a, b), r...);
}


int main()
{
    auto const line1 = std::make_pair(1.1, 9.9);
    auto const line2 = std::make_pair(2.4, 8.5);
    auto const line3 = std::make_pair(6.4, 9.);

    return intersection(line1, line2, line3) != std::make_pair(6.4, 8.5);
}

请注意,在这个简单的实现中,first&gt; = second的对意味着空间隔。

更简单的功能是使用带min个参数的maxinitializer_list形式:

#include <algorithm>

template <typename ...Ts>
auto intersection(const Ts&... ps)
{
    return std::make_pair(std::max({ps.first...}), std::min({ps.second...}));
}

感谢Jarod42建议。

答案 1 :(得分:0)

由于这被标记为C ++,我将假定需要C ++答案。

提升间隔库正好解决了这个问题以及其他与区间运算有关的问题。 http://www.boost.org/doc/libs/1_63_0/libs/numeric/interval/doc/interval.htm