三次贝塞尔曲线的弧长

28次意见(过去30天)
Mahsa
Mahsa 2014年2月25日
评论道: 莫雷诺,M。2022年4月16日
你好,我正在寻找一种有效的方法来计算立方贝塞尔曲线的弧长,通过知道P0,P1,P2和P3。谢谢你!

答案(2)

cuneyt haspolat
cuneyt haspolat 2019年3月6日
你好,
bezier曲线生成后,即可取 很多样品 来自贝塞尔曲线。
提示:linscape可用于曲线上取样。
然后用欧几里得范数求长度。 随着样本数的增加,准确度也随之提高。 样品的数量与长度的准确性成正比。
奖金: Nurbs曲线长度 nrbmeasure 函数在Piegl的工具箱中可用。与我的建议相同的离散化也被使用,积分也被用来计算曲线长度。

莫雷诺,M。
莫雷诺,M。 2022年4月16日
如果你有机会接触符号数学,有一种方法可以计算通用Bézier曲线的解析弧长,作为曲线导数的范数的定积分。我使用函数 bspl 而且 bez2ber (从控制点找到曲线的多项式形式系数),我为这个练习开发了:
函数C = bez2ber(x)
N = size(x, 1) - 1;
N = prod(1: N);
C = x;
I = 1: n - 1
I = prod(1: I);
S = (-1) ^ i;
j = s * x(1,:) / I;
K = 1: I - 1
S = -s;
j = + s * x (k + 1,:) /刺激(1:k) /刺激(1:我- k);
结束
j = j + x(i + 1,:) / i;
c(i + 1,:) = N / prod(1: N - i) * j;
结束
S = (-1) ^ n;
j = s * x(1,:) / N;
K = 1: n
S = -s;
j = x + s * (k + 1,:) /刺激(1:k) /刺激(1:n - k);
结束
c(n + 1,:) = n * j;
结束
%控制点和导数多项式形式
Dim = [4,2];
X = rand(dim);
Y = bez2ber((dim(1) - 1) * diff(X));
解析计算
信谊t
Fun = 0 (1, dim(2));
I = 1: dim(1) - 1
fun = fun + Y(i,:) * t ^ (i - 1);
结束
A = double(int(norm(fun), [0,1]));
%离散弧长近似
b = diff(bspl(X, 1e3));
B = sum(√(sum(B .* B, 2)));
Error = abs(b - a) / a;
只要多项式形式的阶乘计算在浮点异常限制内,这将适用于任何Bézier曲线,无论其顺序或维数( Dim (1) = 171 ).超过 55 控制点 轮(prod (1: n)) 用来代替 刺激(1:n) .可以使用更稳定的方法进行阶乘计算。
用离散法求弧长的误差 1000 随机立方Bézier中的点将是:
[一个;b;错误)
ans =
1.29640077147666
1.29640027557947
3.82518436167337 e-07
1评论
莫雷诺,M。
莫雷诺,M。 2022年4月16日
https://uk.mathworks.com/matlabcentral/fileexchange/110220-polynomial-and-bezier-coefficient-conversion

登录评论。

社区寻宝

在MATLAB Central中找到宝藏,并发现社区如何帮助您!

开始狩猎!