Задать вопрос
Dyikot
@Dyikot

Почему окружность получается отрисованной не ровно?

Пытаюсь нарисовать окружность, на примере круга. Для отрисовки использую следующую функцию SDL_RenderDrawLinesF.

Код для рассчета точек:
void RenderContext::DrawEllipse(FPoint position, int width, int height, Color color)
{
	auto points = std::array<FPoint, MaxPointsNumber + 1>();
	auto radiusX = width / 2.0f;
	auto radiusY = height / 2.0f;
	auto center = FPoint(position.x + radiusX, position.y + radiusY);

	for(size_t i = 0; i < points.size() - 1; i++)
	{
		points[i].x = center.x + radiusX * CosRange[i];
		points[i].y = center.y + radiusY * SinRange[i];
	}

	points[MaxPointsNumber] = points[0];

	DrawLines(points, color);
}

MaxPointsNumber = 180, увеличение не дает ничего.
CosRange/ SinRange - рассчитаные заранее значения для каждого градуса.

Сам результат:
689995bfadb43940259448.png
  • Вопрос задан
  • 114 просмотров
Подписаться 1 Простой 6 комментариев
Решения вопроса 1
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
Это называется aliasing. Ну не ложится гладкая окружность (да и наклонные прямые) на прямоугольную сетку пикселей. SDL renderer похоже слишком примитивен и умеет красить только черные и белые пиксели. Если бы он где-то рисовал серые, картинка выглядила бы более гладкой.

Если вас это качество не устраивает, то вам надо найти какой-то алгоритм рисования окружности по пикселям и руками его реализовать (что-то вроде этого). Или реализовывать (сглаживание) anti-aliasing. Например, можно нарисовать сцену в текстуре в 2-3-4 раза больше нужного размера, потом ее отмасштабировать до размера на экране и уже это показывать.

Еще где-то пишут, что если использовать GPU а не software рендеринг в SDL то качество получше.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Skirikikaka
Попробуй алгоритм Брезенхейма для окружности применить
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы