0

ここに画像の説明を入力!MATLAB を使用してアナログ時計を設計しています。現在、私のコードは時計のデザインを針 (時間、分、秒) で表示 (またはむしろプロット) するだけで、カチカチ音をたてません。これが私のコードです:

function raviClock(h,m,s)
drawClockFace;


%TIMER begins-------
t = timer;
t.ExecutionMode = 'FixedSpacing';  %Use one of the repeating modes
t.Period = 1;                      %Fire on 1 second intervals
t.TimerFcn = @timer_setup;           %When fired, call this function
start(t);
set(gcf,'DeleteFcn',@(~,~)stop(t));
end

function timer_setup(varargin)

format shortg;
timenow = clock;
h = timenow(4);
m = timenow(5);
s = timenow(6);

% hour hand
hours= h + m/60 + s/3600;
hourAngle= 90 - hours*(360/12);

% compute coordinates for pointing end of hour hand and draw it
[xhour, yhour]= polar2xy(0.6, hourAngle);
plot([0 xhour], [0 yhour], 'k-','linewidth',7.4)

% minute hand
mins= m + s/60;
minsAngle= 90 - mins*(360/60);

% compute coordinates for pointing end of minute hand and draw it
[xmins, ymins]= polar2xy(0.75, minsAngle);
plot([0 xmins], [0 ymins], 'r-','linewidth',4)


%second's hand
second = s;
secAngle = 90- second*(360/60);

[xsec, ysec]= polar2xy(0.85, secAngle);
plot([0 xsec], [0 ysec], 'm:','linewidth',2)
%end   % while ends
end

%--------------------------------------------------------

function drawClockFace

%close all          
axis([-1.2 1.2 -1.2 1.2])  
axis square equal
hold on            


theta= 0;
for k= 0:59
    [xX,yY]= polar2xy(1.05,theta);
        plot(xX,yY,'k*')

        [x,y]= polar2xy(0.9,theta);
    if ( mod(k,5)==0 )  % hour mark
        plot(x,y,'<')
    else                % minute mark
        plot(x,y,'r*')
    end
    theta= theta + 360/60;
    end
end

%-----------------------------------------------------------------
function [x, y] = polar2xy(r,theta)

rads= theta*pi/180;  
x= r*cos(rads);
y= r*sin(rads);
end

これは、関数を最初に呼び出すときに、HOUR、MINUTE、および SECOND 引数の値の静的データを取得するだけです。whileループで次を使用してみましたが、あまり役に立ちませんでした

format shortg
c=clock
clockData = fix(c)
h = clockData(4)
m = clockData(5)
s = clockData(6)

h、m、および s をそれぞれの cuntions に渡します。[hrs mins secs] の情報を抽出するために TIMER オブジェクトとコールバックを使用する方法を知りたいので、時計の刻みに合わせてそれぞれのポイント座標をリアルタイムで計算できます。

4

1 に答える 1

6

ここでいくつかのことを行います。

まず、現在の時刻を表示している場合はh、 , m,入力を渡す必要はおそらくないでしょう。sこれを関数の先頭に追加して、これらの変数を自動設定します。

if nargin == 0
    [~,~,~,h,m,s] = datevec(now);
end

次に、この関数を定期的に呼び出す時間を使用するのは非常に簡単です。このようなもの。

t = timer;
t.ExecutionMode = 'FixedSpacing';  %Use one of the repeating modes
t.Period = 1;                      %Fire on 1 second intervals
t.TimerFcn = @(~,~)raviClock;      %When fired, call this function (ignoring 2 inputs)
start(t);                          %GO!

docsearch timerタイマー オブジェクトの詳細なドキュメントに使用します。しかし、上記のコードから始める必要があります。

タイマーを停止するには、実行します

stop(t);

ウィンドウが閉じられたときにタイマーを停止するには、停止コマンドをウィンドウ削除コールバックに入れます。

set(gcf,'DeleteFcn',@(~,~)stop(t));  %NOte:  Better to explicitly use a figure number, rather than gcf.
于 2013-07-31T21:17:05.843 に答える