我一直在看国产数控系统,并一直在想如何绘制曲线,所以我查看了它,并找到了这篇很酷的文章。然后,我决定尝试在C中提出一个bezier曲线算法,它似乎工作得很好,虽然我还没有尝试用这个精确的实现来绘制点,但它似乎与我绘制点的前一个实现的结果相匹配。
#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++编写了这个测试程序。
#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太高,导致堆栈溢出,但这将是一个非常疯狂的曲线的情况下,分段故障。不管怎样,看上去怎么样?
发布于 2019-01-09 05:39:04
bbezier。它与bezier的冲突太多了,而且不太能提供信息。它执行线性插值,为什么不称它为interpolate呢?p0和p1只是添加了噪声。如果(n == 1) {返回插值(t,points0,points1);}我会认真考虑去掉q0和q1:返回插值(t,bezier(t,point,n-1),bezier(t,point+ 1,n-1));不要把它当作推荐。https://codereview.stackexchange.com/questions/211157
复制相似问题