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

如有其它疑惑,敬请留言,本人会尽快作以回复,谢谢。

在c++中使用easyx画一个实时走动的钟表(方法细节)相关推荐

  1. 利用python Turtle库函数画一个实时钟表

    最近学习python,接触到turtle标准库,后面又看到利用python内置库turtle库画一个实时钟表.话不多说,直接上代码叭! import turtle from datetime impo ...

  2. python合并txt文本_Python实现将目录中TXT合并成一个大TXT文件的方法

    本文实例讲述了Python实现将目录中TXT合并成一个大TXT文件的方法.分享给大家供大家参考.具体如下: 在网上下了一个dota的英雄攻略,TXT格式,每个英雄一个文件,看得疼,就写了一个小东西,合 ...

  3. python判断一个列表是否包含另一个列表_Python判断一个list中是否包含另一个list全部元素的方法分析...

    Python判断一个list中是否包含另一个list全部元素的方法分析 本文实例讲述了Python判断一个list中是否包含另一个list全部元素的方法.分享给大家供大家参考,具体如下: 你可以用fo ...

  4. 在Visio中快速的画一个虚线框

    在Visio中我们需要一个虚线框怎么来画:我的方法是画一个矩形然后改变其属性来实现,这样你就不用考虑初次画框的大小,因为矩形可以随意去拉伸其大小. 1.在指针工具那里选择矩形画一个矩形出来 2.修改矩 ...

  5. java中释放空间_一个释放java 空间的方法

    一个释放java 空间的方法 來源:互聯網  2008-12-27 12:16:25  評論 一个释放java 空间的方法: 前提条件:一是你记得你上传失败的文件(以下称A文件)名! 二是文件在手机和 ...

  6. python将多个txt合并成一个_Python实现将目录中TXT合并成一个大TXT文件的方法

    #coding=gbkimport osimport sysimport globdef dirTxtToLargeTxt(dir,outputFileName): '''从dir目录下读入所有的TX ...

  7. python创建只包含一个元素的元组时_Python中声明只包含一个元素的元组数据方法...

    {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...

  8. 【C++】教你如何在中秋节给家人们画一个星空

    前言 将至中秋,想必大家都想给自己的家人们一个惊喜吧!今天就手把手地教大家如何用C++和Easyx画一个星空. (效果图:) 一.准备Easyx 首先我们要前往Easyx官网下载安装程序, 下载完成后 ...

  9. 15怎么自己画元件_【技术】3.1(1) 先了解清楚了,才能画一个元件-成都单片机开发...

    全文目录:http://blog.sina.com.cn/s/blog_7d8d7c710102xtlh.html 本小结介绍怎么在DXP里面画一个包含了各种元件的元件库.按照人的一般做事思维方式来说 ...

最新文章

  1. Ultimate SLAM:结合事件、图像和惯性测量单元,在HDR和高速场景下实现鲁棒的视觉SLAM...
  2. boost::graph模块实现bellman算法的测试程序
  3. java 两个字段排序,如何在Java中按两个字段排序?
  4. linux fcntl注销信号,linux下fcntl的使用(转载)
  5. python cv.rectangle_Python OpenCV cv2.rectangle()用法及代码示例
  6. UnsatisfiedDependencyException
  7. 2022年8月Python小屋编程比赛获奖名单(送5本书)
  8. Apache配置文件中的deny和allow的使用
  9. C语言口求整除x与y的余数,取余或取模运算小结
  10. 卡塔尔世界杯进入倒计时,万人观赛的直播体验如何保障?
  11. Mac电脑上的精美的壁纸 Pap.er
  12. 『深度应用』人脸识别最新进展及发展方向
  13. Android实现手机内存存储功能
  14. 计算机网络安全作文,网络安全小学生300字作文
  15. 12家大厂软件测试大牛,联合打造:<如何从零开始学习软件测试>系列视频+完整版文档分享
  16. 有什么实用的电脑录音软件
  17. _STORAGE_WRITE_ERROR_:./Application/Runtime/Cache/Admin/0dfec61edd66f450033aa87c28a760f4.php
  18. 关于 苏生不惑 公众号
  19. 使用IIS将APK生成下载链接详细步骤
  20. C#桌面办公应用-工资管理系统系列七

热门文章

  1. morphology.remove_small_objects输入数组的数据类型对结果的影响
  2. ChatGPT新一代人工智能
  3. 简述DRAM与SRAM的区别
  4. 岗位竞聘机制如何引入?
  5. B站apk缓存视频合并批处理
  6. 云翌通信联合方位、鼎信在杭州、北京的产品交流会圆满结束
  7. 迪赛智慧数——柱状图(正负条形图):2022年中国不同年龄段男女平均体重
  8. 国内AI芯片百家争鸣,何以抗衡全球技术寡头
  9. 无法加载文件 C:\Users\Administrator\AppData\Roaming\npm\nodemon.ps1,因为在此系统上禁止运行脚本。
  10. 2021年安全员-B证报名考试及安全员-B证考试总结