Как сгенерировать набор точек, которые равноудалены друг от друга и лежат на окружности - PullRequest
4 голосов
/ 20 апреля 2011

Я пытаюсь сгенерировать массив из n точек, которые равноудалены друг от друга и лежат на окружности в C. В основном, я должен быть в состоянии передать функции количество точек, которые я хотел бы получить и получитьназад массив точек.

Ответы [ 5 ]

5 голосов
/ 20 апреля 2011

Прошло очень много времени с тех пор, как я начал писать 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;
}
5 голосов
/ 20 апреля 2011

Попробуйте что-то вроде этого:

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);
  }
}

Это не проверено, возможно, что при вычислении шага угла может быть скрыто одно за другим, но оно должно быть близко.

Это предполагает, что я, конечно, правильно понял вопрос.

ОБНОВЛЕНИЕ : Переделал вычисление угла, чтобы не увеличивать его, чтобы уменьшить потерю точности с плавающей точкой из-за многократного добавления.

2 голосов
/ 20 апреля 2011

Вот решение, несколько оптимизированное, непроверенное.Ошибка может накапливаться, но использование 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;
    }
}
0 голосов
/ 04 марта 2014

Вот реализация 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;
}
0 голосов
/ 20 апреля 2011

Вы должны решить это на языке c:

В x-y декартовой системе координат круг с координатами центра (a, b) и радиусом r является множеством всех точек (x, y), таких что

(х - а) ^ 2 + (у - б) ^ 2 = г ^ 2

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...