给个算法!或者给个思路也可以!
先放110分,解决一定另开帖子放分!
21 个解决方案
#1
C++,BAsic,都可以
#2
没有代码也可以!
#3
呵呵,我有三千分,你可以放心!
#4
据我所知是没有,不过应该可以用数值微分的方法求一个近似值
#5
近似值也可以!
#6
up
#7
给个思路:
因Bezier曲线画到屏幕上去时,实际都是用一系列短的线段连接而成,所以要测量Bezier曲线的长度,只要把所包含的各线段的长度累加一下就可得到.
这是近似值,但是要把短线段的长度不断缩小,就可以得到任意高的精度.
因Bezier曲线画到屏幕上去时,实际都是用一系列短的线段连接而成,所以要测量Bezier曲线的长度,只要把所包含的各线段的长度累加一下就可得到.
这是近似值,但是要把短线段的长度不断缩小,就可以得到任意高的精度.
#8
如果这哥们是用API画的怎么办?
我们简化一下问题吧,zzwu看来你对图形学有一定的研究,如何在已知三次Bezier曲线四个控制点的情况下求出Bezier曲线的长度?给个数学推导。
我们简化一下问题吧,zzwu看来你对图形学有一定的研究,如何在已知三次Bezier曲线四个控制点的情况下求出Bezier曲线的长度?给个数学推导。
#9
呵呵,高手出现了,鄙人是用API画的
#10
给定顶点后,BEZIER的参数方程积分,应该可以得到长度。或者把BEZIER所在路径分支进行FLATTENPATH,得到线段,然后用GETPATH取得路径的信息,这样也许可以得到线段的长度,再加起来就是BEZIER的长度。
这都是粗略的想法。没经过实验。
同时,关注这个问题!!!
这都是粗略的想法。没经过实验。
同时,关注这个问题!!!
#11
已知三次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
#12
谢谢!
#13
我得想想,好像zzwu的求法有问题.....
#14
积分表达式最后面有一点错, 想大家看得出来的: z(t)+dt)] 应改成 z(t)*dt]
#15
不是这个,这是笔误。我是在想曲线积分这样对吗?这好像既不是第一类曲线积分也不是第二类曲线积分......
#16
GZGZ
#17
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轴上的单位向量.
你有道理, 在积分表达式
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轴上的单位向量.
#18
zzwu,看来你对图形学真的是挺有兴趣的,不过我觉得呢,如果你认为我说的有道理的话,我建议你能加强一下你的数学基础。呵呵,没有别的意思,我是读图形学的硕士,爱好CG这一行的人很少,很高兴能有和同道交流的机会。搞CG数学一定要过关,这真的是基础。
你后面的式子道理是对的,但直接用坐标来积分就不对了,请你想想看。其实这就是对1进行第一类的曲线积分。我给出它的数量形式。具体的推导可以参见同济《高等数学》:)
L=S[sqrt(x'(t)^2 + y'(t)^2 + z'(t)^2)dt]
你后面的式子道理是对的,但直接用坐标来积分就不对了,请你想想看。其实这就是对1进行第一类的曲线积分。我给出它的数量形式。具体的推导可以参见同济《高等数学》:)
L=S[sqrt(x'(t)^2 + y'(t)^2 + z'(t)^2)dt]
#19
直接用曲线积分求是没有问题的,我一开始没有推荐这种方法,是因为我在想有没有计算量更小的方法。要知道,算这个数值积分是挺费时间的。即使知道了定积分表达式,要算出数来还要一些数值方法的处理,比如高斯求积变换什么的。这个问题用龙贝格加速应该有比较好的结果,但我想直接通过画线的过程统计出一共画了多少个像素出来(不是精确值,也不一定是楼主想要的,我只是锻炼一下思维:)。想了几天也没有好的方法,我想我们的讨论基本上可以告一段落了,暂时就按数值积分的路子走吧。不过求任意曲线长度的问题,我们还可以继续探讨下去。
#20
zhangyan_qd(doggyzone):
谢谢你指出了我匆匆忙忙发出的回复的错误,我的错误我昨晚也想到了:x,y,z应求导.求导后,三个分量(向量)再求和并取模,结果就和同济书上的表达式相当了.
其实这样做,用计算机实现,就是直线段求和.
很高兴认识你! 更感谢你对我的忠告! 我虽学过5年数学,但有关微积分方面的东西差不多全忘光了! 另外,我还有一个最坏的缺点:粗心.
谢谢你指出了我匆匆忙忙发出的回复的错误,我的错误我昨晚也想到了:x,y,z应求导.求导后,三个分量(向量)再求和并取模,结果就和同济书上的表达式相当了.
其实这样做,用计算机实现,就是直线段求和.
很高兴认识你! 更感谢你对我的忠告! 我虽学过5年数学,但有关微积分方面的东西差不多全忘光了! 另外,我还有一个最坏的缺点:粗心.
#21
感谢两位高手,我也要补一补数学了
#1
C++,BAsic,都可以
#2
没有代码也可以!
#3
呵呵,我有三千分,你可以放心!
#4
据我所知是没有,不过应该可以用数值微分的方法求一个近似值
#5
近似值也可以!
#6
up
#7
给个思路:
因Bezier曲线画到屏幕上去时,实际都是用一系列短的线段连接而成,所以要测量Bezier曲线的长度,只要把所包含的各线段的长度累加一下就可得到.
这是近似值,但是要把短线段的长度不断缩小,就可以得到任意高的精度.
因Bezier曲线画到屏幕上去时,实际都是用一系列短的线段连接而成,所以要测量Bezier曲线的长度,只要把所包含的各线段的长度累加一下就可得到.
这是近似值,但是要把短线段的长度不断缩小,就可以得到任意高的精度.
#8
如果这哥们是用API画的怎么办?
我们简化一下问题吧,zzwu看来你对图形学有一定的研究,如何在已知三次Bezier曲线四个控制点的情况下求出Bezier曲线的长度?给个数学推导。
我们简化一下问题吧,zzwu看来你对图形学有一定的研究,如何在已知三次Bezier曲线四个控制点的情况下求出Bezier曲线的长度?给个数学推导。
#9
呵呵,高手出现了,鄙人是用API画的
#10
给定顶点后,BEZIER的参数方程积分,应该可以得到长度。或者把BEZIER所在路径分支进行FLATTENPATH,得到线段,然后用GETPATH取得路径的信息,这样也许可以得到线段的长度,再加起来就是BEZIER的长度。
这都是粗略的想法。没经过实验。
同时,关注这个问题!!!
这都是粗略的想法。没经过实验。
同时,关注这个问题!!!
#11
已知三次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
#12
谢谢!
#13
我得想想,好像zzwu的求法有问题.....
#14
积分表达式最后面有一点错, 想大家看得出来的: z(t)+dt)] 应改成 z(t)*dt]
#15
不是这个,这是笔误。我是在想曲线积分这样对吗?这好像既不是第一类曲线积分也不是第二类曲线积分......
#16
GZGZ
#17
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轴上的单位向量.
你有道理, 在积分表达式
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轴上的单位向量.
#18
zzwu,看来你对图形学真的是挺有兴趣的,不过我觉得呢,如果你认为我说的有道理的话,我建议你能加强一下你的数学基础。呵呵,没有别的意思,我是读图形学的硕士,爱好CG这一行的人很少,很高兴能有和同道交流的机会。搞CG数学一定要过关,这真的是基础。
你后面的式子道理是对的,但直接用坐标来积分就不对了,请你想想看。其实这就是对1进行第一类的曲线积分。我给出它的数量形式。具体的推导可以参见同济《高等数学》:)
L=S[sqrt(x'(t)^2 + y'(t)^2 + z'(t)^2)dt]
你后面的式子道理是对的,但直接用坐标来积分就不对了,请你想想看。其实这就是对1进行第一类的曲线积分。我给出它的数量形式。具体的推导可以参见同济《高等数学》:)
L=S[sqrt(x'(t)^2 + y'(t)^2 + z'(t)^2)dt]
#19
直接用曲线积分求是没有问题的,我一开始没有推荐这种方法,是因为我在想有没有计算量更小的方法。要知道,算这个数值积分是挺费时间的。即使知道了定积分表达式,要算出数来还要一些数值方法的处理,比如高斯求积变换什么的。这个问题用龙贝格加速应该有比较好的结果,但我想直接通过画线的过程统计出一共画了多少个像素出来(不是精确值,也不一定是楼主想要的,我只是锻炼一下思维:)。想了几天也没有好的方法,我想我们的讨论基本上可以告一段落了,暂时就按数值积分的路子走吧。不过求任意曲线长度的问题,我们还可以继续探讨下去。
#20
zhangyan_qd(doggyzone):
谢谢你指出了我匆匆忙忙发出的回复的错误,我的错误我昨晚也想到了:x,y,z应求导.求导后,三个分量(向量)再求和并取模,结果就和同济书上的表达式相当了.
其实这样做,用计算机实现,就是直线段求和.
很高兴认识你! 更感谢你对我的忠告! 我虽学过5年数学,但有关微积分方面的东西差不多全忘光了! 另外,我还有一个最坏的缺点:粗心.
谢谢你指出了我匆匆忙忙发出的回复的错误,我的错误我昨晚也想到了:x,y,z应求导.求导后,三个分量(向量)再求和并取模,结果就和同济书上的表达式相当了.
其实这样做,用计算机实现,就是直线段求和.
很高兴认识你! 更感谢你对我的忠告! 我虽学过5年数学,但有关微积分方面的东西差不多全忘光了! 另外,我还有一个最坏的缺点:粗心.
#21
感谢两位高手,我也要补一补数学了