麦步社区-论坛

标题: 指針式表盤座標產生方法(下) [打印本页]

作者: 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>",位置如下所示:

  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <math.h>
复制代码

加這一條因為要用到C裡的函式庫math.h。

接下來再插入以下代碼:

  1. /*表盤中心位置也就是圓心座標*/
  2. #define CX 64
  3. #define CY 64

  4. /*N=90度*/
  5. #define N 90
复制代码

原本放數字座標的區域用以下代碼取代:

  1. static get_x_point(int radius, int sn, int angle, int m)
  2. {
  3.         int coordinate = radius * cos((sn*angle-N+m) * M_PI / 180) + CX;

  4.         return coordinate;
  5. }

  6. static get_y_point(int radius, int sn, int angle, int m)
  7. {
  8.         int coordinate = radius * sin((sn*angle-N+m) * M_PI / 180) + CY;

  9.         return coordinate;
  10. }
复制代码

公式說明: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 = ....是用數字座標的方式,需要修改如下:

  1. hour = hour % 12;
  2. hour *= 3;
  3. min = min/20;

  4. GPoint p1 = {get_x_point(33,hour+min,10,0) , get_y_point(33,hour+min,10,0)},
  5.            p2 = {get_x_point(16,hour+min,10,-10) , get_y_point(16,hour+min,10,-10)},
  6.            p3 = {get_x_point(20,hour+min,10,0) , get_y_point(20,hour+min,10,0)},
  7.            p4 = {get_x_point(16,hour+min,10,10) , get_y_point(16,hour+min,10,10)},
  8.            p5 = {get_x_point(33,hour+min,10,0) , get_y_point(33,hour+min,10,0)},
  9.            p6 = {get_x_point(-10,hour+min,10,0) , get_y_point(-10,hour+min,10,0)};

  10. /*多边形*/
  11. GPoint points1[6] = {p1, p2, p3 ,p4 ,p5 ,p6};        //數量要對應上面點的數量
  12. 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://203.195.186.190/) Powered by Discuz! X3.2