C++使用easyx画实时走动的钟表

这次的任务是用c++画出实时走动的钟表,并且与当前系统的时间一致。

由于我们使用的是c++语言,我们更需要用这个例子来提高我们对面向对象程序设计的理解。

我们首先需要分析出需求,“画一个能够实时走动的钟表”,根据需求我们可以好处两个对象,钟表对象与画图对象,所以我们大致先建立两个类,Clock类与Paint类。

Clock类中的成员变量都有:表的中心坐标x与y、表的时间(时、分、秒)、表的大小r(即半径)、表盘的颜色color。

Clock类中无其他函数,只有用于初始化的构造函数。

Paint类中无任何成员变量,只有三个函数:画表盘函数drawClock_bk、画表盘刻度函数drawClock_scale、画表针函数drawClock_sharp

其中画表盘是非常简单的,最最困难的就是画刻度函数与画表针函数。

要想要画出刻度与表针,就必须知道如何得画刻度的两个坐标。

下面先来了解下如何求得坐标(纯数学知识)

如图:

如果要求圆上一点a的坐标(x,y),利用三角函数,若a点与圆心o(x0,y0)连线与x轴的夹角大小为c,r为半径,则a的横坐标x值为x0+cos(c)*r,a的纵坐标y为y0-sin(c)*r,这样就可求得圆上任意一点的坐标。然后我们需要画出刻度,即我们还需要圆心o与圆上一点a的连线上的另一个坐标,这样才可以画出刻度。如图:

如图点b是点a与圆心o连线上的一点。假设我们需要画的刻度长度是s,所以a与b连线的距离为s,b与圆心连线的距离为r-s,所以根据三角函数也可以求得点b的坐标为x:x0+cos(c)*(r-s),y为:y0-sin(c)*(r-s)。

这下有a、b这两点的坐标就可以画出一个刻度了,然后根据表盘的实际分布可以将所有的刻度画出来了(即每个刻度为5度)。

表针的画法与刻度类似:需要找这个b这种点(圆心与圆上的点连线上的点),然后根据你指定的针长和夹角,就可以求出b点的坐标。然后用b点坐标和圆心坐标就可以画出对应的指针了。

最重要的坐标求法就是这样了,剩下具体的细节请看下面代码:

#include <iostream>
#include <cstdio>
#include <iomanip>
#include <graphics.h>
#include <conio.h>
#include <time.h>
#include <cstdlib>
#include <cmath>
 
 
#define PI 3.1415
using namespace std;
 
class Clock
{
public:
    int _x;
    int _y;
    int _hour;
    int _minute;
    int _second;
    int _r;
    COLORREF _bk_col;
public:
    Clock(int x,int y,int h,int m,int s,int r,COLORREF bk_color)
    {
        this->_x = x;
        this->_y = y;
        this->_hour = h;
        this->_minute = m;
        this->_second = s;
        this->_r = r;
        this->_bk_col = bk_color;
    }
};
 
class Paint
{
public :
    void drawclock_bk(Clock c);
    void drawclock_scale(Clock c);
    void drawclock_sharp(Clock c);
};
 
void Paint::drawclock_bk(Clock c)
{
    setcolor(RGB(0,0,0));
    setfillcolor(RGB(0,0,0));
    fillcircle(c._x,c._y,c._r);
}
 
