几何尺寸与公差论坛

 找回密码
 注册
查看: 3685|回复: 2

【转帖】求GdI 测量Bezier曲线的长度!

[复制链接]
发表于 2008-9-12 11:59:49 | 显示全部楼层 |阅读模式
7 楼zzwu(未名)回复于 2002-08-27 09:14:10 得分 0

给个思路:   
  因Bezier曲线画到屏幕上去时,实际都是用一系列短的线段连接而成,所以要测量Bezier曲线的长度,只要把所包含的各线段的长度累加一下就可得到.   
  这是近似值,但是要把短线段的长度不断缩小,就可以得到任意高的精度.   
  Top

8 楼zhangyan_qd(doggyzone)回复于 2002-08-27 11:38:29 得分 0

如果这哥们是用API画的怎么办?   
  我们简化一下问题吧,zzwu看来你对图形学有一定的研究,如何在已知三次Bezier曲线四个控制点的情况下求出Bezier曲线的长度?给个数学推导。Top

9 楼handsomge(汗衫)回复于 2002-08-27 14:44:37 得分 0

呵呵,高手出现了,鄙人是用API画的Top

10 楼painache(SystemOfaDown)回复于 2002-08-27 16:16:07 得分 0

给定顶点后,BEZIER的参数方程积分,应该可以得到长度。或者把BEZIER所在路径分支进行FLATTENPATH,得到线段,然后用GETPATH取得路径的信息,这样也许可以得到线段的长度,再加起来就是BEZIER的长度。   
   
  这都是粗略的想法。没经过实验。   
   
  同时,关注这个问题!!!Top

11 楼zzwu(未名)回复于 2002-08-28 08:39:29 得分 0

  
  已知三次Bezier曲线四个控制点   
                    Pi(Xi,Yi,Zi),i=0,1,2,3   
  的情况下,求出Bezier曲线的长度的数学推导如下:   
   
  1.写出x,y,z用参数t表示的方程:   
        x(t)=Sigma(Xi*B(i,n,t)),         
        y(t)=Sigma(Yi*B(i,n,t)),         
        z(t)=Sigma(Zi*B(i,n,t));   
        其中B(i,n,t)=C(n,i)*t^i*(1-t)^(n-i),     
                    C(n,i)=n!/(i!*(n-i)!)   
        Sigma为对i求和,i=0,n   
        当控制点Pi(Xi,Yi,Zi)的值给定情况下,以上都是t的3次方程.   
   
  2.Bezier曲线从P0到P3的长度L:   
   
        L   =   S[x(t)*dt   +   y(t)*dt   +   z(t)+dt)],   
   
        其中S[...]代表对t的定积分,   t的范围从0到1   
   
   
  Top

12 楼handsomge(汗衫)回复于 2002-08-28 09:00:02 得分 0

谢谢!Top

13 楼zhangyan_qd(doggyzone)回复于 2002-08-28 09:52:00 得分 0

我得想想,好像zzwu的求法有问题.....Top

14 楼zzwu(未名)回复于 2002-08-28 15:42:50 得分 0

积分表达式最后面有一点错,   想大家看得出来的:   z(t)+dt)]   应改成   z(t)*dt]Top

15 楼zhangyan_qd(doggyzone)回复于 2002-08-28 16:47:53 得分 0

不是这个,这是笔误。我是在想曲线积分这样对吗?这好像既不是第一类曲线积分也不是第二类曲线积分......Top

16 楼handsomge(汗衫)回复于 2002-08-29 08:46:39 得分 0

GZGZTop

17 楼zzwu(未名)回复于 2002-08-29 09:18:19 得分 0

zhangyan_qd(doggyzone):   
   
  你有道理,   在积分表达式   
   
        L   =   S[x(t)*dt   +   y(t)*dt   +   z(t)*dt]   
   
  的每一项中,还应含有对应轴的单位矢量,也就是应是矢量和,而非标量和,否则结果变大了.   此外,每一段合成的矢量还应取绝对值,所以整个应改为:   
   
        L   =   S[|x(t)*i*dt   +   y(t)*j*dt   +   z(t)*k*dt|]   
   
  其中i,j,k分别为x,y,z轴上的单位向量.   
   
   
  Top

18 楼zhangyan_qd(doggyzone)回复于 2002-08-29 11:07:52 得分 0

zzwu,看来你对图形学真的是挺有兴趣的,不过我觉得呢,如果你认为我说的有道理的话,我建议你能加强一下你的数学基础。呵呵,没有别的意思,我是读图形学的硕士,爱好CG这一行的人很少,很高兴能有和同道交流的机会。搞CG数学一定要过关,这真的是基础。   
  你后面的式子道理是对的,但直接用坐标来积分就不对了,请你想想看。其实这就是对1进行第一类的曲线积分。我给出它的数量形式。具体的推导可以参见同济《高等数学》:)   
  L=S[sqrt(x'(t)^2   +   y'(t)^2   +   z'(t)^2)dt]Top

19 楼zhangyan_qd(doggyzone)回复于 2002-08-29 11:14:27 得分 55

直接用曲线积分求是没有问题的,我一开始没有推荐这种方法,是因为我在想有没有计算量更小的方法。要知道,算这个数值积分是挺费时间的。即使知道了定积分表达式,要算出数来还要一些数值方法的处理,比如高斯求积变换什么的。这个问题用龙贝格加速应该有比较好的结果,但我想直接通过画线的过程统计出一共画了多少个像素出来(不是精确值,也不一定是楼主想要的,我只是锻炼一下思维:)。想了几天也没有好的方法,我想我们的讨论基本上可以告一段落了,暂时就按数值积分的路子走吧。不过求任意曲线长度的问题,我们还可以继续探讨下去。
 楼主| 发表于 2008-9-12 12:00:31 | 显示全部楼层

回复: 【转帖】求GdI 测量Bezier曲线的长度!

有关Bezier曲线的讨论在任何一本<计算机图形学>中都有.我身边的五本书中就如此:   
  1.<对话式计算机图形显示原理>W.M.Newman等,科学出版社,317-323页   
  2.<计算机图形显示和图像出力的算法>avlidis,科学出版社,204-213页   
  3.<计算机图学的数学基础>D.F.Rogers等,人民出版社,110-114页   
  此外,还有清华,复旦的本图形学书上也有.
 楼主| 发表于 2008-9-12 12:04:31 | 显示全部楼层

回复: 【转帖】求GdI 测量Bezier曲线的长度!

有关Bezier曲线的讨论在任何一本<计算机图形学>中都有.我身边的五本书中就如此:   
  1.<对话式计算机图形显示原理>W.M.Newman等,科学出版社,317-323页   
  2.<计算机图形显示和图像出力的算法>avlidis,科学出版社,204-213页   
  3.<计算机图学的数学基础>D.F.Rogers等,人民出版社,110-114页   
  此外,还有清华,复旦的本图形学书上也有.  


http://research.microsoft.com/~h ... ves/cbezarclen.html   
   
  有数学描述和实现代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|Archiver|小黑屋|几何尺寸与公差论坛

GMT+8, 2024-12-22 13:32 , Processed in 0.038119 second(s), 19 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表