使用 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)与系统结果之间的一些奇怪之处的主要内容,如果未能解决你的问题,请参考以下文章

如何绘制多个矩形 FLTK C++

FLTK 绘制像素图给出了段错误

在 C++ 程序中有时间等待

在 C++ 中使用 FLTK 的简单电话簿

FLTK C++ Fl_line 不画

使用openGL在c ++中绘制圆