c++ - 递归函数无法按预期返回值
问题描述
我想使用递归来实现贝塞尔曲线,在recursive_bezier函数中它递归所有输入点,直到只剩下一个点并返回该点,然后在贝塞尔函数中通过执行recursive_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];
}
因为函数通过 const 引用获取向量,所以调用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];
}
推荐阅读
- java - 活动没有停止响应
- spring - 如何修复由于 org.asciidoctor:asciidoctor-maven 导致的错误
- c# - 尝试从文件夹中提取所有电子邮件,但在 1000 处停止
- java - Java 字节码执行不理解 go 语句在字节码中的工作方式
- google-apps-script - 当列标题与字符串匹配并且该列中的单元格包含指定值时,显示选项卡中的行
- javascript - 如何使用 jquery 删除“阅读更多”?
- pandas - How do I merge and repeat population cells in a data frame with existing data frame?
- c - STM32 使用 CubeMX 和 STMStudio:'int main()' 不起作用
- xamarin.forms - ZXing 是否能够解码旧版本的 Data Matrix 条码?
- python - 在 PyQt5 GUI 中嵌入 Plotly-Dash 图:握手失败,SSL 错误