Pebble中将圆分成n等分的点的坐标
Coordinates of points dividing circle into n equal halves in Pebble
我正在尝试用直线将圆分成 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
请指出我在这里遗漏了什么。
谢谢。
您将 int
除以 int
,并将结果存储到 double
。在除法之前,您必须先转换为 double
。
angle = i * (360.0/noOfDividingPoints);
// ^^ now it is a floting point division
Pebble 中的 lookup-functions for sine and cosine 不采用弧度或度数的角度;他们使用标准化为 TRIG_MAX_ANGLE
的整数角度,对应于一个完整的圆或 360°。
这同样适用于返回值,它是一个带符号的整数,必须用 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°。
您可能还想看看上面链接页面上的时钟指针示例。
我正在尝试用直线将圆分成 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
请指出我在这里遗漏了什么。
谢谢。
您将 int
除以 int
,并将结果存储到 double
。在除法之前,您必须先转换为 double
。
angle = i * (360.0/noOfDividingPoints);
// ^^ now it is a floting point division
Pebble 中的 lookup-functions for sine and cosine 不采用弧度或度数的角度;他们使用标准化为 TRIG_MAX_ANGLE
的整数角度,对应于一个完整的圆或 360°。
这同样适用于返回值,它是一个带符号的整数,必须用 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°。
您可能还想看看上面链接页面上的时钟指针示例。