递归函数无法按预期返回值
我想使用递归来实现贝塞尔曲线,在recursive_bezier函数中它递归所有输入点,直到只剩下一个点并返回该点,然后在贝塞尔函数中通过执行recursive_bezier获取该值。但是在bezier函数中我只能得到第一个输入点的值,为什么不理想?请帮忙。
#include <chrono>
#include <iostream>
#include <opencv2/opencv.hpp>
std::vector<cv::Point2f> control_points;
cv::Point2f recursive_bezier(const std::vector<cv::Point2f> &control_points, float t)
{
int control_size = control_points.size();
std::vector<cv::Point2f> temp_points;
if (control_size != 1)
{
for (int i = 0; i < control_size - 1; i++)
{
cv::Point2f t_point;
auto vt = (control_points[i+1] - control_points[i])*t;
t_point.x = control_points[i].x + vt.x;
t_point.y = control_points[i].y + vt.y;
temp_points.push_back(t_point);
}
recursive_bezier(temp_points, t);
}
std::cout << "from recursive" << control_points[0] << std::endl; //here can output correct point value
return control_points[0];
}
void bezier(const std::vector<cv::Point2f> &control_points)
{
for (double t = 0.0; t <= 1.0; t +=0.5)
{
cv::Point2f point = recursive_bezier(control_points, t);
std::cout << "from bezier:" << point << std::endl; //here cannot get the point correct, it always printout the first value of the input control_points
}
}
int main()
{
control_points.emplace_back(4,5);
control_points.emplace_back(3.6);
bezier(control_points);
return 0;
}
回答
忽略细节,你的代码是这样的:
cv::Point2f recursive_bezier(const std::vector<cv::Point2f> &control_points, float t)
{
int control_size = control_points.size();
std::vector<cv::Point2f> temp_points;
if (control_size != 1)
{
recursive_bezier(temp_points, t);
}
return control_points[0];
}
因为函数通过常量引用获取向量,所以调用recursive_bezier(temp_points,t)对函数最终返回的内容没有影响。唯一的回报是return control_points[0];,这就是函数总是返回的。
您忘记实际使用递归调用的返回值。我想你只是想退货:
cv::Point2f recursive_bezier(const std::vector<cv::Point2f> &control_points, float t)
{
int control_size = control_points.size();
std::vector<cv::Point2f> temp_points;
if (control_size != 1)
{
return recursive_bezier(temp_points, t); // <---
}
return control_points[0];
}