- UID
- 875
- 麦力
- 5744
- 注册时间
- 2016-5-26
- 最后登录
- 2018-6-13
- 精华
- 4
- 阅读权限
- 100
- 在线时间
- 304 小时
|
本帖最后由 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組座標公式,可依照之前公式說明將參數代入即可。
上集的第一種方法如果有理解,第二種方法應該簡單多了,但第一種方法還是可以參考輔助用,我自己是試過如果座標少的表盤,用第一種方法或第二種方法其實佔記憶體差異並不大,但如果座標多的表盤用第二種方法應該會減少一點記憶體的佔用。
好了,大絕招都傳授了,快弄點新的指針表盤來玩玩吧!
|
评分
-
查看全部评分
|