Pebble中将圆分成n等分的点的坐标

标签 c math pebble-watch pebble-sdk

我想用直线将圆分成 n 个相等的部分。思路是获取圆周上的端点坐标,然后画线。

我使用以下代码查找坐标:

static void getPoints(int x0,int y0,int r)
{

   double angle = 0;
   double angleToRadian = 0;

   for(int i = 0 ; i < noOfDividingPoints  ;i++)
   {   
      angle = i * (360/noOfDividingPoints);

      angleToRadian = ( angle * 3.141 ) / 180;

      APP_LOG(APP_LOG_LEVEL_DEBUG, "LOG: Angle: %lf, AngleToRadian: %lf", angle, angleToRadian );

      x[i] = (int) (x0 + r * cos_lookup(angleToRadian));
      y[i] = (int) (y0 + r * sin_lookup(angleToRadian));
      APP_LOG(APP_LOG_LEVEL_DEBUG, "LOG: i: %d,  x[i]: %d, y[i]: %d", i, (int)x[i], (int)y[i] );
   }
}

我使用这个 getPoints 方法填充数组 x[] 和 y[],然后遍历这些数组以在 x[i] 和 y[i] 之间画线

但是,上面的代码计算出来的值很奇怪,下面是打印x[]和y[]内容的日志

[14:18:58] WatchFace.c:41> LOG: Angle: f, AngleToRadian: f

[14:18:57] WatchFace.c:45> LOG: i: 0,  x[i]: 4587522, y[i]: 84
[14:18:57] WatchFace.c:36> LOG: Angle: 90
[14:18:57] WatchFace.c:41> LOG: Angle: f, AngleToRadian: f
[14:18:58] WatchFace.c:45> LOG: i: 1,  x[i]: 4587522, y[i]: 84
[14:18:58] WatchFace.c:36> LOG: Angle: 90
[14:18:58] WatchFace.c:41> LOG: Angle: f, AngleToRadian: f
[14:18:58] WatchFace.c:45> LOG: i: 2,  x[i]: 4587452, y[i]: 504
[14:18:58] WatchFace.c:36> LOG: Angle: 90
[14:18:58] WatchFace.c:41> LOG: Angle: f, AngleToRadian: f
[14:18:58] WatchFace.c:45> LOG: i: 3,  x[i]: 4587452, y[i]: 924
[14:18:58] WatchFace.c:36> LOG: Angle: 90
[14:18:58] WatchFace.c:41> LOG: Angle: f, AngleToRadian: f
[14:18:58] WatchFace.c:45> LOG: i: 4,  x[i]: 4587452, y[i]: 1344
[14:18:58] WatchFace.c:36> LOG: Angle: 90
[14:18:58] WatchFace.c:41> LOG: Angle: f, AngleToRadian: f
[14:18:58] WatchFace.c:45> LOG: i: 5,  x[i]: 4587452, y[i]: 1344
[14:18:58] WatchFace.c:36> LOG: Angle: 90
[14:18:58] WatchFace.c:41> LOG: Angle: f, AngleToRadian: f
[14:18:58] WatchFace.c:45> LOG: i: 6,  x[i]: 4587452, y[i]: 1834
[14:18:58] WatchFace.c:36> LOG: Angle: 90
[14:18:58] WatchFace.c:41> LOG: Angle: f, AngleToRadian: f
[14:18:58] WatchFace.c:45> LOG: i: 7,  x[i]: 4587452, y[i]: 2254

请指出我在这里遗漏了什么。

谢谢。

最佳答案

lookup-functions for sine and cosine在 Pebble 中,不要以弧度或度数为单位;他们使用归一化为 TRIG_MAX_ANGLE 的整数角度,对应于一个完整的圆或 360°。

这同样适用于返回值,它是一个带符号的 int,必须使用 TRIG_MAX_RATIO 进行归一化以获得有效的余弦或正弦。

所以你应该能够做这样的事情。

for (int i = 0; i < n ; i++) {
    int32_t angle = i * TRIG_MAX_ANGLE / n;

    x[i] = x0 + (r * cos_lookup(angle)) / TRIG_MAX_RATIO;
    y[i] = y0 + (r * sin_lookup(angle)) / TRIG_MAX_RATIO;
}

请注意,所有计算都是用整数完成的。注意先乘后除,以免截断结果。例如,

cos_lookup(angle) / TRIG_MAX_RATIO

将始终产生零,除非角度对应于 0° 或 180°。

您可能还想看看上面链接页面上的时钟指针示例。

关于Pebble中将圆分成n等分的点的坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34613388/

相关文章:

c - 使用静态库编译的共享库中 undefined symbol

c# - C#中的CRC16计算?

algorithm - 用区间确定sin波范围[a, b]的高效算法

python - 这个数学运算程序是否已经存在?

c - utf-8 编码的字符串如何使用 printf 在 C 中打印到屏幕?

c - 如何使用 C API 将字符串连接到 kdb 中的混合列表

c++ - OpenCV 解决任意系统的返回常量值?

java - Pebble watch 上的 Android 通知类型

javascript - Pebble JS SDK : how to catch & react on an external app notification

javascript - Pebble AppSync 元组仅使用初始值