Поскольку вы явно попросили способы оптимизации вашего метода, генерирующего координаты вершин, я предложу решение для этого. Однако, взглянув на результаты нескольких тестов (см. Демонстрационную ссылку ниже), я не уверен, что это действительно является причиной каких-либо проблем с производительностью ...
Вы можете вычислить вершины на окружности с центром в (0,0) рекурсивно, используя матрицы вращения :
// Init
X(0) = radius;
Y(0) = 0;
// Loop body
X(n+1) = cos(a) * X(n) - sin(a) * Y(n);
Y(n+1) = sin(a) * X(n) + cos(a) * Y(n);
Это заменяет вычисления cos
и sin
внутри цикла только несколькими умножениями, сложениями и вычитаниями с плавающей запятой, которые обычно бывают быстрее.
void DrawCircle(float x, float y, float radius, Color color, float thickness) {
int numOfPoints = 100;
float pi2 = 6.28318530718;
float fSize = numOfPoints;
float alpha = 1 / fSize * pi2;
// matrix coefficients
const float cosA = cos(alpha);
const float sinA = sin(alpha);
// initial values
float curX = radius;
float curY = 0;
for (size_t i = 0; i < numOfPoints; ++i) {
FillRect(curX + x, curY + y, thickness, thickness, color);
// recurrence formula
float ncurX = cosA * curX - sinA * curY;
curY = sinA * curX + cosA * curY;
curX = ncurX;
}
}
Демоверсия и упрощенный сравнительный тест
Недостатком использования исключительно рекурсии является то, что вы накапливаете крошечные ошибки вычислений за каждую итерацию. Как показывает демонстрация, ошибка незначительна для 100 итераций.