使用 FLTK 在 C++ 中绘制圆以及本书(PPP)与系统结果之间的一些奇怪之处
Posted
技术标签:
【中文标题】使用 FLTK 在 C++ 中绘制圆以及本书(PPP)与系统结果之间的一些奇怪之处【英文标题】:Drawing Circle in C++ using FLTK and some oddness between the book (PPP) and the result of the system 【发布时间】:2014-06-09 07:40:50 【问题描述】:在 PPP (http://www.stroustrup.com/programming1.html) 书中,Stroustrup 曾说过以下关于 Circle 的主题:
"circle 实现的主要特点是存储的点不是圆心,而是包围圆的正方形的左上角。"
这些是书中的定义和实现:
struct Circle : Shape
Circle(Point p, int rr) // center and radius
:r(rr) add(Point(p.x-r,p.y-r));
void draw_lines() const
if(color.visibility())
fl_arc(point(0).x, point(0).y,r+r,r+r,0,360);
Point center() const
return Point(point(0).x+r,point(0).y+r);
int radius() const return r;
void set_radius(int rr) r=rr;
private:
int r;
;
所以我们给程序的点是左上角(包围圆的正方形),而不是圆的中心。 请看这个简单的代码:
#include <Simple_window.h>
int main()
using namespace std;
Simple_window win(Point(100,100), 600, 400, "test2");
Point t(200,200);
Mark m(t,'x');
Circle c(t,100);
win.attach(c);
win.attach(m);
win.wait_for_button();
如你所见,我首先给了窗口一个点(这里是 t)并将该点用于圆形,但如果你运行该代码(我没有这样上传它的图片的声誉!),你可以看到,我给它的那个点(t)不是左上角,它只是圆的中心,与他的说法相反!请问有什么问题?
【问题讨论】:
【参考方案1】:代码或描述没有错。
“圆的实现的主要特点是存储的点不是圆心,而是包围圆的正方形的左上角。”
注意“点存储”这个短语 - 这是在谈论类记住的值,而不是用于创建类的值。您使用中心和半径创建类,该类在其构造函数中处理这些值并存储左上角和半径,如下所示:-
Circle(Point p, int rr) // center and radius
:r(rr)
add (Point (p.x-r, p.y-r)); // point is converted from centre to top left
【讨论】:
是的,你是对的。我不知道我怎么没有注意到这个简单的事情!以上是关于使用 FLTK 在 C++ 中绘制圆以及本书(PPP)与系统结果之间的一些奇怪之处的主要内容,如果未能解决你的问题,请参考以下文章