建立一个形状类三角形
build a shape class Triangle
我的作业有一个非常奇怪的问题,我想知道如何准确地解决。
问题是:
-
创建一个基类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的三角形或任何三角形周围创建边界框的最佳方法是什么。
没有边为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)
他们要求边的长度为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
之间的角度ie原点处的角度。假设边c
是30个单位长(所以b
是20)。。。
double a=10, b=20, c=30;
double B = acos((a*a + c*c - b*b) / (2*a*c));
现在你知道了角度B
和长度c
,你可以使用trig来计算(x,y)
:你的第三点的位置。既然你是从原点开始,这是最简单的形式。也许你可以自己做这部分。
我很抱歉出现对齐问题,但如果有人对这里完成的代码感兴趣,那就是。
无效功能是"虚拟"
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;
}
};
让我知道你的想法。
谢谢。
- 为我的 c++ 类介绍制作一个三角形分类器.我有几个问题
- 以C++输出一个数字三角形
- 形成一个斐波那契三角形,使得每个数字是上面左对角线或右对角线上两个数字的总和
- 给定一个用三角形镶嵌的补丁,如何修改其新的顶点位置
- 使用 C++ 库 GLEW 在 openGl 中绘制一个红色三角形
- 创建一个绿色三角形C Directx
- 创建一个程序以输出三角形平方数的4个
- 在OpenGL中打印一个红色三角形
- 如何打印一个不相等的三角形
- 我如何对此代码进行添加以使用我的 arduino 打印一个完整的三角形
- Direct3D:尝试绘制一个三角形,但什么也没显示
- 用一个glDrawArrays命令绘制几个不同颜色的三角形
- 三角形之间的相似性;双变量是一个痛苦
- Opengl 创建一个 3D 框而不是一个简单的三角形
- 建立一个形状类三角形
- 编程难题 - 绘制一个倒三角形
- 如何在 Qwidget 的中心设计一个三角形(在 QT 中使用 OpenGl)
- openGL drawElements - 一个额外的三角形,使用索引数组
- 在 OpenGL 中创建一个围绕其 y 轴连续旋转的三角形
- 输出一个三角形