我正在尝试生成一个n个点的数组,它们彼此等距并且位于C中的一个圆上。基本上,我需要能够传递一个函数我想要生成的点数并得到回到一系列点。
答案 0 :(得分:5)
尝试这样的事情:
void make_circle(float *output, size_t num, float radius)
{
size_t i;
for(i = 0; i < num; i++)
{
const float angle = 2 * M_PI * i / num;
*output++ = radius * cos(angle);
*output++ = radius * sin(angle);
}
}
这是未经测试的,在角度步计算中可能会有一个隐藏的隐藏但它应该是接近的。
这假设我当然正确理解了这个问题。
UPDATE :将角度计算重新设置为不递增,以减少因重复添加而导致的浮点精度损失。
答案 1 :(得分:5)
自从我完成C / C ++以来已经很长时间了,所以我对此更加了解,看看我是如何继续使用它的,但是这里有一些代码可以为你计算得分。 (这是一个VS2010控制台应用程序)
// CirclePoints.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "stdio.h"
#include "math.h"
int _tmain()
{
int points = 8;
double radius = 100;
double step = ((3.14159265 * 2) / points);
double x, y, current = 0;
for (int i = 0; i < points; i++)
{
x = sin(current) * radius;
y = cos(current) * radius;
printf("point: %d x:%lf y:%lf\n", i, x, y);
current += step;
}
return 0;
}
答案 2 :(得分:2)
这是一个有点优化,未经测试的解决方案。错误可能会累积,但使用double
而不是float
可能会超过它,除非n
值非常大。
void make_circle(double *dest, size_t n, double r)
{
double x0 = cos(2*M_PI/n), y0 = sin(2*M_PI/n), x=x0, y=y0, tmp;
for (;;) {
*dest++ = r*x;
*dest++ = r*y;
if (!--n) break;
tmp = x*x0 - y*y0;
y = x*y0 + y*x0;
x = tmp;
}
}
答案 3 :(得分:0)
你必须用c语言解决这个问题:
在x-y笛卡尔坐标系中,具有中心坐标(a,b)和半径r的圆是所有点(x,y)的集合,使得
(x-a)^ 2 +(y-b)^ 2 = r ^ 2
答案 4 :(得分:0)
这是一个javascript实现,它也采用了可选的中心点。
function circlePoints (radius, numPoints, centerX, centerY) {
centerX = centerX || 0;
centerY = centerY || 0;
var
step = (Math.PI * 2) / numPoints,
current = 0,
i = 0,
results = [],
x, y;
for (; i < numPoints; i += 1) {
x = centerX + Math.sin(current) * radius;
y = centerY + Math.cos(current) * radius;
results.push([x,y]);
console.log('point %d @ x:%d, y:%d', i, x, y);
current += step;
}
return results;
}