【问题标题】:Coordinates of points dividing circle into n equal halves in PebblePebble中将圆分成n等半的点的坐标
【发布时间】:2016-01-05 13:54:51
【问题描述】:

我正在尝试使用直线将圆分成 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

请指出我在这里遗漏的内容。

谢谢。

【问题讨论】:

  • 能否在函数开头也记录 x0、y0 和 r 的值?我想看看它们是什么。
  • @Kevin x0, y0 和 r 分别是中心和半径的坐标。他们没有改变。由于我在卵石手表上执行此操作,因此圆心是屏幕的中心 wic 计算为 (x,y) = ( bounds.size.w / 2, bounds.size.h / 2 ),半径为 70 .
  • 好的,但是如果 x0 是 4587450 而您期望它是 1234,这将解释您奇怪的 x 值。这就是它值得研究的原因。
  • 顺便问一下noOfDividingPoints的值是多少?
  • 您提供的代码似乎与您提供的日志不一致。在您的日志中,您有“[14:18:58] WatchFace.c:36> LOG: Angle: 90”这一行,但我看不到代码在哪里产生了输出。还有,noOfDividingPoints的类型是什么?

标签: c math pebble-watch pebble-sdk


【解决方案1】:

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°。

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

【讨论】:

  • 非常感谢代码 sn-p 和信息。效果很好!
【解决方案2】:

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

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

【讨论】:

  • 谢谢你的回答,不过,我已经试过了。我忘记粘贴修改后的代码。我明确地转换了变量,但结果仍然相同。
猜你喜欢
  • 2017-03-09
  • 2017-02-04
  • 1970-01-01
  • 1970-01-01
  • 2023-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多