怎样构造出过N个点的平滑Bezier曲线????希望大家各抒己见。

aqua_aqua 2004-07-26 03:53:30
已知:有一堆有序点,
结果:用最少的Bezier曲线平滑通过这些点,

初步设想,把全部点分成四个一组,每四个点用三次Bezier曲线插值的方法,找到其控制点。得到多段Bezier曲线,但是在连接画出后,曲线极不平滑,而且出现尖点。

可能我的想法错了,所以希望各位高手多多指教,我很想知道这个算法。
...全文
946 26 打赏 收藏 转发到动态 举报
写回复
用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)

19,469

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