プログラミングのメモ帳(C/C++/HSP)

日々のプログラミングで気づいた点や小技集を紹介します。(Windows 10/XP/Vista、VC2017、HSP)

[HSP]アナログ時計のソース(1)

2014年08月31日 19時58分00秒 | HSP講座

スクリプト言語の HSP については、公式ホームページの「HSPTV!」をどうぞ。(戻る)


ここには、アナログ時計のサンプル・ソース(1)を載せておきます。
コンパイル・オプションとして ANALOG_BIG を定義すると「大きい時計」、定義しないと「小さい時計」を描きます。
sin、cos 関数を使って角度から座標を求める事で line 命令で時針、分針、秒針を描いてます。
なお、数学のデカルト座標とは異なり、縦軸のY座標は上がマイナスの角度、下がプラスの角度になります。
ここに注意しないと反時計周りに針が描画されます。

さらに数学では横軸は sin 関数、縦軸は cos 関数を使いますが、
これは午後3時の水平線が 0 度と考えてるからです。
アナログ時計を描くときには 90 度ずらす必要があるので、
横軸を cos 関数、縦軸を sin 関数にすることで 0 度が昼12時になります。

アナログ時計のソース(1)

管理上このサンプルは sample59a(アナログ時計).hsp のソースです。

//------------------------------------------------------------------------------
// アナログ時計のサンプル by 科学太郎
//==============================================================================
// 新規作成日:2014-08-13 (水) 11:15:00
// 最終更新日:2014-08-13 (水) 13:48:00
//------------------------------------------------------------------------------
#define ANALOG_BIG
;↑
;コメントにすると「小さい時計」を表示します。

//--------------------------------------
// 記号定数(大きい時計)
//--------------------------------------
#ifdef ANALOG_BIG
#const ANALOG_MARGIN    (10)                    ;円の余白(マージン)
#const ANALOG_SIZE      (400)                   ;円の直径
#const ANALOG_HALF      (ANALOG_SIZE/2)         ;円の半径
#
#const ANALOG_FRAME     (15)                    ;外枠の太さ
#const ANALOG_SCALE1    (3)                     ;目盛りピン(半径,1分毎)
#const ANALOG_SCALE5    (8)                     ;目盛りピン(半径,5分毎)
#const ANALOG_CENTER    (8)                     ;中心のピン(半径)
#
#const ANALOG_TIPLEN    (ANALOG_HALF-ANALOG_FRAME-ANALOG_SCALE5)
#const ANALOG_H_STICK   (ANALOG_TIPLEN*2/3)     ;時針の出っ張りドット
#const ANALOG_M_STICK   (ANALOG_TIPLEN*7/8)     ;分針の出っ張りドット
#const ANALOG_S_STICK   (ANALOG_TIPLEN*1/1)     ;秒針の出っ張りドット
#else

//--------------------------------------
// 記号定数(小さい時計)
//--------------------------------------
#const ANALOG_MARGIN    (0)                     ;円の余白(マージン)
#const ANALOG_SIZE      (96)                    ;円の直径
#const ANALOG_HALF      (ANALOG_SIZE/2)         ;円の半径
#
#const ANALOG_FRAME     (5)                     ;外枠の太さ
#const ANALOG_SCALE1    (0)                     ;目盛りピン(半径,1分毎)
#const ANALOG_SCALE5    (3)                     ;目盛りピン(半径,5分毎)
#const ANALOG_CENTER    (4)                     ;中心のピン(半径)
#
#const ANALOG_TIPLEN    (ANALOG_HALF-ANALOG_FRAME-ANALOG_SCALE5)
#const ANALOG_H_STICK   (ANALOG_TIPLEN*2/3)     ;時針の出っ張りドット
#const ANALOG_M_STICK   (ANALOG_TIPLEN*7/8)     ;分針の出っ張りドット
#const ANALOG_S_STICK   (ANALOG_TIPLEN*1/1)     ;秒針の出っ張りドット
#endif

//--------------------------------------
// メイン部
//--------------------------------------
*Init
    cx=ANALOG_MARGIN
    cy=ANALOG_MARGIN
    ex=cx+ANALOG_SIZE-1
    ey=cy+ANALOG_SIZE-1
    rx=cx+ANALOG_HALF
    ry=cy+ANALOG_HALF
*Main
    n=ANALOG_MARGIN+ANALOG_SIZE+ANALOG_MARGIN
#ifdef ANALOG_BIG
    screen 0,n,n,SCREEN_NORMAL
#else
    screen 0,n,n,SCREEN_NORMAL|SCREEN_TOOL
    gsel 0,2
