如何生成一组彼此等距并位于圆上的点

时间:2011-04-20 12:51:23

标签: c geometry

我正在尝试生成一个n个点的数组,它们彼此等距并且位于C中的一个圆上。基本上,我需要能够传递一个函数我想要生成的点数并得到回到一系列点。

5 个答案:

答案 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;
}