正如一些已提供的評論指出,這兩個主要問題有:
新的角度計算的方式
「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次迭代的結果。
希望這有助於。
請張貼一些代碼,並顯示你到目前爲止。你有什麼試圖解決這個問題?基於角度,座標(x,y)是否以可預測的方式變化?這可以幫助調試。 – ohruunuruus
我只有在de點到達半徑爲500的點時做了某些事情的驗證。我使用x,y使用了點的maginitude,但我不知道如何改變角度以保持點circule – user3312370
我試圖生成randon值* pi,然後用它來計算新的x,y爲新的角度,但這不起作用 – user3312370