7

猫が画面上でレーザーポインターを追いかけて楽しめるように、レーザーポインターをエミュレートするコードをmatlabを使用して記述しようとしています。これは私がこれまでに行ったことです:

figure('menubar','none','color','k')
h = plot(0,'r.','MarkerSize',20);
xlim([-1 1]);  ylim([-1 1])
axis off
phi1=(1+sqrt(5))/2;
phi2=sqrt(3);
step= 0.0001; % change according to machine speed
for t=0:step:100
    set(h,'xdata',sin(t+phi1*t),'ydata',cos(phi2*t))
    drawnow
end

このコードの「問題」は次のとおりです。

  1. ポインターはほぼ一定の速度で移動し、ほぼ停止するまで減速せず、予期せず続行します。

  2. 無理数を使って作ってみましたが、全体的に右から左に動きが連続しています。より鋭い軌道変更が役立つと思います。

これは従来のプログラミングの質問ではないことはわかっていますが、それでもプログラミングの問題を解決したいと考えています。もちろん、私が追加したコードを使用しない新しい方法で私の質問に答えることができます。

4

1 に答える 1

3

Brilliant question, so good I thought I'd take 15 minutes of my life to have a go myself. After extensive YouTube research on laser technique i thought using the equations of motion to move between random points would work well:

n = 20; %number of steps
pos = [0,0]; % initial position
vel = 4; % laser velocity
acc = 400; % laser acelertation
dt = 0.01; % timestep interval
figure
set(gcf,'Position',get(0,'Screensize'));
for i=1:n
    point = rand(1,2);
    dist = 1;
    while dist > 0.05 % loop until we reach the point
        plot(pos(1),pos(2),'o','color','r','MarkerFaceColor','r')
        axis equal
        xlim([0,1])
        ylim([0,1])
        drawnow
        % create random point to move towards
        dist = pdist([point;pos],'euclidean');
        % calculate the direction & mag vector to the point
        dir = (point-pos)/norm((point-pos));
        mag = norm(point-pos);
        % update position
        displ = vel*dt - 0.5*acc*mag*dt^2;
        pos = pos + dir*displ;
    end
end

Play around with the parameters till you find something your cat likes :0)

于 2013-07-20T19:26:04.977 に答える