1

私の課題について非常に奇妙な質問があり、それを正確に理解する方法を考えていました.

質問は尋ねます:

  • シェイプの基礎となる基本クラス Shape を作成します。Shape クラスには、形状の面積と円周を計算する関数が含まれ、形状を囲む四角形 (境界ボックス) の座標 (ポイント) が提供されます。これらは、必要に応じて派生クラスによってオーバーロードされます。クラスの名前に加えて、クラスに関するすべての格納された情報 (面積、円周、および境界ボックスを含む) を表示する display() 関数を作成します。

  • Shape クラス Circle、Square、および Triangle を作成して、階層を構築します。これらの派生クラスに対して、正しい数の Point オブジェクトを使用して形状を適切に初期化できる引数を持つデフォルト コンストラクターとコンストラクターを作成します (つまり、Circle には Point の中心と半径が必要です。Square には 4 つの Point 頂点が必要ですが、Triangle には 3 つの Point 頂点が必要です)。

  • main()で、半径 23 の円、辺 25 の正方形、および辺 10、20、30 の三角形のそれぞれ 1 つのインスタンスを作成します。原点 (0,0) がどこかにあるように、それらすべてを定義します。各オブジェクト内。各オブジェクトからの情報を表示します。

したがって、辺が 10、20、30 の三角形を作成するポイントを計算する必要があります。

入力:

Triangle t(Point(0,0), Point(0,20), Point(0,30));

三角形の私のコードは次のとおりです。

class Triangle : public Shape
{
   Point s1, s2, s3;

public:
  Triangle() {}
  Triangle(const Point &p1, const Point &p2, const Point &p3) : s1(p1), s2(p2), s3(p3) {}

  void bbox()
  {  
     std::cout << "Triangle::bounding " << s1 << s2 << s3;
  }   

  void circumference() 
  {
     Point side1 = (s1 - s2);
     Point side2 = (s2 - s3);
     Point side3 = (s3 - s1);

     std::cout << "Triangle::perimeter " << side1.dist() + side2.dist() +   side3.dist();
  }

  void area() 
  {
     Point side1 = (s1 - s2);
     Point side2 = (s2 - s3);
     Point side3 = (s3 - s1);

     double half = (side1.dist() + side2.dist() + side3.dist())/2;    
     double answer = sqrt(half * (half - side1.dist()) * (half - side2.dist()) * (half - side3.dist()));

     std::cout << "Triangle::area " << answer;     
  }

};

これは出力です:

Triangle::bounding (0,0)(0,20)(0,30)
Triangle::perimeter 60
Triangle::area 0

辺が 10、20、30 の三角形の周囲にバウンディング ボックスを作成する最良の方法は何ですか。

4

3 に答える 3

0

彼らは、の長さを 10、20、30 にするように要求しました...彼らは、あなたのポイントが (0,10)、(0,20)、(0,30) であるべきだとは言いませんでした - これらのポイントはすべてオンですあなたの面積がゼロである理由です。ここでは基本的な三角法が必要です。

http://demonstrations.wolfram.com/SolvingObliqueTriangles/を見てください。

余弦の法則が役に立ちます。3 つのエッジがある場合a, b, c、最初のエッジaを (0,0) から (10,0) として定義します。もう2点です。3 番目の点は次を解くことによって見つかります。 b^2 = a^2 + c^2 -2*a*c*cos(B)ここで、B はエッジaとの間の角度cです。 つまり、原点での角度です。cでは、エッジの長さを 30 ユニットにしたいとしましょう( b20 ユニットも同様です)...

double a=10, b=20, c=30;
double B = acos((a*a + c*c - b*b) / (2*a*c));

これで、三角関数を使用して作業できる角度Bと長さがわかりました。つまり、3 番目のポイントの位置です。原点から始めるので、これが最も簡単な形式です。たぶん、あなたは自分でその部分を行うことができます。c(x,y)

于 2012-07-29T22:47:26.400 に答える
0

アラインメントの問題で申し訳ありませんが、完成したコードに興味がある方はこちらをご覧ください。

void 関数は「仮想」です

  virtual void area() = 0;
  virtual void circumference() = 0;
  virtual void bbox() = 0;
  virtual void display();

すべてのクラスが display() 内に表示されます。私は興味がありますが、誰かがコードをさらに圧縮するアイデアを持っている場合、私は C++ が初めてなので、すべてが拡張されているように見えるかもしれません。

class Triangle : public Shape
{
   Point s1, s2, s3;

   public:
   Triangle() {}
   Triangle(const Point &p1, const Point &p2, const Point &p3) : s1(p1), s2(p2), s3(p3) {}

void bbox()
{   
  Point b1 = min(s1, s2, s3); 
  Point b3 = max(s1, s2, s3);
  Point b2 = min_max(s1, s2, s3);
  Point b4 = max_min(s1, s2, s3);

  std::cout << "Triangle::bounding " << b1 << b2 << b3 << b4;
}     

void circumference() 
{
  Point side1 = (s1 - s2);
  Point side2 = (s2 - s3);
  Point side3 = (s3 - s1);

  std::cout << "Triangle::perimeter " << side1.dist() + side2.dist() + side3.dist();
}

   void area() 
   {
     Point side1 = (s1 - s2);
     Point side2 = (s2 - s3);
     Point side3 = (s3 - s1);

     double half = (side1.dist() + side2.dist() + side3.dist())/2;    
     double answer = sqrt(half * (half - side1.dist()) * (half - side2.dist()) * (half - side3.dist()));

     std::cout << "Triangle::area " << answer;     
   } 
};

どう考えているか教えてください。

ありがとう。

于 2012-07-30T12:40:17.450 に答える
0

辺が 10,20,30 で面積がゼロでない三角形はないため、次のように述べています。

Triangle::bounding (0,0)(0,20)(0,30)
Triangle::perimeter 60
Triangle::area 0

しかし、そのリストでバウンディングと呼んでいるものは、バウンディング ボックスではなく、三角形の角です。

この形状を実際に三角形と呼ぶべきかどうかは定義の問題ですが、それは質問に組み込まれているので、私はそれについてあまり考えません. 先生があなたを混乱させようとしているか、考え抜いていないかのどちらかです。

任意の多角形の周囲の (まあ、接している) 境界ボックスは、

(xmin,ymin)-(xmin,ymax)-(xmax,ymax)-(xmax,ymin)

だから、あなたの場合

(0,0) - (0,30) - (0,30) - (0,0)
于 2012-07-29T22:22:55.697 に答える