在Pebble中将圆分为n等分的坐标

时间:2016-01-05 13:54:52

标签: c math pebble-watch pebble-sdk

我试图用直线将圆分成n个相等的部分。想法是获取圆周上的终点坐标,然后绘制直线。

找到coodrinates我正在使用以下代码:

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

请指出我在这里缺少的东西。

感谢。

2 个答案:

答案 0 :(得分:3)

Pebble中的lookup-functions for sine and cosine不会以弧度或度数取角度;它们使用归一化为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°。

您也可以查看上面链接的页面上的时钟示例。

答案 1 :(得分:1)

您按intint进行划分,并将结果存储到double。在进行除法之前,您必须先转换为double

angle = i * (360.0/noOfDividingPoints);
             // ^^ now it is a floting point division