标题:[原创] Bezier curve demo code.
只看楼主
RockCarry
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:13
帖 子:662
专家分:58
注 册:2005-8-5
结帖率:95.65%
 问题点数:0 回复次数:7 
[原创] Bezier curve demo code.
贝塞尔曲线在计算机图形学中有详细的介绍,但是许多教材写得太过晦涩难懂,而且基本上是纯理论的研究。我曾经认真研读过计算机图形学中有关贝塞尔曲线的相关内容,但是书本上并没有给出有效的工程化实现的方法。许多书本上给出的算法或者是通用性不强或者就是效率低下。在网上搜索了很久,也始终没有找到一个真正高效的贝塞尔曲线绘制算法。

因此,我在仔细研究和分析了贝塞尔曲线的相关理论和算法以后,实现了以下的几个贝塞尔曲线的绘制算法:
    PolyBezierPD:                 基于 casteljau 算法,采用了浮点运算和递归实现
    FastPolyBezierPD:          基于 casteljau 算法,采用了整数运算和递归实现
    NonRecurPolyBezierPD: 基于 casteljau 算法,采用了整数运算和非递归实现(效率最高)
    PolyBezierPN:                 基于 casteljau 算法,采用了浮点运算和参数化的计算方法

这四个算法都是基于 casteljau 实现的,因为 casteljau 方法可以很容易的实现任意阶的贝塞尔曲线,而普通的参数方程计算方法则只能实现固定阶数的贝塞尔曲线。最容易理解的应该是 PolyBezierPN 算法,它采用了 casteljau 的参数计算形式,根据参数 t 来计算出每一个曲线上的点。而其他三个算法都是采用了控制多边形的无限分割和逼近的思想。这个分割的思想很容易通过递归函数来实现。但是在许多情况下,递归实现的效率不高,并且可能会带来某些不确定的问题,因此,我又实现了一个非递归的版本。NonRecurPolyBezierPD 应该是效率最高的实现了,非递归的实现,并且将桴点运算改为了整数运算。

其中参数 pd 的含义是指曲线上两个相邻点之间的距离,如果 pd == 1, 则将绘制出连续的曲线参数 pn 的含义是在曲线上绘制的总的点数,PolyBezierPN 函数需要传入这个参数,这个参数可以根据控制多边形的长度来估算。

如果是要用于工程上,效率最好,最实用的还是 NonRecurPolyBezierPD 算法。代码写得很清晰,也不需要太多的注释。许多地方是极为巧妙的,请大家认真品味,一定会有收获的。注意体会从浮点运算转为整数运算的方法,以及从递归转为非递归实现的方法。



              RockCarry
              2007-12-1

Bezier.rar (36.45 KB)
搜索更多相关主题的帖子: Bezier curve demo code 
2007-12-01 17:25
RockCarry
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:13
帖 子:662
专家分:58
注 册:2005-8-5
得分:0 
占一楼
2007-12-01 17:28
RockCarry
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:13
帖 子:662
专家分:58
注 册:2005-8-5
得分:0 
占二楼
2007-12-01 17:29
一笔苍穹
Rank: 1
等 级:新手上路
帖 子:640
专家分:0
注 册:2006-5-25
得分:0 
板凳,支持
2007-12-01 17:30
RockCarry
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:13
帖 子:662
专家分:58
注 册:2005-8-5
得分:0 
帖子不能编辑?
看来占楼也没有用了。
在以前的算法中存在像素点的重复绘制,今天改进了下。

Bezier.rar (35.5 KB)
2007-12-03 20:32
yuyu1106
该用户已被删除
得分:0 
请教casteljau 算法
提示: 作者被禁止或删除 内容自动屏蔽
2008-06-02 10:35
yuyu1106
该用户已被删除
得分:0 
以BEZIER曲线为边界的曲面如何绘制
提示: 作者被禁止或删除 内容自动屏蔽
2008-06-02 10:43
ocheng2005
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2008-8-4
得分:0 
非常感谢,非常好。
2008-08-04 12:45



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-189775-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.090529 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved