我正在尝试绘制一条曲线,其中每个点彼此相距特定距离。 现在,打击显示了我想要做的事情,但我想要像曲线一样的罪,而不是恒定的半径。
R = 50; %radius
Gap = 0.1; % gap between points
Curve = 180;
rad = 0;
n= pi*2*R*Curve/360/Gap; % n is length of arc
th = linspace( pi, rad ,n);
x = R*cos(th)+R;
y = R*sin(th)+100;
PathDB.Route1.x(1:1001,1)=0;
PathDB.Route1.y = (0:Gap:100)';
LengthY = length(PathDB.Route1.y);
PathDB.Route1.x(1001:1001+length(x)-1,1)=x ;
PathDB.Route1.y(LengthY:LengthY+length(y)-1) = y;
LengthX = length(PathDB.Route1.x);
LengthY = length(PathDB.Route1.y);
PathDB.Route1.x(LengthX:LengthX+1000,1)=PathDB.Route1.x(LengthX,1);
PathDB.Route1.y(LengthY:LengthY+1000,1)= (PathDB.Route1.y(LengthY,1):-Gap:0);
plot(PathDB.Route1.x, PathDB.Route1.y);
grid ;
axis equal
我想做的只是代替完美曲线,我想添加像曲线一样的曲线,用0.1绘制。 对于我糟糕的编码技巧,我很抱歉,希望你能理解并帮助我。
感谢任何建议!
Rui
答案 0 :(得分:0)
如果你想要这个很强大,你可能需要使用Matlab Symbolic Toolbox。如果你取一个函数f,并希望沿a和b之间的曲线绘制等距点,你可以做这样的事情(使用sin(x)作为示例函数):
sym x;
f = sin(x);
g = diff(f); %derivative of f
b=5;
a=0;
%check syntax on this part
arc_length = int(sqrt(1+g^2)); %create function for arc_length
Sc = arc_length(b)-arc_length(a); %calculate total arc length
n = 30 %number of points to plot (not including b)
Sdist = Sc/n; %distance between points
xvals = zeros(1,(n+1)); %initialize array of x values, n+1 to include point at b
接下来,我们希望迭代间隔以找到等距点。为此,我们取每个S_ij,其中i代表间隔低端的x值,j代表高端。我们从i = a开始,当i = b时停止。使用我们的弧长方程的倒数,我们可以求解j。 Sdist == S_ij
=> Sdist = arc_length(j) - arc_length(i)
=> Sdist+arc_length(i)=arc_length(j)
。使用它,我们可以计算:j = arc_length_inverse(Sdist+arc_length(i))
。实现这一点的一种方法如下:
arc_length_inv = finverse(arc_length);
i=a
xvals(1)=i;
for ii=1:n
j = arc_length_inv(Sdist+arc_length(i)); %calculate high end
i = j %make high end new low end
xvals(ii+1)=i; %put new low end value in x array
end
使用此x值数组,您可以计算yvals=sin(xvals)
和plot(xvals,yvals)
这些代码中的一部分可能需要调整,但数学应该是合理的(弧长的公式来自http://en.wikipedia.org/wiki/Arc_length)。在数学上,这应该适用于[a,b]上可积的任何函数,并且其arc_length函数具有逆;那就是说,我不知道int()和finverse()函数的功能。
如果您不需要稳健性,可以按照这些步骤执行特定功能,手动进行数学运算并手动输入功能;