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