2014-03-26 70 views
0

我想繪製一條曲線,其中每個點都相距特定的距離。 現在,打擊顯示了我想做的事情,但我想要像曲線而不是恆定半徑的罪。繪製每個特定距離的曲線(Matlab)

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的曲線繪製的曲線。 對於我糟糕的編碼技能,我很抱歉,希望你能理解並幫助我。

任何意見是讚賞!

+0

你是什麼意思與罪?你的意思是橢圓形嗎? – patrik

回答

0

如果你想這是強大的,你可能需要使用Matlab的符號工具箱。如果你把一個函數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 = 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()函數的功能。

如果您不需要健壯性,您可以按照以下步驟執行您的特定功能,手動執行數學運算並手動輸入功能;