аппроксимирующий круг с заданным количеством отрезков - PullRequest
2 голосов
/ 12 июля 2011

Есть ли лучший способ вычислить окружность по радиусу и количеству вершин?Мое решение вычисляет sin и cos для каждой вершины.Это необходимо?

void getCircle2D(Vector2 * perimeterPointsArray, int32 numOfPoints, Vector2 & center, flt32 radius)
{
    ASSERT(numOfPoints >= 3);
    flt32 pieceAngle = MathConst::TAU / numOfPoints;
    flt32 iterAngle = 0;
    for (int32 i = 0; i < numOfPoints; ++i)
    {
        perimeterPointsArray[i] = Vector2(radius * cos(iterAngle) + center.x, radius * sin(iterAngle) + center.y);
        iterAngle += pieceAngle;
    }
}

Ответы [ 3 ]

1 голос
/ 12 июля 2011

Вы можете рассчитать половину точек, а затем отразить вокруг центра X.

1 голос
/ 12 июля 2011

Ваш предложенный подход должен быть обычным способом сделать это. Но, возможно, вы можете придумать итеративное вычисление, используя следующие теоремы сложения (см. Wikipedia ):

sin(a+b) = sin(a)*cos(b) + cos(a)*sin(b)
cos(a+b) = cos(a)*cos(b) - sin(a)*sin(b)

Где в вашем случае a - предыдущий угол (чьи cos и sin вы только что вычислили), а b - шаг постоянного угла (чьи cos и sin также, конечно, постоянны). Так что-то вроде этого может сработать:

void getCircle2D(Vector2 * perimeterPointsArray, int32 numOfPoints, Vector2 & center, flt32 radius)
{
    flt32 pieceAngle = MathConst::TAU / numOfPoints;
    flt32 sinb = sin(pieceAngle), cosb = cos(pieceAngle);
    flt32 sina = 0.0, cosa = 1.0;
    for (int32 i = 0; i < numOfPoints; ++i)
    {
        perimeterPointsArray[i] = Vector2(radius * cosa + center.x, radius * sina + center.y);
        flt32 tmp = sina * cosb + cosa * sinb;
        cosa = cosa * cosb - sina * sinb;
        sina = tmp;
    }
}

Здесь вам нужно только вычислить один грех и один cos (это может быть даже предварительно вычислено, если число точек известно во время компиляции).

@ yi_H Я не знаю, действительно ли алгоритм растеризации круга действительно подходит для аппроксимации окружности с плавающей точкой, но, возможно, в плавающей точке он обобщается на вышеупомянутые итерационные вычисления.

1 голос
/ 12 июля 2011

Вам не нужен грех и потому:

Алгоритм окружности средней точки .Это для пиксельной графики, но должно быть очень легко изменить ее для создания вершин.Конечно, это имеет смысл, только если количество вершин сопоставимо с количеством пикселей (скажем, на порядок меньше).

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