#endif
    title "アナログ時計"
    color $FF,$DD,$FF:boxf
    repeat
        redraw 0
        nHour=gettime(4)
        nMin=gettime(5)
        nSec=gettime(6)
        hMSec=gettime(7)
        DrawAnalog cx,cy,ex,ey
        DrawHour rx,ry,nHour,nMin
        DrawMin  rx,ry,nMin,nSec
        DrawSec  rx,ry,nSec,hMSec
        DrawPin  rx,ry
        redraw 1
        await 100
    loop
    stop
//--------------------------------------
// 文字盤の描画
//--------------------------------------
#deffunc DrawAnalog int _cx_,int _cy_,int _ex_,int _ey_
    ;文字盤
    n=ANALOG_FRAME
    color $66,$33,$00:circle _cx_+0,_cy_+0,_ex_-0,_ey_-0,1
    color $FF,$FF,$FF:circle _cx_+n,_cy_+n,_ex_-n,_ey_-n,1
    ;目盛り(1分毎)
    color $99,$66,$00
    repeat 60
        n=(6*cnt)                       ;(360/60*cnt)
        m=DEG2RAD(n)
        x=_cx_+ANALOG_HALF+sin(m)*ANALOG_TIPLEN
        y=_cy_+ANALOG_HALF-cos(m)*ANALOG_TIPLEN
        n=ANALOG_SCALE1:circle (x-n),(y-n),(x+n-1),(y+n-1),1
    loop
    ;目盛り(5分毎)
    color $99,$66,$00
    repeat 12
        n=(30*cnt)                      ;(360/12*cnt)
        m=DEG2RAD(n)
        x=_cx_+ANALOG_HALF+sin(m)*ANALOG_TIPLEN
        y=_cy_+ANALOG_HALF-cos(m)*ANALOG_TIPLEN
        n=ANALOG_SCALE5:circle (x-n),(y-n),(x+n-1),(y+n-1),1
    loop
    return
//--------------------------------------
// 時針の描画
//--------------------------------------
#deffunc DrawHour int _rx_,int _ry_,int _hour_,int _min_
    if(_hour_>=12):h=_hour_-12:else:h=_hour_
    n=(30*h)                            ;(360/12*h)
    n=(30*h+_min_/2)                    ;(360/12*h)+(360/(12*60)*_min_)
    m=DEG2RAD(n)
    x=_rx_+sin(m)*ANALOG_H_STICK
    y=_ry_-cos(m)*ANALOG_H_STICK
    color $00,$00,$FF
    line x,y,_rx_,_ry_
    return
//--------------------------------------
// 分針の描画
//--------------------------------------
#deffunc DrawMin int _rx_,int _ry_,int _min_,int _sec_
    n=(6*_min_)                         ;(360/60*_min_)
    n=(6*_min_)+(_sec_/10)              ;(360/60*_min_)+(360/(60*60)*_sec_)
    m=DEG2RAD(n)
    x=_rx_+sin(m)*ANALOG_M_STICK
    y=_ry_-cos(m)*ANALOG_M_STICK
    color $00,$FF,$00
    line x,y,_rx_,_ry_
    return
//--------------------------------------
// 秒針の描画
//--------------------------------------
#deffunc DrawSec int _rx_,int _ry_,int _sec_,int _hsec_
    n=(6*_sec_)                         ;(360/60*_sec_)
    n=(6*_sec_)+(_hsec_*6/1000)         ;(360/60*_sec_)+(360/(60*1000)*_hsec_)
    m=DEG2RAD(n)
    x=_rx_+sin(m)*ANALOG_S_STICK
    y=_ry_-cos(m)*ANALOG_S_STICK
    color $FF,$00,$00
    line x,y,_rx_,_ry_
    return
//--------------------------------------
// 中心ピンの描画
//--------------------------------------
#deffunc DrawPin int _rx_,int _ry_
    x1=_rx_-ANALOG_CENTER
    y1=_ry_-ANALOG_CENTER
    x2=_rx_+ANALOG_CENTER
    y2=_ry_+ANALOG_CENTER
    color $99,$66,$00:circle x1,y1,x2,y2,1
    color $66,$33,$00:circle x1,y1,x2,y2,0
    return
//------------------------------------------------------------------------------
// End of sample59a.hsp
//------------------------------------------------------------------------------

スクリーン・ショット

 

  • 青色は時針、緑色は分針、赤色は秒針になります。
  • 大きい時計は「07時59分45秒」を表してます。
  • 小さい時計は「08時00分50秒」を表してます。

関連記事



コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« [HSP]ディスク容量の取得(1) | トップ | [HSP]アナログ時計のソース... »
最新の画像もっと見る

コメントを投稿

HSP講座」カテゴリの最新記事