Создание класса hexagon

#c #class

#c #класс

Вопрос:

Упражнение 8 из главы 13 книги (http://www.stroustrup.com/programming1.html ) говорит:

Определите класс Hexagon (шестиугольник — это правильный шестигранный многоугольник). В качестве аргументов конструктора используйте центр и расстояние от центра до угловой точки.

Я решил это таким образом (ниже кода). И хотя я сомневался в ответе, но в любом случае затем перешел к упражнению 13-10, в котором говорится:

Определите класс regular_polygon. В качестве аргументов конструктора используйте центр, количество сторон (>2) и расстояние от центра до угла.

Когда я думал о решении для этого, я обнаружил, что использовать цикл и находить взаимосвязь между i amp; 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();
}
  

Проблема в том, как использовать тригонометрию! В любом случае я подумал об этом и написал это. Хотя он работает правильно для square, и я не использовал в нем никаких магических чисел, но для других правильных полигонов он не работает должным образом. Не могли бы вы взглянуть на него?

 #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/20.
  • Последовательно форматируйте свой код.
  • Я наполовину уверен, что расположение точек шестиугольника неверно, даже если оно выглядит хорошо для определенных значений радиуса.
  • Нет документации. Вызов чего-либо ‘d’ неочевиден.
  • В нем есть using объявление main() , но также используется полное имя.
  • Если бы вы использовали тригонометрию для вычисления положений углов, метод для выполнения этого для любого правильного многоугольника стал бы очевидным.
  • Многократное использование одного и того же термина иногда заслуживает того, чтобы разложить этот термин на константу и ссылаться на нее вместо этого. Это также делает код более понятным, как, например Point const c = point(0); , в draw_lines() .

Комментарии:

1. Соответственно. 1-Да, этого следует избегать, но замены не было. 3- Протестируйте его с любым значением для radius. Укажите d и номер, который вам нравится, и посмотрите на результат. 4- d = расстояние. 5- Мне нужно было его объявить. 6- Если бы я мог использовать тригонометрию, это было бы очень здорово, и, вероятно, проблема для упражнения 13-10 была бы почти решена! Можете ли вы (скажем) изменить код, чтобы он был первым, подходящим для примера 13-8, а затем пригодным для примера 13-10?

2. Что касается магических чисел, есть альтернатива, просто найдите термин «магическое число», и вы найдете множество предложений. (d-d / 20 * 3) равно d *(17/20) равно 0,85 * d, но оно должно быть 0,87 * d . В любом случае, чтобы ответить на ваш последующий вопрос, да, вы можете написать код, который можно использовать для обоих упражнений, поскольку одно является обобщением другого.

3. Да, полностью согласен, одно является обобщением другого. Но использование чего-то вроде 0.87 * d , похоже, невозможно. Я думаю, что должен быть один ответ, связанный с тригонометрией. Решение должно быть связано с точками на окружности.

4. Думаю, это ваше упражнение. Что бы вы сделали для этого? Имейте в виду, что проблема заключается в упражнении 13-10!

5. Поскольку количество углов является переменным, вам понадобится цикл. Для вычисления положения угла вам понадобятся функции синуса и косинуса.