2015-05-03 54 views
0

我正在用matlab編程。一個點使用隨機方向移動到一個圓圈中。當該點達到該區域的極限時,該點必須在0-180之間改變其角度。我可以找到何時達到極限。但我不知道如何改變角度並繼續這個過程,因爲當我改變角度時,點出現在另一個座標(x,y)處 - 我不想那樣。當點到達位置(x,y)的極限時,我想改變角度並讓點(x,y)繼續。Matlab中的隨機方向

這是我到目前爲止有:

function [ X ] = random_direction() 
    bs = rsmak('circle',500,[0 0]); 
    fnplt(bs,'b'), axis square; 
    hold on 
    magnitud=0; 
    x=0; 
    y=0; 

    base_station(1:10)=struct('id',0,'position_x',0, 'position_y',0); 
    dis=rand()*500; 
    angulo=2*pi*rand(); 
    base_station(1).position_x =dis*cos(angulo); 
    base_station(1).position_y =dis*sin(angulo); 
    bandera=0; 

    for i=1:100 

     magnitud = sqrt(base_station(1).position_x^2+base_station(1).position_y^2); 
     angulo=atan(base_station(1).position_y/base_station(1).position_x); 

     if magnitud >= 500 
      if bandera==0 
       angulo=2*pi*rand(); 
      end 
      x=10 * cos(angulo); 
      y=10 * sin(angulo); 

      base_station(1).position_x= base_station(1).position_x+x; 
      base_station(1).position_y=base_station(1).position_y+y;       
      bandera=1; 
     end 

     if magnitud <500 && bandera==0 
      base_station(1).position_x= base_station(1).position_x+10; 
      base_station(1).position_y=base_station(1).position_y+10; 
     end 

     bs = rsmak('circle',10,[base_station(1).position_x base_station(1).position_y ]); 
     fnplt(bs,'g'), axis square; 
    end 
end 
+0

請張貼一些代碼,並顯示你到目前爲止。你有什麼試圖解決這個問題?基於角度,座標(x,y)是否以可預測的方式變化?這可以幫助調試。 – ohruunuruus

+0

我只有在de點到達半徑爲500的點時做了某些事情的驗證。我使用x,y使用了點的maginitude,但我不知道如何改變角度以保持點circule – user3312370

+0

我試圖生成randon值* pi,然後用它來計算新的x,y爲新的角度,但這不起作用 – user3312370

回答

1

正如一些已提供的評論指出,這兩個主要問題有:

新的角度計算的方式

「if」塊中的錯誤「if magnitud <500 && bandera==0」其中「x」和「y」分別不相乘cos(angulo)sin(angulo)

新角度的計算的一種可能的解決方案是增加爲「angulo」:

PI(180°)只是扭轉軌跡

一個隨機角度偏移,以從 區分新的軌跡前一個避免沿着同一條線上下移動)

角度偏移定義爲「-0.5 and 0.5」之間的固定角度和隨機數的乘積。

當計算新角度時,將進行有效性檢查以驗證新軌跡是否會「退出」該圓。如果是這樣,則偏移角的符號改變。

建議的解決方案已在下面的代碼中實現。

在代碼中,修改後的代碼原始行已用「%%%」(3%)「註釋」。

此外,一些冗餘/不必要的代碼行也被評論過。

某些功能也已被添加:

軌跡標記可在的函數的結束是或者是情節「交互式」(在每個 iteratiion「)或全部一起

繪圖。腳本結尾處的軌跡使腳本更快(當然),在約1.5秒內計算30000次迭代

軌跡點存儲在「X」輸出變量中

迭代的數量是由一個參數

在腳本應澄清修改的註釋定義。

該腳本已被測試多達30000次迭代。

function [ X ] = random_direction() 
% updated plot of the circle 
%%%bs = rsmak('circle',500,[0 0]); 
%%%fnplt(bs,'b'), axis square; 
plot([cos([0:.01:2*pi])*500],[sin([0:.01:2*pi])*500],'b') 
hold on 
daspect([1 1 1]) 
set(gca,'xlim',[-600 600],'ylim',[-600 600]) 
grid on 

