2013-07-20 52 views
7

Tôi đang cố gắng viết mã bằng MATLAB mô phỏng một con trỏ laser theo cách mà con mèo của tôi sẽ thích thú theo đuổi trên màn hình. Đây là những gì tôi đã thực hiện cho đến nay:mô phỏng một con trỏ laser hiệu quả cho con mèo của tôi bằng cách sử dụng 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 

Các "vấn đề" với mã này như sau:

  1. con trỏ di chuyển nhiều hơn hoặc ít hơn ở một tốc độ không đổi và không làm chậm đến một điểm dừng gần và sau đó bất ngờ tiến hành.

  2. Quỹ đạo có phần lặp lại chính nó, mặc dù tôi đã cố gắng để làm cho nó bằng cách sử dụng số vô tỉ, chuyển động tổng thể là liên tục từ phải sang trái. Tôi nghĩ rằng một sự thay đổi quỹ đạo sắc nét hơn sẽ giúp ích.

Tôi biết đây không phải là câu hỏi lập trình truyền thống nhưng tôi vẫn muốn giải quyết vấn đề lập trình. Tôi đánh giá cao sự giúp đỡ của bạn và tất nhiên mở ra những cách mới để trả lời câu hỏi của tôi mà không sử dụng mã tôi đã thêm vào.

+3

dự án Fantastic . Nhưng với chi phí có khả năng hy sinh một màn hình ?! – voxeloctree

+0

bạn có thể thực hiện khái niệm vị trí, vận tốc và gia tốc, với các tham số để kiểm soát từng vị trí. Tìm kiếm nguồn cảm hứng trong http://gamedev.stackexchange.com – Amro

+0

Thú vị. Bạn thậm chí có thể tìm hiểu một số công cụ mới trong việc thực hiện nó. Mô phỏng [kẻ thu hút lạ] (http://mathworld.wolfram.com/StrangeAttractor.html) hoặc người thu hút hỗn loạn khác. :-) [Lorenz attractor] nổi tiếng (http://en.wikipedia.org/wiki/Lorenz_attractor) khá dễ làm. Hoặc xem xét [các bước đi ngẫu nhiên 2 chiều] (http://en.wikipedia.org/wiki/Random_walk) và [quy trình Wiener] (http://en.wikipedia.org/wiki/Wiener_process) để biết cách thêm tiếng ồn cho một số hệ thống/quy trình khác. – horchler

Trả lời

3

Câu hỏi nổi bật, rất tuyệt, tôi nghĩ tôi sẽ dành 15 phút để có thể tự mình đi. Sau khi nghiên cứu YouTube sâu rộng về kỹ thuật laze tôi nghĩ sử dụng các phương trình của chuyển động để di chuyển giữa các điểm ngẫu nhiên sẽ làm việc tốt:

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 

Chơi xung quanh với các thông số cho đến khi bạn tìm thấy một cái gì đó con mèo của bạn thích: 0)

+1

Để có nhiều chuyển động tự nhiên hơn, tôi khuyên bạn không nên sử dụng phân phối bình thường, mà là luật quyền lực hoặc phân phối Levy. Một phân phối log-normal cũng sẽ hoạt động trong một pinch. – Nigel

+0

Tôi đã thử phân phối bình thường, nhưng tôi vẫn thích phân phối đồng đều hơn! Tôi cho rằng trọng tài thực sự phải là con mèo, mặc dù tôi không chắc chắn làm thế nào bạn sẽ thiết lập một thử nghiệm định lượng để lừa này ...! – en51nm