我用一个方程式制作了一个用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;
}
有一个差距正在出现并且变得越来越大,我知道sfml会自动绕过这个问题,但我想使用圆形功能。这个问题可以通过绘制四分之一圆来固定,从相反的坐标开始,但是感觉不对,我想用这个代码作为数学原理的一个例子,如果没有别的办法,那么我想要了解原因
谢谢你的所有答案。
你得到的问题是一个天真的实现的结果,这是基于一个错误的假设,你可以使用一些(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
s范围内的[1,9]
值是多少?答案是,对于所有那些y
,x
位于49
和50
之间。换句话说,你真的需要至少10分为x=49
和x=50
而不是仅仅两个。
您可以尝试通过使用一些“绘制线”而不是“绘制点”方法来解决这个问题,但最好使用一些众所周知的算法绘制圆形,例如Midpoint circle algorithm或Bresenham的算法