<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
這次的任務是用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執行效果如圖:
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45