首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用递归函数计算n次bezier曲线

用递归函数计算n次bezier曲线
EN

Code Review用户
提问于 2019-01-09 03:33:21
回答 1查看 490关注 0票数 4

我一直在看国产数控系统,并一直在想如何绘制曲线,所以我查看了它,并找到了这篇很酷的文章。然后,我决定尝试在C中提出一个bezier曲线算法,它似乎工作得很好,虽然我还没有尝试用这个精确的实现来绘制点,但它似乎与我绘制点的前一个实现的结果相匹配。

代码语言:javascript
复制
#include <stdint.h>

static long double bbezier(long double t, long double p0, long double p1){
    return ((p1 - p0) * t) + p0;
}

long double bezier(long double t, uint64_t *points, uint64_t n){
    long double p0 = points[0], p1 = points[1];
    if(n == 1) return bbezier(t, p0, p1);

    long double q0 = bezier(t, points, n - 1),
        q1 = bezier(t, points + 1, n - 1);
    return bbezier(t, q0, q1);
}

然后我很快用C++编写了这个测试程序。

代码语言:javascript
复制
#include <iostream>

extern "C" long double bezier(long double, uint64_t *, uint64_t);

uint64_t pointsx[] = {
    0, 40, 100, 200
};
uint64_t pointsy[] = {
    0, 150, 60, 100
};

int main(){
    for(uint64_t i = 0; i <= 10000; ++i){
        long double ii = i;
        long double j = ii/10000;

        long double x = bezier(j, pointsx, 3);
        long double y = bezier(j, pointsy, 3);

        std::cout << "X: " << x << ", Y: " << y << '\n';
    }
    return 0;
}

我编写了一个在javascript中运行的实现,该实现来自一个经过轻微修改的w3学校画布教程这里,以了解bezier曲线是如何工作的,但它只支持3度曲线。不过,它确实画出了要点,这也是我上述实现的基础。

它不做任何检查以确保t介于0到n != 0之间,但我并不太担心。我唯一担心的是,当n太高,导致堆栈溢出,但这将是一个非常疯狂的曲线的情况下,分段故障。不管怎样,看上去怎么样?

EN

回答 1

Code Review用户

发布于 2019-01-09 05:39:04

  • 我不喜欢bbezier。它与bezier的冲突太多了,而且不太能提供信息。它执行线性插值,为什么不称它为interpolate呢?
  • p0p1只是添加了噪声。如果(n == 1) {返回插值(t,points0,points1);}我会认真考虑去掉q0q1:返回插值(t,bezier(t,point,n-1),bezier(t,point+ 1,n-1));不要把它当作推荐。
  • 递归导致了指数时间复杂度。在您开始出现内存问题之前,您将面临性能问题。请考虑计算Bernstein表单。它给你线性时间,没有记忆问题。
票数 4
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/211157

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档