From 8b52854cb54c13c210872f4ee96ba9a134f0ed77 Mon Sep 17 00:00:00 2001 From: Matt Borland Date: Thu, 2 Mar 2023 09:47:23 -0800 Subject: [PATCH 1/2] Use control points to determine amount of scratch space needed --- .../detail/bezier_polynomial_detail.hpp | 2 +- test/git_issue_959.cpp | 42 +++++++++++++++++++ 2 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 test/git_issue_959.cpp diff --git a/include/boost/math/interpolators/detail/bezier_polynomial_detail.hpp b/include/boost/math/interpolators/detail/bezier_polynomial_detail.hpp index 18ce3e20a..60fe5ab5d 100644 --- a/include/boost/math/interpolators/detail/bezier_polynomial_detail.hpp +++ b/include/boost/math/interpolators/detail/bezier_polynomial_detail.hpp @@ -73,7 +73,7 @@ public: } } - decasteljau_recursion(scratch_space, scratch_space.size(), t); + decasteljau_recursion(scratch_space, control_points_.size() - 1, t); return scratch_space[0]; } diff --git a/test/git_issue_959.cpp b/test/git_issue_959.cpp new file mode 100644 index 000000000..6c595c0f9 --- /dev/null +++ b/test/git_issue_959.cpp @@ -0,0 +1,42 @@ +// Copyright Matt Borland, 2023 +// Use, modification and distribution are subject to the +// Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt +// or copy at http://www.boost.org/LICENSE_1_0.txt) + +#include +#include +#include +#include + +using tControlPoints = std::vector>; + +void interpolateWithPoints(tControlPoints cp) +{ + const auto cpSize = cp.size(); + auto bp = boost::math::interpolators::bezier_polynomial(std::move(cp)); + + // Interpolate at t = 0.5: + std::array point = bp(0.5); + std::cout << cpSize << " points, t = 0.5:\n"; + + for (const auto& c : point) + { + std::cout << " " << c << "\n"; + } +} + + +int main(void) +{ + auto cp3 = tControlPoints{{0,0,0}, {1,0,0}, {0,1,0}}; + interpolateWithPoints(cp3); + + auto cp4 = tControlPoints{{0,0,0}, {1,0,0}, {0,1,0}, {0,0,1}}; + interpolateWithPoints(cp4); + + auto cp3b = tControlPoints{{0,0,0}, {1,0,0}, {0,1,0}}; + interpolateWithPoints(cp3b); + + return 0; +} \ No newline at end of file From c7e22bf95be3d40060344ba4805e0e4c3be207ab Mon Sep 17 00:00:00 2001 From: Matt Borland Date: Thu, 2 Mar 2023 10:01:01 -0800 Subject: [PATCH 2/2] Fix formatting --- test/git_issue_959.cpp | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/test/git_issue_959.cpp b/test/git_issue_959.cpp index 6c595c0f9..1a6bf48fa 100644 --- a/test/git_issue_959.cpp +++ b/test/git_issue_959.cpp @@ -14,29 +14,29 @@ using tControlPoints = std::vector>; void interpolateWithPoints(tControlPoints cp) { const auto cpSize = cp.size(); - auto bp = boost::math::interpolators::bezier_polynomial(std::move(cp)); + auto bp = boost::math::interpolators::bezier_polynomial(std::move(cp)); - // Interpolate at t = 0.5: - std::array point = bp(0.5); + // Interpolate at t = 0.5: + std::array point = bp(0.5); std::cout << cpSize << " points, t = 0.5:\n"; - for (const auto& c : point) + for (const auto& c : point) { - std::cout << " " << c << "\n"; - } + std::cout << " " << c << "\n"; + } } int main(void) { - auto cp3 = tControlPoints{{0,0,0}, {1,0,0}, {0,1,0}}; - interpolateWithPoints(cp3); + auto cp3 = tControlPoints{{0,0,0}, {1,0,0}, {0,1,0}}; + interpolateWithPoints(cp3); - auto cp4 = tControlPoints{{0,0,0}, {1,0,0}, {0,1,0}, {0,0,1}}; - interpolateWithPoints(cp4); + auto cp4 = tControlPoints{{0,0,0}, {1,0,0}, {0,1,0}, {0,0,1}}; + interpolateWithPoints(cp4); - auto cp3b = tControlPoints{{0,0,0}, {1,0,0}, {0,1,0}}; - interpolateWithPoints(cp3b); + auto cp3b = tControlPoints{{0,0,0}, {1,0,0}, {0,1,0}}; + interpolateWithPoints(cp3b); - return 0; -} \ No newline at end of file + return 0; +}