返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++使用easyx画实时走动的钟表
  • 431
分享到

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

2024-04-02 19:04:59 431人浏览 八月长安
摘要

这次的任务是用c++画出实时走动的钟表,并且与当前系统的时间一致。 由于我们使用的是c++语言,我们更需要用这个例子来提高我们对面向对象程序设计的理解。 我们首先需要分析出需求,&l

这次的任务是用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运行效果如图:

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

--结束END--

本文标题: C++使用easyx画实时走动的钟表

本文链接: https://lsjlt.com/news/148911.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C++使用easyx画实时走动的钟表
    这次的任务是用c++画出实时走动的钟表,并且与当前系统的时间一致。 由于我们使用的是c++语言,我们更需要用这个例子来提高我们对面向对象程序设计的理解。 我们首先需要分析出需求,&l...
    99+
    2024-04-02
  • C++怎么使用easyx画实时走动的钟表
    今天小编给大家分享一下C++怎么使用easyx画实时走动的钟表的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。这次的任务是用c...
    99+
    2023-06-30
  • 如何使用HTML5实现会走动的图形时钟
    本篇内容介绍了“如何使用HTML5实现会走动的图形时钟”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!使用H...
    99+
    2024-04-02
  • 如何使用HTML5实现一个时钟动画
    这篇文章主要为大家展示了“如何使用HTML5实现一个时钟动画”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何使用HTML5实现一个时钟动画”这篇文章吧。  ...
    99+
    2024-04-02
  • css3如何利用transform打造走动的2D时钟
    小编给大家分享一下css3如何利用transform打造走动的2D时钟,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!利用transform的旋转rotate打造一...
    99+
    2023-06-08
  • 如何利用CSS3动画实现圆形动态时钟
    小编给大家分享一下如何利用CSS3动画实现圆形动态时钟,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧! 什么是动画?这是我们应该先了解的问题。按照百度百科的解释动画是采用逐帧拍摄对...
    99+
    2024-04-02
  • 如何使用html5和css3实现的小机器人走路动画
    这篇文章主要介绍如何使用html5和css3实现的小机器人走路动画,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!    html5代码如下:  ...
    99+
    2024-04-02
  • python 使用turtle实现实时钟表并生成exe
    源代码 python引入两个内置库turtle和datetime即可制作一个实时钟表,代码如下: # 用turtle画时钟 # 以自定义shape的方式实现 import turt...
    99+
    2024-04-02
  • Unity3D应用之时钟与钟表小组件的使用教程
    目录一、前言二、效果图及源工程下载三、实现3-1 场景搭建3-2 代码实现四、后言一、前言 又见面了哈,今天为大家介绍时钟、钟表的实现方法教程。 实现的方法有很多,这里只是提供了一个...
    99+
    2023-01-30
    Unity3D时钟组件 Unity3D钟表组件 Unity3D 钟表
  • vue使用动画实现滚动表格效果
    本文实例为大家分享了vue使用动画实现滚动表格效果的具体代码,供大家参考,具体内容如下 需求 在一些大屏项目中,需要使用到表格行数据滚动。本文介绍在vue项目中使用动画实现滚动表格。...
    99+
    2024-04-02
  • vue怎么使用动画实现滚动表格效果
    这篇文章主要介绍“vue怎么使用动画实现滚动表格效果”,在日常操作中,相信很多人在vue怎么使用动画实现滚动表格效果问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”vue怎么使用动画实现滚动表格效果”的疑惑有所...
    99+
    2023-06-29
  • 如何使用css3动画实现盒子hover时高度从10到100的动画
    这篇文章主要为大家展示了“如何使用css3动画实现盒子hover时高度从10到100的动画”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何使用css3动画实现...
    99+
    2024-04-02
  • 怎么用纯CSS实现一个人独自行走的动画效果
    小编给大家分享一下怎么用纯CSS实现一个人独自行走的动画效果,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!   代码解读   定义dom,容器中包含3个元素,分别代表头、身体和脚: ...
    99+
    2024-04-02
  • C#调用Windows的API实现窗体动画
    在VF、VB、PB的应用中,有些无法通过语言工具本身来完成的或者做得不理想的功能,我们会考虑通过Windows的API来完成。 在那个年代,熟悉API是一个编程者的基本功。那个时候网...
    99+
    2022-11-13
    C# API实现窗体动画 C# 窗体动画 C# 动画
  • 如何使用CSS3+js实现简单的时钟特效
    小编给大家分享一下如何使用CSS3+js实现简单的时钟特效,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!html代码如下:<...
    99+
    2024-04-02
  • JavaScript动画原理之如何使用js进行动画效果的实现
    目录前言1.动画原理2.动画函数的封装3.给不同元素添加定时器4.缓动动画原理5.给动画添加回调函数6.动画函数的使用写在最后前言 动画对于我们来说都不陌生,css里面就有很多动画,...
    99+
    2023-05-14
    js动画效果有哪些 js动画效果代码案例 javascript动画教程
  • Unity实时画面传输插件FMETP STREAM的使用
    FMETP STREAM是一个局域网实时画面传输的插件,可以用于PC端,安卓端等等,支持画面一对一、一对多传输。接下来我就来介绍一下这个插件的基本使用。 1、导入插件实时画面传输插件FMETP STR...
    99+
    2023-09-02
    网络 服务器 运维 unity
  • 如何使用Css3实现炫酷的打字动画
    这篇文章给大家分享的是有关如何使用Css3实现炫酷的打字动画的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。<!DOCTYPE html><html lang=&...
    99+
    2024-04-02
  • 使用css实现android系统的loading加载动画
    小编给大家分享一下使用css实现android系统的loading加载动画,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!web常用的loading图标有2种, 一...
    99+
    2023-06-08
  • 如何使用MySQL和Ruby实现一个简单的时钟功能
    如何使用MySQL和Ruby实现一个简单的时钟功能时钟功能在各种应用中经常会被使用到,它可以帮助我们记录时间、计时、定时等。在本文中,我们将介绍如何使用MySQL和Ruby来实现一个简单的时钟功能,并提供相应的代码示例。首先,我们需要创建一...
    99+
    2023-10-22
    MySQL Ruby 时钟功能
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作