책 (http://www.stroustrup.com/programming1.html)의 장 (13)의 행사 (8) 만들기 말한다 :는 육각형 클래스
클래스 육각형 (육각형 정규 여섯 양면 다각형) 정의합니다. 중심과 중심점에서 꼭지점까지의 거리를 생성자 인수로 사용합니다.
나는 (코드 아래)이 방법으로 해결했다. 그리고 비록 나는 그 대답에 대해 의구심을 가지지 만, 어쨌든 운동 13-10에 대해서 말했습니다 :
regular_polygon을 정의하십시오. 중심, 측면 수 (> 2) 및 중심에서 구석까지의 거리를 생성자 인수로 사용합니다. 나는이 일에 대한 해결책에 대해 생각
, 나는 루프와 & j는 이전 (13-8)보다 매우 어려운 난 사이의 관계를 찾는 데 활용할 것을 발견했다.
첫 번째 코드는 다음과 같습니다. 운동 13-8에 대한 해결책으로을 사용하십시오.
다음 : 운동 13-8을 해결하는 데 사용할 수있는 운동 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 = 거리. 5 - 나는 그것을 선언 할 필요가 있었다. 6- 삼각법을 사용할 수 있다면 그것은 매우 뛰어날 것이며 아마도 운동 13-10에 대한 문제는 거의 해결 될 것입니다! ex-13-8에 적합하도록 코드를 변경하고 ex 13-10에도 사용할 수 있습니까? – Aria
매직 넘버와 관련하여 대안이 있습니다. "매직 넘버"라는 용어를 검색하면 많은 제안을 찾을 수 있습니다. (d-d/20 * 3)은 d * (17/20)가 0.85 * d이지만 0.87 * d가되어야합니다. 어쨌든, 당신의 후속 질문에 대답하기 위해, 예, 당신은 다른 하나의 일반화이기 때문에 두 연습 모두에 유용한 코드를 작성할 수 있습니다. –
예, 완전히 동의합니다. 하나는 다른 하나의 일반화입니다. 그러나 _0.87 * d_와 같은 것을 사용하는 것은 불가능한 것처럼 보입니다. 삼각법과 관련된 한 가지 대답이 있어야한다고 생각합니다. 해결책은 원주의 점과 관련된 것이어야합니다. – Aria