社区
图形处理/算法
帖子详情
怎样构造出过N个点的平滑Bezier曲线????希望大家各抒己见。
aqua_aqua
2004-07-26 03:53:30
已知:有一堆有序点,
结果:用最少的Bezier曲线平滑通过这些点,
初步设想,把全部点分成四个一组,每四个点用三次Bezier曲线插值的方法,找到其控制点。得到多段Bezier曲线,但是在连接画出后,曲线极不平滑,而且出现尖点。
可能我的想法错了,所以希望各位高手多多指教,我很想知道这个算法。
...全文
946
26
打赏
收藏
怎样构造出过N个点的平滑Bezier曲线????希望大家各抒己见。
已知:有一堆有序点, 结果:用最少的Bezier曲线平滑通过这些点, 初步设想,把全部点分成四个一组,每四个点用三次Bezier曲线插值的方法,找到其控制点。得到多段Bezier曲线,但是在连接画出后,曲线极不平滑,而且出现尖点。 可能我的想法错了,所以希望各位高手多多指教,我很想知道这个算法。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
26 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
aqua_aqua
2004-08-02
打赏
举报
回复
没人回答,自己顶吧,
梧桐168
2004-07-30
打赏
举报
回复
我同学做的,word上的自由曲线,就是过N个点的平滑Bezier曲线,你画好之后编辑
移动它的顶点就知道了。
aqua_aqua
2004-07-28
打赏
举报
回复
哈哈....
说实在的,书我这几天看了不少,但是找到的东西感觉上都与实际的应用有一定的距离。
就以插值N次Bezier曲线为例,书上给出的算法,其后说,一般要进行对数据进行分段,使之用三次Bezier曲线插值来拟合,但是,对于数据的分段,也就一句代过了。唉,可能是我太笨吧,
yanwl
2004-07-28
打赏
举报
回复
有B样条的公式...
具体忘记了...
但是相关的资料很容易查到的应该...
另外,Bezier和B-Spline是不同的...
alphapaopao
2004-07-28
打赏
举报
回复
aqua_aqua(丁丁) 就是北航的。你区分不出Bezier 和 bspline 是因为你没把书看明白。
曲线的次数,指的是曲线方程多项式的次数。书理面对曲线的边界连接的光顺性作了很详细的论述。
aqua_aqua
2004-07-28
打赏
举报
回复
感谢bullcat(bullcat),我看了一下你的代码,这段代码的作用是在两点之间画一条Bezier曲线,但效果不是很好。
对于三次Bezier曲线的控制点,我现在已经可以通过曲线上的任意四点反求出来了。
aqua_aqua
2004-07-28
打赏
举报
回复
炮炮,你所说的课本是北航施法中的那本CAGD吗??我在网看到了这本书。对于其中Bezier与B样条曲线之间的区别一直搞不明白。还有所谓的“三次参数样条曲线”与三次Bezier曲线又是一种什么关系??、
我问的这些问题是不是有些笨笨的????
bullcat
2004-07-28
打赏
举报
回复
希望这个代码可以帮你
POINT aBezierPt[4];
double scale = 0.04;
int LineWidth,OffectXY;
for(int icurvesP=0;icurvesP<i-1;icurvesP++)
{
aBezierPt[0].x = aptCurves[icurvesP].x;
aBezierPt[0].y = aptCurves[icurvesP].y;
aBezierPt[3].x = aptCurves[icurvesP+1].x;
aBezierPt[3].y = aptCurves[icurvesP+1].y;
LineWidth =(int)sqrt(pow(abs(aBezierPt[3].x-aBezierPt[0].x),2)+pow(abs(aBezierPt[3].y-aBezierPt[0].y),2));
OffectXY = (int)(LineWidth*scale);
aBezierPt[1].x = (aBezierPt[0].x+(aBezierPt[3].x-aBezierPt[0].x)/2)-OffectXY;
aBezierPt[1].y = (aBezierPt[0].y+(aBezierPt[3].y-aBezierPt[0].y)/2)+OffectXY;
aBezierPt[2].x = (aBezierPt[0].x+(aBezierPt[3].x-aBezierPt[0].x)/2)-OffectXY;
aBezierPt[2].y = (aBezierPt[0].y+(aBezierPt[3].y-aBezierPt[0].y)/2)+OffectXY;
PolyBezier(memDC,aBezierPt,4);
}
alphapaopao
2004-07-28
打赏
举报
回复
你这个是一个边界条件的问题。书上都有的。我说的是课本。
Bezier/Bspline 代有边界条件的反算问题。
aqua_aqua
2004-07-28
打赏
举报
回复
谢谢楼上的朋友,我觉得,代码并不重要,主要是算法,那东西最重要,关于过N点的B样条,你是不是从codeguru上下的那段用Curve和Spline类实现的程序?那段代码我看了,对于中间的有些算法不是很清楚,不知道你的感觉如何?
对于过N点的多段3次Bezier曲线光滑拼接,希望能找到算法,
aqua_aqua
2004-07-28
打赏
举报
回复
你做的??IT_Fly(浅斟低唱) ,不错。
梧桐168
2004-07-28
打赏
举报
回复
你下载http://www.slsoft.com.cn/rjxz/demo.zip,试用软件上的bezier曲线绘执方法
就行了,其实挺简单。
aqua_aqua
2004-07-28
打赏
举报
回复
哦,谢谢炮炮,看来我是要耐心好好看看这本书了。惭愧呀.............
alphapaopao
2004-07-28
打赏
举报
回复
1、不是所有的情况,都要分段。要看具体问题。有的时候不得不采用分段的方法。但是有的时侯,完整的一个Bezier是很好的。
2、分段的方法,不是一句带过了。在书里面的另外一个地方说得很详细。Bezier分段方法是配套算法中的一个很重要的部分。很多CAGD算法的基础就是他。
kpld8888
2004-07-27
打赏
举报
回复
我记得样条曲线可以达到这个要求,但是我找了好长时间资料,就是找不到闭合样条曲线的例子,只找的到不闭合样条曲线的代码。楼主要不要?要的话和我联系:我的qq:101059899,email:kpld@163.com
aqua_aqua
2004-07-27
打赏
举报
回复
kpld8888(kpld) ( )
我也想知道哦。我只知道用bezier曲线是不行的
==================
那这个问题无解了???
aqua_aqua
2004-07-27
打赏
举报
回复
计算N阶Bezier曲线的控制点,在数学上讲是可行了,但是计算量很大,书上说超过十阶的Bezier曲线就是禁忌了。所以通常是用3阶Bezier,当高于3阶的,我就不知道该怎么做了。
书上说是用多段3次Bezier组合拼接。拼接的条件都是说首要条件是三点共线,就是yjlchina(北方南人) 所说的。
但是,如果三点不共线,那怎么办??有没有一个补偿算法,使两段Bezier在拼接时,一但出现尖点,就进行一下圆滑处理,
我说的意思不知道大家是否明白???希望大家能继续关注。
唉,这个地方不能贴图是个大问题。
yjlchina
2004-07-27
打赏
举报
回复
在画一系列相连的bezier曲线的时候,只有当第一条bezier曲线的第而个控点、第一条bezier曲线的终点和第二条bezier第一个控制点相关时,也就是三点一线时候,曲线在连接出才是光滑的
小弟就知道这些了
alphapaopao
2004-07-27
打赏
举报
回复
段和段之间的连接,很需要技巧。
如果是要求一阶几何连续,则需要保证切矢同向。
如果要保证曲率连续,可能只有三次Bezier才能办到。并且公式比较复杂。
s6283
2004-07-27
打赏
举报
回复
这是个老外的算法:
这个问题就是计算bezier曲线的控制点。
假设顶点为p1,p2...
先计算出所有边的中心点Ai。然后
连接所有Ai,形成Ci线段,
在Ci线段上计算点Bi(L1/L2=d1/d2),
L1,L2为(p1,p2),(p2,p3)的边长,d1,d2为(A1,B1),(A2,B2)的长
最后将Ci线段的Bi点移动到各个线段的顶点,就是得到我们所要的控制点了
加载更多回复(6)
n次
Bezier
曲线
在vc上基于openGL编写的n次
Bezier
曲线
,可以选择n的大小绘制指定次数的
Bezier
曲线
,之后有较好的交互性,可以在n次
Bezier
曲线
的基础上,将两点拖至重合,变成n-1次
Bezier
曲线
bezier
曲线
平滑
C语言代码-贝塞尔
曲线
C语言实现-
bezier
曲线
平滑
-
曲线
拟合-贝塞尔
曲线
这是一份C语言版本的
bezier
曲线
(贝塞尔
曲线
)绘制代码,实现了二次和三次
bezier
曲线
的绘制,可用于一系列给定的离散点的
曲线
平滑
。此代码封装成函数,可以直接调用。脚本里边有参数和代码的注释,可供使用者学习和参考。另外还有一份测试代码,测试代码里边有一个测试用例,可以供使用者进行参考。
计算机图形学画n次
Bezier
曲线
算法:n次
Bezier
曲线
的定义。先作控制点,再点击显示屏上任意一点绘制n次
Bezier
曲线
。可多次重新绘制。
计算机图形学
Bezier
曲线
源代码
计算机图形学 实验目的: 掌握
Bezier
曲线
的生成算法,掌握应用调和函数生成
曲线
的方法,掌握3次
Bezier
曲线
的性质。 实验要求: 用鼠标交互输入控制点,绘制控制折线,生成并显示3次
Bezier
曲线
。 实验原理:
Bezier
曲线
的形状是通过一组多边折线的各项唯一定义出来的。在该多边折线的各顶点中,只有第一点和最后一点是在
曲线
上,其余的顶点则用来定义
曲线
的导数、阶次和形状。第一条边和最后一条边则表示了
曲线
在起点处和终点处的切线方向,即第一条边和最后一条边分别和
曲线
的起点和终点相切。
曲线
的形状趋于控制折线的形状,改变控制点的位置和
曲线
的形状变化有着直观的联系。
Bezier
曲线
是由多项式调和函数推导出来的,通常n+1个顶点定义一个n次多项式,三次
Bezier
曲线
需要四个顶点来定义。
Bezier
曲线
曲面下
Bezier
曲线
曲面课件下 讲解
Bezier
曲线
的性质及定义 PDF格式
图形处理/算法
19,469
社区成员
50,697
社区内容
发帖
与我相关
我的任务
图形处理/算法
VC/MFC 图形处理/算法
复制链接
扫一扫
分享
社区描述
VC/MFC 图形处理/算法
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章