创建六边形类

时间:2014-06-14 14:07:50

标签: c++ class

书(http://www.stroustrup.com/programming1.html)第13章的练习8说:

定义一个Hexagon类(Hexagon是一个常规的六边形)。使用中心和从中心到角点的距离作为构造函数参数。

我用这种方式解决了它(在代码下面)。虽然我对答案有疑问,但无论如何然后去练习13-10,其中说:

定义一个类regular_polygon。使用中心,边数(> 2)以及从中心到角落的距离作为构造函数参数。

当我想到这个解决方案时,我发现利用循环并找到i& s之间的关系。 j非常困难,超过前一个(13-8)。

首先:请问以下代码是你想要的作为练习13-8的解决方案吗?

那么:有没有任何方法与练习13-8(下面的代码)的答案有关,可以用来解决练习13-10吗?

提前致谢。

   #include <Simple_window.h>

 struct Hexagon : Shape {
        Hexagon(Point p, int d): d(d)
       { add(Point(p)); }

    void draw_lines() const 
        { 
        fl_line(point(0).x-d,point(0).y,  point(0).x-d/2,point(0).y-(d-d/20*3),
                        point(0).x+d/2,point(0).y-(d-d/20*3));    
        fl_line(point(0).x+d/2,point(0).y-(d-d/20*3),  point(0).x+d,point(0).y,
                        point(0).x+d/2,point(0).y+(d-d/20*3));             
        fl_line(point(0).x+d/2,point(0).y+(d-d/20*3),  point(0).x-d/2,point(0).y+(d-d/20*3),
                        point(0).x-d,  point(0).y);  
        }
 private:
    int d;
};

 int main() {
    using namespace Graph_lib; 

     Simple_window win(Point(100,100), 600,400, "Hexagon"); 
     Graph_lib::Rectangle r(Point (50,50), 400,200);
     Point p(100,100);
      int d = 50;
      Hexagon h(p,d);
      win.attach(h);
    win.wait_for_button();
}

问题是如何使用三角法!无论如何,我想到了并写了这个。虽然它适用于方形,但我没有使用任何幻数,但对于其他常规多边形,它不能正常工作。请你看一下吗?

#include <Simple_window.h>

struct Regular_Polygon : Shape {

    Regular_Polygon(Point p, int d, int s): d(d), s(s)
       { add(Point(p)); }

    void draw_lines() const 
    { 
         fl_line(point(0).x-d+(360/s-d),point(0).y-d+(360/s-d),   point(0).x+d-(360/s-d),point(0).y-d+(360/s-d));
         fl_line(point(0).x+d-(360/s-d),point(0).y-d+(360/s-d),   point(0).x+d-(360/s-d),point(0).y+d-(360/s-d));
             fl_line(point(0).x+d-(360/s-d),point(0).y+d-(360/s-d),   point(0).x-d+(360/s-d),point(0).y+d-(360/s-d));
         fl_line(point(0).x-d+(360/s-d),point(0).y+d-(360/s-d),   point(0).x-d+(360/s-d),point(0).y-d+(360/s-d));
    }

private:
    int d, s;
};

int main()
{
    using namespace Graph_lib; 

    Simple_window win(Point(100,100), 600,400, "Regular_Polygon");  
    Point p(200,200);
    int d = 100;
    int s = 4;
    Regular_Polygon r_p(p,d,s);
    win.attach(r_p);
    win.wait_for_button();
}

1 个答案:

答案 0 :(得分:0)

有很多方法可以改进您的代码:

  • 应避免使用幻数,例如3/20。
  • 一致地格式化代码。
  • 我已经确定六角形点的定位是错误的,即使它对半径的某些值看起来很好。
  • 没有文档。把某事称为'd'并不明显。
  • using中有一个main()声明,但也是在那里使用的完全限定名称。
  • 如果使用三角法计算角点的位置,那么对任何正多边形执行此操作的方法都会变得很明显。
  • 反复使用相同的术语有时值得将该术语分解为常数并改为指代。它还使代码更加清晰,例如Point const c = point(0);中的draw_lines()