使矩形沿着轨迹

时间:2019-01-27 18:16:30

标签: matlab animation plot matlab-figure

我正在尝试使矩形的中心遵循一条轨迹,并根据该轨迹旋转它,就像本视频中所示的那样(视频没有轨迹,但显示了一个简单的旋转矩形){{ 3}}。

到目前为止,这是我的代码

figure; 
subplot(2,1,1)
%visualize trajectory
ax = gca;
h = hgtransform('Parent',ax);
hold on
plot(x(1),y(1),'o','Parent',h);
for k = 2:length(x)
    m = makehgtform('translate',x(k)-x(1),y(k)-y(1),0);
    h.Matrix = m;
    axis([2 10 2 10]);
    drawnow
end
subplot(2,1,2)
ax = gca;
polyin = polyshape([0.1 0.1 -0.1 -0.1], [0.2 -0.2 -0.2 0.2]); % %w/2,h/2
% polyin = rectangle('Position',[-0.1 -0.1 0.2, 0.4]);
polyout = rotate(polyin, -atand(Y(1)/X(1)));
polyout = translate(polyout,[X(1) Y(1)]);
plot(polyout);
axis([2 10 2 10]);
for k=2:length(x)
    hold on;
    t = atan((y(k-1)-y(k))/(x(k)-x(k-1)))
%     t = acos((y(k-1)*x(k-1)+y(k)*x(k))/(norm([x(k-1) y(k-1)])*norm([x(k) y(k)])));
%     t = atand(y(k))/(x(k));
    if (x(k)* y(k-1)- y(k)*x(k-1) )< 0
        t = -1*t;
    end
    polyout=translate(polyout,x(k)-x(k-1),y(k)-y(k-1));
    polyout=rotate(polyout, t);
    plot(polyout);
    axis([2 10 2 10]);
    drawnow;
end

我希望矩形向轨迹中的下一个点旋转,并且使中心跟随轨迹,但是我的代码无法正常工作。 非常感谢您的帮助。

x和y数据供参考

x=[2    2.20138766511364    2.40315325924044    2.60463533746946    2.80522353545458    3.00435711210347    3.20152349226664    3.39625680942646    3.58813644838617    3.77678558795894    3.96186974365685    4.14309531037993    4.32020810510520    4.49299190957566    4.66126701298937    4.82488875468838    4.98374606684784    5.13776001716501    5.28688235154823    5.43109403680600    5.57040380333597    5.70484668781400    5.83448257588312    5.95939474484264    6.07968840633708    6.19548924904527    6.30694198136934    6.41420887412373    6.51746830322425    6.61691329237706    6.71275005576773    6.80519654075027    6.89448097053608    6.98084038688309    7.06451919278466    7.14576769515872    7.22484064753668    7.30199579275257    7.37749240563194    7.45158983568100    7.52454604977557    7.59661617485011    7.66805104058679    7.73909572210444    7.80998808264764    7.88095731627572    7.95222249055176    8.02399108923166    8.09645755495312    8.16980183192468    8.24418790861475    8.31976236044063    8.39665289245752    8.47496688204757    8.55478992160887    8.63618436124451    8.71918785145157    8.80381188581016    8.89004034367245    8.97782803285167    9.06709923231116    9.15774623485338    9.24962788980894    9.34256814572560    9.43635459305732    9.53073700685329    9.62542588944692    9.72009101314488    9.81435996291615    9.90781667908099    10]

y=[2    2.02032989606539    2.04061708413251    2.06134914940940    2.08296946958339    2.10587858004199    2.13043553909377    2.15695929318928    2.18573004214188    2.21699060434868    2.25094778201139    2.28777372635721    2.32760730285977    2.37055545645991    2.41669457678668    2.46607186337814    2.51870669090231    2.57459197437800    2.63369553439574    2.69596146233865    2.76131148560331    2.82964633282069    2.90084709907698    2.97477661113452    3.05128079265267    3.13019002940870    3.21132053451867    3.29447571365832    3.37944753028395    3.46601787085333    3.55395991004655    3.64303947598694    3.73301641546193    3.82364595914396    3.91468008681135    4.00586889256917    4.09696195007019    4.18770967773568    4.27786470397637    4.36718323241328    4.45542640709865    4.54236167773681    4.62776416490505    4.71141802527453    4.79311781683116    4.87266986409647    4.94989362334853    5.02462304784280    5.09670795303304    5.16601538179218    5.23243096963322    5.29586030993012    5.35623031913866    5.41349060201735    5.46761481684833    5.51860204065821    5.56647813443899    5.61129710836894    5.65314248703349    5.69212867464610    5.72840232026917    5.76214368303492    5.79356799736624    5.82292683819765    5.85050948619610    5.87664429298192    5.90170004634970    5.92608733548913    5.95025991620594    5.97471607614275    6]

1 个答案:

答案 0 :(得分:1)

由于您希望矩形围绕其中心旋转,因此应将旋转参考点指定为矩形的中心。其次,旋转时必须记住,在上一步中您已经进行了旋转,因此需要从新角度中减去先前的角度。

polyin = polyshape([0.1 0.1 -0.1 -0.1], [0.2 -0.2 -0.2 0.2]); % %w/2,h/2
% polyin = rectangle('Position',[-0.1 -0.1 0.2, 0.4]);
polyout = translate(polyout,[x(1) y(1)]); 
plot(polyout);
axis([2 10 2 10]);
prev_t = 0;
for k=2:length(x)
    hold on;
    t = atan((y(k)-y(k-1))/(x(k)-x(k-1)))  % corrected formula

%    if (x(k)* y(k-1)- y(k)*x(k-1) )< 0    % commented because I don't see why this should be here
%        t = -1*t;
%    end

    polyout=translate(polyout,x(k)-x(k-1),y(k)-y(k-1));
    polyout=rotate(polyout, t - prev_t, [x(k) y(k)]);
    plot(polyout);
    axis([2 10 2 10]);
    drawnow;
    prev_t = t;
end