void Paint::drawclock_scale(Clock c)
{
    int x1,y1;
    int x2, y2;
    setlinecolor(RGB(255, 255, 255));
    for (int a = 1; a <= 60;a++)
    {
        if (a <= 15)
        {
            x1 = static_cast<int>(c._x + (cos(a*(PI / 30)))*c._r);
            y1= static_cast<int>(c._y - (sin(a*(PI / 30)))*c._r);
            if (a % 5 == 0)
            {
                x2 = static_cast<int>(c._x + (cos(a*(PI / 30)))*(c._r - 15));
                y2 = static_cast<int>(c._y - (sin(a*(PI / 30)))*(c._r - 15));
            }
            else
            {
                x2 = static_cast<int>(c._x + (cos(a*(PI / 30)))*(c._r - 5));
                y2 = static_cast<int>(c._y - (sin(a*(PI / 30)))*(c._r - 5));
            }
        }
        else if (a > 15 && a <= 30)
        {
            x1 = static_cast<int>(c._x + (cos(a*(PI / 30)))*c._r);
            y1 = static_cast<int>(c._y - (sin(a*(PI / 30)))*c._r);
            if (a % 5 == 0)
            {
                x2 = static_cast<int>(c._x + (cos(a*(PI / 30)))*(c._r - 15));
                y2 = static_cast<int>(c._y - (sin(a*(PI / 30)))*(c._r - 15));
            }
            else
            {
                x2 = static_cast<int>(c._x + (cos(a*(PI / 30)))*(c._r - 5));
                y2 = static_cast<int>(c._y - (sin(a*(PI / 30)))*(c._r - 5));
            }
        }
        else if (a > 30 && a <= 45)
        {
            x1 = static_cast<int>(c._x + (cos(a*(PI / 30)))*c._r);
            y1 = static_cast<int>(c._y - (sin(a*(PI / 30)))*c._r);
            if (a % 5 == 0)
            {
                x2 = static_cast<int>(c._x + (cos(a*(PI / 30)))*(c._r - 15));
                y2 = static_cast<int>(c._y - (sin(a*(PI / 30)))*(c._r - 15));
            }
            else
            {
                x2 = static_cast<int>(c._x + (cos(a*(PI / 30)))*(c._r - 5));
                y2 = static_cast<int>(c._y - (sin(a*(PI / 30)))*(c._r - 5));
            }
        }
        else if (a > 45 && a <= 60)
        {
            x1 = static_cast<int>(c._x + (cos(a*(PI / 30)))*c._r);
            y1 = static_cast<int>(c._y - (sin(a*(PI / 30)))*c._r);
            if (a % 5 == 0)
            {
                x2 = static_cast<int>(c._x + (cos(a*(PI / 30)))*(c._r - 15));
                y2 = static_cast<int>(c._y - (sin(a*(PI / 30)))*(c._r - 15));
            }
            else
            {
                x2 = static_cast<int>(c._x + (cos(a*(PI / 30)))*(c._r - 5));
                y2 = static_cast<int>(c._y - (sin(a*(PI / 30)))*(c._r - 5));
            }
        }
    
        line(x1, y1,x2, y2);
    }
    setfillcolor(RGB(255,255,255));
    fillcircle(c._x,c._y,5);
}
 
void Paint::drawclock_sharp(Clock c)
{    
    int x1, y1;
    int x2, y2;
    int x3, y3;
    setlinecolor(RGB(255,255,255));
    x3 = static_cast<int>(c._x + (cos(static_cast<double>(15 - c._second)*(PI / 30)))*static_cast<double>(0.8*c._r));
    x2 = static_cast<int>(c._x + (cos(static_cast<double>(15 - c._minute - static_cast<double>(c._second) / 60)*(PI / 30)))*static_cast<double>(0.6*c._r));
    x1 = static_cast<int>(c._x + (cos(static_cast<double>(3 - c._hour - static_cast<double>(c._minute) / 60)*(PI / 6)))*static_cast<double>(0.4*c._r));
    y3 = static_cast<int>(c._y - (sin(static_cast<double>(15 - c._second)*(PI / 30)))*static_cast<double>(0.8*c._r));
    y2 = static_cast<int>(c._y - (sin(static_cast<double>(15 - c._minute - static_cast<double>(c._second) / 60)*(PI / 30)))*static_cast<double>(0.6*c._r));
    y1 = static_cast<int>(c._y - (sin(static_cast<double>(3 - c._hour - static_cast<double>(c._minute) / 60)*(PI / 6)))*static_cast<double>(0.4*c._r));
    line(c._x, c._y, x1, y1);
    line(c._x, c._y, x2, y2);
    line(c._x, c._y, x3, y3);
}
 
