返回官网官方微博

麦步社区-论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
热搜: MAI 表盘
查看: 9031|回复: 8
打印 上一主题 下一主题

[表盘制作教程] 指針式表盤座標產生方法(下)

[复制链接]

11

主题

77

帖子

5744

麦力

精华
4
阅读权限
100
在线时间
304 小时

麦步工业测评协会

跳转到指定楼层
楼主
发表于 2016-10-26 21:39:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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組座標公式,可依照之前公式說明將參數代入即可。

上集的第一種方法如果有理解,第二種方法應該簡單多了,但第一種方法還是可以參考輔助用,我自己是試過如果座標少的表盤,用第一種方法或第二種方法其實佔記憶體差異並不大,但如果座標多的表盤用第二種方法應該會減少一點記憶體的佔用。

好了,大絕招都傳授了,快弄點新的指針表盤來玩玩吧!


评分

参与人数 1能量 +3 收起 理由
水月梦 + 3 非常给力

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信 WeiboWeibo
收藏收藏2 分享分享 顶1 踩

112

主题

1205

帖子

3129

麦力

精华
1
阅读权限
80
在线时间
184 小时

麦步增强版用户

沙发
发表于 2016-10-26 22:47:33 | 只看该作者
收藏起来,以后试试看
我爱少少潘

214

主题

2514

帖子

3万

麦力

麦步团队

精华
1
阅读权限
200
在线时间
812 小时

麦步手表用户麦步工业测评协会

板凳
发表于 2016-10-27 10:42:23 | 只看该作者
感谢分享
回复

使用道具 举报

63

主题

335

帖子

4354

麦力

精华
5
阅读权限
70
在线时间
136 小时

地板
发表于 2016-10-27 10:55:00 来自手机 | 只看该作者
太厉害了
回复

使用道具 举报

14

主题

387

帖子

4710

麦力

精华
0
阅读权限
70
在线时间
183 小时

麦步手表用户

5#
发表于 2016-10-27 11:03:43 | 只看该作者
水月梦 发表于 2016-10-26 22:47
收藏起来,以后试试看


终于集齐5000麦力了。恭喜!
帅……

14

主题

387

帖子

4710

麦力

精华
0
阅读权限
70
在线时间
183 小时

麦步手表用户

6#
发表于 2016-10-27 11:08:54 | 只看该作者
楼主请继续。
我想了解农历 时间日期 等文本显示的写法,因为看公开的源码 写的格式各有不同,对C语言陌生,所以看不懂
帅……

112

主题

1205

帖子

3129

麦力

精华
1
阅读权限
80
在线时间
184 小时

麦步增强版用户

7#
发表于 2016-10-27 11:21:51 | 只看该作者
cw2549 发表于 2016-10-27 11:03
终于集齐5000麦力了。恭喜!

已经去兑换了
我爱少少潘

6

主题

207

帖子

2181

麦力

精华
2
阅读权限
50
在线时间
88 小时

麦步增强版用户

8#
发表于 2016-11-25 20:26:13 | 只看该作者
mark到源头,感谢楼主

3

主题

667

帖子

7294

麦力

精华
0
阅读权限
70
在线时间
233 小时

麦步增强版用户

9#
发表于 2016-11-26 00:44:33 来自手机 | 只看该作者
学习了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|麦步官方论坛 ( 粤ICP备12052190号  

GMT+8, 2024-11-23 04:52 , Processed in 0.090201 second(s), 26 queries .

Powered by Discuz! X3.2

© 2012-2021 Comsenz Inc.

快速回复 返回顶部 返回列表