Я рисую полый эллипс, используя opengl. Я вычисляю вершины в C++-коде, используя стандартную формулу эллипса. В флеш-шейдере я просто назначаю цвет каждому фрагменту. Эллипс, который я вижу на экране, имеет более тонкую ширину линии на более резких кривых по сравнению с тем, что кривая не такая резкая. Итак, вопрос в том, как сделать ширину линии согласованной по всему параметру эллипса? Пожалуйста, смотрите изображение ниже: ширина линии для эллипса не является постоянной
C++ код:
std::vector<float> BCCircleHelper::GetCircleLine(float centerX, float centerY, float radiusX, float radiusY, float lineWidth, int32_t segmentCount)
{
auto vertexCount = (segmentCount + 1) * 2;
auto floatCount = vertexCount * 3;
std::vector<float> array(floatCount);
const std::vector<float>& data = GetCircleData (segmentCount);
float halfWidth = lineWidth * 0.5f;
for (int32_t i = 0; i < segmentCount + 1; ++i)
{
float sin = data [i * 2];
float cos = data [i * 2 + 1];
array [i * 6 + 0] = centerX + sin * (radiusX - halfWidth);
array [i * 6 + 1] = centerY + cos * (radiusY - halfWidth);
array [i * 6 + 3] = centerX + sin * (radiusX + halfWidth);
array [i * 6 + 4] = centerY + cos * (radiusY + halfWidth);
array [i * 6 + 2] = 0;
array [i * 6 + 5] = 0;
}
return std::move(array);
}
const std::vector<float>& BCCircleHelper::GetCircleData(int32_t segmentCount)
{
int32_t floatCount = (segmentCount + 1) * 2;
float segmentAngle = static_cast<float>(M_PI * 2)/segmentCount;
std::vector<float> array(floatCount);
for (int32_t i = 0; i < segmentCount + 1; ++i)
{
array[i * 2 + 0] = sin(segmentAngle * i);
array[i * 2 + 1] = cos(segmentAngle * i);
}
return array;
}
ОК, так что ... каков ваш вопрос? –
Как сделать линейную ширину согласованной? См. На резких кривых, ширина линии имеет тенденцию быть тоньше. – asad
В каком направлении вы хотите согласовать ширину линии? То есть, как вы хотите измерить эту ширину? –