麦步社区-论坛
标题:
指針式表盤座標產生方法(下)
[打印本页]
作者:
aix
时间:
2016-10-26 21:39
标题:
指針式表盤座標產生方法(下)
本帖最后由 aix 于 2016-11-3 10:43 编辑
上次說明了指針表盤用 excel幫助算出座標的方法,這次來說明如何在源代碼中直接吧公式代入的方法,也就是第二種方法。
先回顧一下公式,如果沒有概念請先看上集的說明。
圓週上的
點
x 軸公式: r*cos R+x
圓週上的
點
y 軸公式: r*sin R+y
說明:r 就是圓的半徑,cos、sin 就是三角函數中的餘弦函數和正弦函數, R 是指弧度,x、y 是指圓心的座標值。
問題是公式要如何代入源代碼中呢?
首先,在代碼中最前面插入"#include<math.h>",位置如下所示:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h>
复制代码
加這一條因為要用到C裡的函式庫math.h。
接下來再插入以下代碼:
/*表盤中心位置也就是圓心座標*/
#define CX 64
#define CY 64
/*N=90度*/
#define N 90
复制代码
原本放數字座標的區域用以下代碼取代:
static get_x_point(int radius, int sn, int angle, int m)
{
int coordinate = radius * cos((sn*angle-N+m) * M_PI / 180) + CX;
return coordinate;
}
static get_y_point(int radius, int sn, int angle, int m)
{
int coordinate = radius * sin((sn*angle-N+m) * M_PI / 180) + CY;
return coordinate;
}
复制代码
公式說明:coordinate是回傳的座標值,radius是半徑,sn是指針的順位(一般來說0是第一個也就是0:00的位置),angle是指每次指針移動的角度,N是前面定義的90度(因為第一個角度是從0:00開始,所以要-90度),m是偏移的位置(概念見上集),M_PI是math.h裡定義的3.14159.......,(sn*angle-N+m) * M_PI / 180是因為要將角度換算成弧度(概念見上集),CX、CY是前面定義的圓心座標。
接下來以6個點形成時針的源代碼為例,原本GPoint p1 = ....是用數字座標的方式,需要修改如下:
hour = hour % 12;
hour *= 3;
min = min/20;
GPoint p1 = {get_x_point(33,hour+min,10,0) , get_y_point(33,hour+min,10,0)},
p2 = {get_x_point(16,hour+min,10,-10) , get_y_point(16,hour+min,10,-10)},
p3 = {get_x_point(20,hour+min,10,0) , get_y_point(20,hour+min,10,0)},
p4 = {get_x_point(16,hour+min,10,10) , get_y_point(16,hour+min,10,10)},
p5 = {get_x_point(33,hour+min,10,0) , get_y_point(33,hour+min,10,0)},
p6 = {get_x_point(-10,hour+min,10,0) , get_y_point(-10,hour+min,10,0)};
/*多边形*/
GPoint points1[6] = {p1, p2, p3 ,p4 ,p5 ,p6}; //數量要對應上面點的數量
Polygon po1 = {6, points1}; //幾個點畫出的形狀
复制代码
說明:hour%12是取得時的位置,例如下午1點:13%12=1,hour *=3等於hour = hour *3這是指每小時指針會有3個位置(整點、20分、40分),所以要乘3,min = min/20是為了知道此時是幾分,時針應該在3個位置中的哪一個。
再來就是形成時針的
6組
座標公式,可依照之前公式說明將參數代入即可。
上集的第一種方法如果有理解,第二種方法應該簡單多了,但第一種方法還是可以參考輔助用,我自己是試過如果座標少的表盤,用第一種方法或第二種方法其實佔記憶體差異並不大,但如果座標多的表盤用第二種方法應該會減少一點記憶體的佔用。
好了,大絕招都傳授了,快弄點新的指針表盤來玩玩吧!
作者:
水月梦
时间:
2016-10-26 22:47
收藏起来,以后试试看
作者:
不贰小
时间:
2016-10-27 10:42
感谢分享
作者:
手残也要作
时间:
2016-10-27 10:55
太厉害了
作者:
cw2549
时间:
2016-10-27 11:03
水月梦 发表于 2016-10-26 22:47
收藏起来,以后试试看
终于集齐5000麦力了。恭喜!
作者:
cw2549
时间:
2016-10-27 11:08
楼主请继续。
我想了解农历 时间日期 等文本显示的写法,因为看公开的源码 写的格式各有不同,对C语言陌生,所以看不懂
作者:
水月梦
时间:
2016-10-27 11:21
cw2549 发表于 2016-10-27 11:03
终于集齐5000麦力了。恭喜!
已经去兑换了
作者:
justdo
时间:
2016-11-25 20:26
mark到源头,感谢楼主
作者:
yuanquan72
时间:
2016-11-26 00:44
学习了。
欢迎光临 麦步社区-论坛 (http://bbs.maibu.cc/)
Powered by Discuz! X3.2