int main()
{
    initgraph(1024,576);
    setbkcolor(RGB(255, 255, 255));
    cleardevice();
    time_t nowtime;
    struct  tm* ptime;
    
    if (time(&nowtime))
    {
        ptime = localtime(&nowtime);
    }
    Clock c(512, 288,ptime->tm_hour, ptime->tm_min, ptime->tm_sec, 120, RGB(255, 255, 255));
    Paint p1;
    p1.drawclock_bk(c);
    p1.drawclock_scale(c);
    p1.drawclock_sharp(c);
        int flag=0;
    while (true)
    {
        Sleep(1000);
        ++c._second;
        c._second%=60;
        if (c._second== 0)
        {
 
            c._minute++;
        }
            c._minute %= 60;
                if(c._minute==1)
                {
                    flag=0;
 
        if (c._minute == 0&&flag==0)
        {
            c._hour++;
                        flag=1;
        }
            c._hour %= 24;
        p1.drawclock_bk(c);
        p1.drawclock_scale(c);
        p1.drawclock_sharp(c);
    }
 
    _getch();
    closegraph();
    return 0; 
}

vs2013运行效果如图:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • C++实现图形界面时钟表盘代码

    本文实例讲述了C++实现图形界面时钟表盘代码,分享给大家供大家参考. 具体实现代码如下: 复制代码 代码如下: //POINT的数组可以这么用      POINT pt[]={          0, 450,          225,390,          390,225,          450,0,          390,-225,          225,-390,          0,-450,          -225,-390,          -390,-2

  • C++ clock()解析如何使用时钟计时的应用

    C/C++中的计时函数是clock(),而与其相关的数据类型是clock_t.在MSDN中,查得对clock函数定义如下: clock_t clock( void ); 这个函数返回从"开启这个程序进程"到"程序中调用clock()函数"时之间的CPU时钟计时单元(clock tick)数,在MSDN中称之为挂钟时间(wal-clock).其中clock_t是用来保存时间的数据类型,在time.h文件中,我们可以找到对它的定义:#ifndef _CLOCK_T_DE

  • VC++时钟函数

    时钟的使用 1.声明 复制代码 代码如下: VOID CALLBACK playproc(   HWND hwnd,     // handle of window for timer messages   UINT uMsg,     // WM_TIMER message   UINT idEvent,  // timer identifier   DWORD dwTime   // current system time ) 2.声明一个时钟句柄 const  ID=111; 3.调用时钟

  • C++ Qt绘制时钟界面

    首先来看一下效果: 大概就是这样子,需要注意的是,这里你需要创建一个基类为Widget的界面来绘制时钟,以至于后期你想把这个时钟放到任意一个界面,你只需要在那个界面的ui里面添加一个widget,然后将它提升为这个时钟界面,并设定它的大小. widget.h文件 #ifndef WIDGET_H #define WIDGET_H #include<math.h> #include<QResizeEvent> #include<QGroupBox> #include<

  • C++实现电子时钟效果

    本文实例为大家分享了C++实现电子时钟的具体代码,供大家参考,具体内容如下 此精确到秒,因为有精度误差加上从计算机获取初始时间时处理比较简单,因此运行一段时间会出现较大的误差. 代码可共享 #include<iostream> #include<iomanip> #include<Windows.h> using namespace std; class Clock { private:     int hour, minute, second;     int yea

  • C++使用easyx画实时走动的钟表

    这次的任务是用c++画出实时走动的钟表,并且与当前系统的时间一致. 由于我们使用的是c++语言,我们更需要用这个例子来提高我们对面向对象程序设计的理解. 我们首先需要分析出需求,“画一个能够实时走动的钟表”,根据需求我们可以好处两个对象,钟表对象与画图对象,所以我们大致先建立两个类,Clock类与Paint类. Clock类中的成员变量都有:表的中心坐标x与y.表的时间(时.分.秒).表的大小r(即半径).表盘的颜色color. Clock类中无其他函数,只有用于初始化的构造函数. Paint类

  • python学习之使用Matplotlib画实时的动态折线图的示例代码

    有时,为了方便看数据的变化情况,需要画一个动态图来看整体的变化情况.主要就是用Matplotlib库. 首先,说明plot函数的说明. plt.plot(x,y,format_string,**kwargs) x是x轴数据,y是y轴数据.x与y维度一定要对应. format_string控制曲线的格式字串 下面详细说明: color(c):线条颜色 linestyle(ls):线条样式 linewidth(lw):线的粗细 关于标记的一些参数: marker:标记样式 markeredgecol

  • Android实现仪表盘效果

    本文实例为大家分享了Android实现仪表盘效果的具体代码,供大家参考,具体内容如下 仪表盘效果,圆弧可变色,效果图如下: 通过自定义view实现,代码如下: public class DashboardView extends View { private int mRadius; // 画布边缘半径(去除padding后的半径) private int mStartAngle = 150; // 起始角度 private int mSweepAngle = 240; // 绘制角度 priv

  • Python中利用pyqt5制作指针钟表显示实时时间(指针时钟)

    文末附完整源代码实现过程... 想实现这样一个功能,然后pyqt5中又没有现成的组件可以使用,于是就想着只能通过绘图的方式来实现.说到绘图的话,turtle框架无疑是最常见的选择,但其实通过pyqt5的QPainter组件也是可以实现的.而且最后呈现出来的效果还是挺漂亮的. 实现思路:通过使用pyqt5的QPainter组件来绘制好时钟的图表,最后通过定时器不断的改变当前当前时间在图表上面的显示位置.这样最终就实现了一个指针时钟在不断的走动的过程. 和前面的UI应用一样,我们用到的UI相关的组件

  • python 使用turtle实现实时钟表并生成exe

    源代码 python引入两个内置库turtle和datetime即可制作一个实时钟表,代码如下: # 用turtle画时钟 # 以自定义shape的方式实现 import turtle as t import datetime as d def skip(step): # 抬笔,跳到一个地方 t.penup() t.forward(step) t.pendown() def drawClock(radius): # 画表盘 t.speed(0) t.mode("logo") # 以Lo

  • C语言基于EasyX库实现有图形界面钟表

    本文实例为大家分享了C语言基于EasyX库实现有图形界面钟表的具体代码,供大家参考,具体内容如下 1.目标要求: 实现一个显示图像的时钟 2.C语言代码: #include<graphics.h> //需要提前下载EasyX库哦 #include<stdio.h> #include<stdlib.h> #include<windows.h> #include<conio.h> #include<math.h> #define High

  • C语言实现实时钟表

    本文实例为大家分享了C语言实现实时钟表的具体代码,供大家参考,具体内容如下 一.最终效果展示 效果图如下: 二.绘制静态秒针 代码如下: #include<graphics.h> #include<conio.h> #include<math.h> #define High 480 //游戏画面尺寸 #define Width 640 int main(void) {     initgraph(Width,High);//初始化绘图窗口     int center_

  • 原生JS实现实时钟表

    分享一个用原生JS实现的实时钟表特效,效果如下(PS:实际指针是按360度走的,截图时只截了一部分) 上面的效果一共需要4张图片,分别是表盘.时针.分针.秒针,根据需要可以自己做图片,实现的代码如下: <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title>原生JS实现实时钟表</title> <style

  • C++使用easyX库实现三星环绕效果流程详解

    目录 1,项目描述 2,解决思路 3,关键代码 4,项目运行截图 5,具体代码实现 1,项目描述 功能1:使用图形化的方式描述地球围绕着太阳转动,月球围绕着地球转动 功能2:在转动的过程中当用户按下1,2,3,4,5,6,7时它可以变换出7种不同的颜色,当用户按下8时它可以变换从1-7的颜色依次变换当用户再次按下8键时停止变换颜色 功能3:当用户按下上键时,地球会围绕太阳反转,当再次按下上键时地球会恢复到正转 功能4:当用户按下空格键的时候,所有动画暂停,当再次按下空格键的时候所有动画继续进行.

  • 使用Python编写简单的画图板程序的示例教程

    从这次开始,我会由简单到困难(其实也不会困难到哪里去)讲几个例程,每一个例程都是我自己写(或者修改,那样的话我会提供原始出处)的,都具有一定的操作性和娱乐性.例程中汇尽量覆盖到以前所讲的pygame中方方面面,如果看到哪一步不明白,那就再回去复习复习,基本没有人会看一遍什么都记住什么都掌握的,重复是学习之母,实践是掌握一门技艺的最好手段! 这次就先从一个最简单的程序开始,说实话有些太简单我都不好意思拿出手了,不过从简单的开始,容易建立自信培养兴趣.兴趣是学习之母嘛.我们这次做一个画板,类似Win

随机推荐