magnitud=0; 
x=0; 
y=0; 

% added interactive plot mode flag: 
% interactive=1 plots a mark at each iteraton 
% interactive=0 plots the whole trajectory at the end of the run 
%    trajectory points are also stored in the X output 
%    variable 
interactive=0; 
% added setting of the number of iterations 
n_iterations=30000; 
X=zeros(n_iterations,2); 

% location from 2 to 10 are not used 
base_station(1:10)=struct('id',0,'position_x',0, 'position_y',0); 
dis=rand()*500; 
angulo=2*pi*rand(); 
base_station(1).position_x =dis*cos(angulo); 
base_station(1).position_y =dis*sin(angulo); 
bandera=0; 
% off_angle is used when the point has to invert its direction. its 
% value is multiplied by (rand_numb -0.5). The desired effect is to 
% avoid the point just comes back in the opposite direction 
off_angle=120*pi/180; 

for i=1:n_iterations 

    magnitud = sqrt(base_station(1).position_x^2+base_station(1).position_y^2); 
    % added reset of bandera if magnitud < 500 
    if(magnitud < 500) 
     bandera=0; 
    end 
    % angulo changes only when magnitud is >= 500, so it does not need 
    % to be calculated at each iteration 
    %%%angulo=atan(base_station(1).position_y/base_station(1).position_x); 

    if magnitud >= 500 
     if bandera==0 
      % updated computation of the new angulo 
      %%%angulo=2*pi*rand(); 
      n_rand=rand(); 
      rand_off_angle=off_angle*(n_rand - 0.5); 
      % added check for new angle validity 
      tmp_x=base_station(1).position_x + 10*3 * cos(angulo + pi + rand_off_angle); 
      tmp_y=base_station(1).position_y + 10*3 * sin(angulo + pi + rand_off_angle); 
      tmp_d=sqrt(tmp_x^2+tmp_y^2); 
      if(tmp_d > 500) 
       rand_off_angle= - rand_off_angle; 
      end 
      angulo=angulo + pi + rand_off_angle; 
      % added check for new angle > 360° 
      if(angulo > 2*pi) 
       angulo=angulo-2*pi; 
      end 
     end 
     x=10 * cos(angulo); 
     y=10 * sin(angulo); 

     base_station(1).position_x= base_station(1).position_x+x; 
     base_station(1).position_y=base_station(1).position_y+y;       
     bandera=1; 
    end 

    if magnitud <500 && bandera==0 
     % positions are respectively multiplied by cos(angulo) and 
     % sin(angulo) 
     %%%base_station(1).position_x= base_station(1).position_x+10; 
     %%%base_station(1).position_y=base_station(1).position_y+10; 
     base_station(1).position_x= base_station(1).position_x + 10 * cos(angulo); 
     base_station(1).position_y=base_station(1).position_y + 10 * sin(angulo); 
    end 

    % not neede to re-plot the circle at each iteration 
    %%%bs = rsmak('circle',10,[base_station(1).position_x base_station(1).position_y ]); 
    %%%fnplt(bs,'g'), axis square; 
    % check for interactive plot 
    if(interactive) 
     plot(base_station(1).position_x , base_station(1).position_y,'xr') 
     pause(0.001); 
    end 
    % added storing of trajectory points 
    X(i,1)=base_station(1).position_x; 
    X(i,2)=base_station(1).position_y; 
    % added "pause" command just to slow down the plot 
end 
% added plot of trajectory if not interactive has not been selected 
if(~interactive) 
    plot(X(:,1),X(:,2),'r') 
end 
end 

下圖顯示了300,3000,10000和30000次迭代的結果。

300 Iterations

3000 Iterations

10000 Iterations

30000 Iterations

希望這有助於。