アナログ時計

1.作成方法

表示例

アナログ時計サンプル

  
     
  • コンパイラは「Borland C++ Compiler 5.5」を用います。
  •  
  • グラフィック・ライブラリには「GLIBW32 ver1.33」を用います。ライブラリを使うための環境設定は、リンクのページをご参照ください。
  •    
  • 下記のサンプルプログラムを例に、プログラムを作成します。このとき、プログラムの拡張子は、「cpp」にしてください。グラフィック・ライブラリ GLIBW32 を使用するには、拡張子が cpp の C++ のファイルとして保存する必要があります。
  •  
  • 背景画像が必要な場合には下の「clock.bmp」をお使いください。このビットマップファイルはソースファイルと同じフォルダに保存してください。
  • なお、このサンプルプログラムはスペースキーを押下すると終了します。
  •   
  

 

2.サンプルプログラム

#include <math.h>
#include <time.h>
#include "glibw32.h"

#define WXsize 240   /* ウインドウ横サイズ */
#define WYsize 240   /* ウインドウ縦サイズ */

#define HHAND 60     /* 時針の長さ*/
#define MHAND 90     /* 分針の長さ*/
#define SHAND 90     /* 秒針の長さ*/
#define MPI 3.14159  /* 円周率    */
struct point {       /* 座標x,y   */
    int x, y;
};
struct aclock {      /* 針の座標 中心・時・分・秒*/
    struct point c, h, m, s;
};
void get_clock(struct tm *t, struct aclock *clk);

int main(void)
{
    time_t timer, svtm = 0;
    struct tm *t;
    struct aclock clk;

    ginit(WXsize, WYsize, WHITE);         /* グラフィックスの初期化 */

    clk.c.x = WXsize / 2;                 /* 中心座標の設定         */
    clk.c.y = WYsize / 2;

    while(vkey() != VK_SPACE) {           /* スペースキーが押されるまで */
        time(&timer);                     /* 現在時刻を得る             */
        if (timer != svtm) {              /* 時間が更新したら           */
            svtm = timer;
            t = localtime(&timer);
            get_clock(t, &clk);           /* 針の描画情報を得る */
            loadbmp("clock.bmp");         /* 背景画像の読み込み */
            setlinestyle(PS_SOLID, 5);                        /* 線の種類と幅を設定 */
            line(clk.c.x, clk.c.y, clk.h.x, clk.h.y, BLUE);   /* 時針の描画         */
            setlinestyle(PS_SOLID, 3);                        /* 線の種類と幅を設定 */
            line(clk.c.x, clk.c.y, clk.m.x, clk.m.y, BLUE);   /* 分針の描画         */
            setlinestyle(PS_SOLID, 1);                        /* 線の種類と幅を設定 */
            line(clk.c.x, clk.c.y, clk.s.x, clk.s.y, BLUE);   /* 秒針の描画         */
            fcircle(clk.c.x, clk.c.y, 5, YELLOW);             /* 中心の円の描画     */
            circle(clk.c.x, clk.c.y, 5, BLACK);
        }
    }
    gend();                                /* グラフィックス終了 */

    return 0;
}
/** 時計の描画情報を得る **/
/* *t:時刻構造体 *clk:時計座標構造体 */
void get_clock(struct tm *t, struct aclock *clk)
{
    int h_angle, m_angle, s_angle;        /* 針の角度 */
    int hour;
    
    if (t->tm_hour >= 12) hour = t->tm_hour - 12;
    else                  hour = t->tm_hour;
    /* 針の角度を求める */
    if (hour <= 3) h_angle = 90 - hour*30 - t->tm_min/2;
    else           h_angle = 450 - hour*30 - t->tm_min/2;
    if (t->tm_min <= 15) m_angle = 90 - t->tm_min*6;
    else                 m_angle = 450 - t->tm_min*6;
    if (t->tm_sec <= 15) s_angle = 90 - t->tm_sec*6;
    else                 s_angle = 450 - t->tm_sec*6;
    /* 針の先の座標を算出 */
    clk->h.x = clk->c.x + HHAND * cos(h_angle * MPI / 180);  
    clk->h.y = clk->c.y - HHAND * sin(h_angle * MPI / 180);
    clk->m.x = clk->c.x + MHAND * cos(m_angle * MPI / 180);
    clk->m.y = clk->c.y - MHAND * sin(m_angle * MPI / 180);
    clk->s.x = clk->c.x + SHAND * cos(s_angle * MPI / 180);
    clk->s.y = clk->c.y - SHAND * sin(s_angle * MPI / 180);
}

 

3.使用しているビットマップ(clock.bmp)

無いよりはましかな、程度の時計の背景をビットマップファイルで作りました。必要な方は、ダウンロード又は右クリックして「名前を付けて画像を保存」してお使いください。clock.bmp(169Kbyte,240ピクセル×240ピクセル)

▲▲戻る▲▲


ドリル&ゼミナールC言語
「ドリル&ゼミナールC言語」
毎日コミュニケーションズ発行
ISBN 4-8399-1077-4