1

我的作业有一个非常奇怪的问题,我想知道如何准确地解决这个问题。

问题问:

  • 创建一个基类 Shape ,它将构成您的形状的基础。Shape 类将包含计算形状面积和周长的函数,并提供包围形状(边界框)的矩形的坐标(点)。这些将根据需要由派生类重载。创建一个 display() 函数,该函数将显示类的名称以及有关该类的所有存储信息(包括面积、周长和边界框)。

  • 通过创建 Shape 类 Circle、Square 和 Triangle 来构建层次结构。对于这些派生类,创建默认构造函数和构造函数,其参数可以使用正确数量的 Point 对象适当地初始化形状(即,Circle 需要一个 Point 中心和一个半径;Square 需要四个 Point 顶点,而 Triangle 需要三个 Point 顶点)。

  • main()中,分别创建一个实例:半径为 23 的圆形、边长为 25 的正方形和边长为 10、20、30 的三角形。定义所有这些实例,使原点 (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,0)(0,20)(0,30)
三角形::周长 60
三角形::面积 0

但是您在该列表中所说的边界是三角形的角,而不是边界框。

如果这个形状实际上应该被称为三角形是一个定义问题,但由于这是内置的问题,我不会考虑太多。要么你的老师试图让你感到困惑,要么他/她没有考虑清楚。

围绕(嗯,接触)任何多边形的边界框是具有角的矩形

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

所以,在你的情况下

(0,0) - (0,30) - (0,30) - (0,0)
于 2012-07-29T22:22:55.697 回答
0

他们要求的长度为 10、20、30 ......他们并没有说你的点应该在 (0,10)、(0,20)、(0,30) - 这些点都在一条线,这就是你的面积为零的原因。你需要基本的三角函数。

看看http://demonstrations.wolfram.com/SolvingObliqueTriangles/

余弦定律会帮助你。如果您有三个边缘,a, b, c请将您的第一个边缘定义a为 (0,0) 到 (10,0)。这已经是两点了。第三点通过求解找到: 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和长度:第三点的位置。由于您从原点开始,这是最简单的形式。也许你可以自己做那部分。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 回答