SFML Custom Circle Math не работает должным образом - PullRequest
0 голосов
/ 06 января 2019

Я создаю программу для рисования кругов с помощью sfml используя уравнение

х ^ 2 + у ^ 2 = R ^ 2 А затем округление

#include <SFML/Graphics.hpp>
#include <iostream>
#include <cmath>

int main()
{
    unsigned int rad;
    unsigned int centerY;
    unsigned int centerX;
    std::cout << "Radius: ";
    std::cin >> rad;
    std::cout << "CenterX: ";
    std::cin >> centerX;
    std::cout << "CenterY: ";
    std::cin >> centerY;

    sf::RenderWindow window(sf::VideoMode(600,600), "Circle",sf::Style::Close);

    while (window.isOpen())
    {
        sf::Event event;
        while (window.pollEvent(event))
        {
            if (event.type == sf::Event::Closed)
            {
                window.close();
            }
        }

        window.clear();
        sf::RectangleShape r(sf::Vector2f(1,1));
        r.setFillColor(sf::Color::White);
        //Calculate and draw right half
        for(int i = 0; i <= rad; i++)
        {
            int y = round(sqrt((rad*rad)-(i*i)));
            r.setPosition((float) centerX + i,(float) centerY + y);
            window.draw(r);
            r.setPosition((float) centerX + i,(float) centerY - y);
            window.draw(r);
        }
        //Calculate and draw left half
        for(int i = 0; i <= rad; i++)
        {
            int y = round(sqrt((rad*rad)-(i*i)));
            r.setPosition((float) centerX - y,(float) centerY + i);
            window.draw(r);
            r.setPosition((float) centerX - y,(float) centerY - i);
            window.draw(r);
        }
        window.display();
    }

    return 0;
}

Теперь, это работает, но у меня есть эта проблема: enter image description here

Наблюдается разрыв, который становится все больше и больше, я знаю, что sfml будет автоматически округлять символы, но я хочу использовать функцию округления. И эту проблему можно исправить, дважды нарисовав четверть круга, начиная с противоположных координат, но это не правильно, я хочу использовать этот код в качестве примера математического принципа, и если нет другого пути, то я бы хотел чтобы понять, почему

Спасибо за все ответы.

1 Ответ

0 голосов
/ 06 января 2019

Проблема, которую вы получаете, является результатом наивной реализации, основанной на ложном допущении, что вы можете нарисовать хорошее приближение четверти круга, используя количество (x,y) точек, так что каждая точка имеет разные x (или другой y).

Чтобы показать, что это предположение неверно, рассмотрим радиус = 50 и два значения x1= 50 и x2 = 49. Очевидно совпадение y1 = 0. Как насчет y2? Если вы используете наивную реализацию, как вы делаете, вы будете вычислять

sqrt(50^2 - 49^2) = sqrt(99) ≈ 9.9

Так наивно y2 ≈ 9.9 или почти 10. Но каково значение x для диапазона y с в [1,9]? Ответ таков: для всех этих y, x лежит где-то между 49 и 50. Другими словами, вам действительно нужно как минимум 10 баллов для x=49 и x=50, а не только для двух.

Вы можете попытаться обойти это, используя некоторую "линию рисования" вместо метода "точка рисования", но лучше использовать некоторый известный алгоритм для рисования круга, такой как Алгоритм окружности средней точки или алгоритм Брезенхема

...