SFML自定义圈数学无法正常工作

时间:2019-01-05 22:30:18

标签: c++ math sfml

Iam制作了一个使用sfml绘制圆圈的程序 使用等式

  

x ^ 2 + y ^ 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会自动对笛子进行四舍五入,但是我想使用round函数。并且可以通过从相对的坐标开始绘制两次四分之一圆来解决此问题,但这感觉不对,我想将此代码用作数学原理的示例,如果没有其他方法,那么我想要了解原因

感谢所有答案。

1 个答案:

答案 0 :(得分:2)

您遇到的问题是由于一个天真的实现而产生的,该实现是基于一个错误的假设,即您可以使用多个(x,y)点绘制一个四分之一圆的良好近似值,从而每个点都有不同的位置x(或其他y)。

为证明这一假设是错误的,请考虑半径= 50,以及两个值x1= 50x2 = 49。显然是匹配的y1 = 0y2呢?如果您像这样使用天真的实现,则将计算

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

天真y2 ≈ 9.9或几乎10。但是,xy范围内的[1,9]值是多少?答案是对于所有yx都位于4950之间。换句话说,x=49x=50至少需要10分,而不是2分。

您可以尝试通过使用一些“画线”而不是“画点”方法来解决此问题,但是最好使用一些著名的算法来画圆,例如Midpoint circle algorithm或Bresenham's algrorithm < / p>