-1
书(http://www.stroustrup.com/programming1.html)的第13章的练习8说:创建一个六边形类
定义一个类六边形(六边形是一个普通的六个多边形)。使用中心和从中心到角点的距离作为构造函数参数。
我这样解决了它(下面的代码)。虽然我对答案有疑问,但无论如何,然后去练习13-10说:
定义一个类regular_polygon。使用中心,边的数量(> 2)以及从中心到角点的距离作为构造函数参数。
当我想到这个问题的解决方案时,我发现利用一个循环找到我之间的关系非常困难,比前一个(13-8)更多。
第一:这是下面的代码你期望作为解决方案的练习13-8请吗?
然后:请问有没有什么办法可以用来解决练习13-10的练习13-8(下面的代码)的答案?
在此先感谢。
#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 - 是的,应该避免,但没有任何替代品。 3-用任何半径值对其进行测试。给你喜欢的_d_和数字,看看结果。 4- d =距离。我需要申报。 6-如果我可以使用三角函数,它将非常优秀,可能13-10问题几乎解决!你可以(比如说)将代码改为第一个,适用于前13-8,然后,可用于前13-10? – Aria
关于魔术数字,还有一个选择,只需搜索术语“魔术数字”,你会发现很多建议。 (d-d/20 * 3)为d *(17/20)为0.85 * d,但应该为0.87 * d。无论如何,要回答你的后续问题,是的,你可以编写可用于这两个练习的代码,因为一个是另一个的泛化。 –
是的,完全同意,一个是另一个的泛化。但是使用_0.87 * d_这样的东西似乎不可能。我认为应该有一个与三角相关的答案。解决方案应该是与圆周上的点有关的东西。 – Aria