我一直在打扰这个项目,我无法弄清楚为什么这个函数不会返回多边形的区域。我对此很陌生,所以请不要对我太粗暴。这是我的代码。
#include <iostream>
using namespace std;
struct Point
{
double xCoord, yCoord;
~Point(){};
};
class Triangle;
class Polygon
{
friend class Triangle;
private:
int totalVertices;
int lastIndex = 0;
double area = 0;
public:
void setNumOfVertices();
void setPoint(Point [], Point []);
int getNumOfVertices() const;
};
class Triangle : public Polygon
{
friend class Polygon;
private:
Point triangleVertices[2];
double triangleArea;
public:
double getArea(Point [], Point []);
};
void Polygon::setNumOfVertices()
{
cout << "Please enter how many vertices(intersections) for this polygon: ";
cin >> totalVertices;
while (totalVertices < 3) {
cout << "ERROR: Must have more than 2 vertices. Please try again." << endl;
cout << "Please enter how many vertices(intersections) for this polygon: ";
cin >> totalVertices;
}
}
void Polygon::setPoint(Point points[2], Point vertexCoords[])
{
for (int x = 1; x < totalVertices; x++) {
if (x != lastIndex && x != 1) {
points[0] = points[1];
points[1] = vertexCoords[x];
lastIndex = x;
break;
}
else if (x == 1) {
points[0] = vertexCoords[1];
points[1] = vertexCoords[2];
break;
}
}
}
int Polygon::getNumOfVertices() const
{
return totalVertices;
}
double Triangle::getArea(Point points[2], Point vertexCoords[])
{
triangleArea = 0;
triangleArea = ((vertexCoords[0].xCoord - points[2].xCoord) * (points[1].yCoord - vertexCoords[0].yCoord) -
(vertexCoords[0].xCoord - points[1].xCoord) * (points[2].yCoord - vertexCoords[0].yCoord)) / 2;
return triangleArea;
}
int main()
{
Polygon polygon1;
Triangle triangle1;
double area = 0;
polygon1.setNumOfVertices();
Point vertexCoords[polygon1.getNumOfVertices()];
Point trianglePts[2];
//Get all vertex coordinates from user and store them in an array
for (int x = 0; x < polygon1.getNumOfVertices(); x++) {
cout << "Enter vertex number " << x + 1 << "'s X coordinate please: ";
cin >> vertexCoords[x].xCoord;
cout << "Enter vertex number " << x + 1 << "'s Y coordinate please: ";
cin >> vertexCoords[x].yCoord;
}
cout << endl;
//Output all vertex coordinates in parenthesis to the user via console
cout << "The X and Y coordinates of the vertices are as follows:" << endl;
for (int x = 0; x < polygon1.getNumOfVertices(); x++)
cout << "(" << vertexCoords[x].xCoord << ", " << vertexCoords[x].yCoord <<
")" << endl;
for (int x = 0; x < polygon1.getNumOfVertices(); x++) {
polygon1.setPoint(trianglePts, vertexCoords);
area += triangle1.getArea(trianglePts, vertexCoords);
}
//Output the area of the polygon
cout << endl;
cout << "The area of the polygon is: " << area << endl;
return 0;
}
当我在循环中调用getArea(Point [],Point [])函数来获取main函数中的区域时,似乎Triangle类的成员变量triangleArea永远不会得到应有的更新。谁能告诉我我做错了什么?其他一切都像一个魅力我每次运行程序时都会为我的区域获得0。感谢您的时间。
答案 0 :(得分:0)
您不断访问这些Point数组的界限。例如,在Triangle::getArea
中,参数为:
Point points[2];
但您可以访问points[1]
和points[2]
。数组有0个索引。
乍一看,我认为trianglePts
和triangleVertices
的尺寸错误,因为您给它们的尺寸为[2]
,而三角形实际上有3
个顶点。但是我现在认为你要做的只是在这个数组的计算中存储每个三角形的3个顶点中的两个,并且始终使用vertexCoords[0]
作为第三个顶点。
这至少可以说令人困惑。
Triangle::getArea()
的设计和逻辑也是错误的。首先,它甚至不使用Triangle
类的任何成员变量,这是一个不好的标志。相反,这应该是一个非成员函数,它只需要3个点作为参数(可以是3的数组,或者2的数组加上第三个作为单独的参数)。您根本不需要Triangle
课程,并且您不需要传递整个vertexCoords
数组。
下一步:Polygon::setPoint
一团糟。我想你想要做的事实上是得到 vertexCoords
中的下一对2点。同样,这不使用Polygon
的任何成员变量,因此将它作为成员函数没有意义。好吧,它确实使用lastIndex
,但这不是一个好主意。您正在使用lastIndex
按照上次获得的点进行随机播放,但这是一个脆弱且令人困惑的设计。
此功能甚至不起作用:每次调用它时都会执行相同的else if (x == 1)
分支,因为在此之前第一个if
永远不会成立!
只需让函数在传递Index
作为参数的地方提供所需的3个点就会简单得多。也许称之为get3Points
而不是setPoint
。
你应该做的是让Polygon
将顶点坐标列表存储为成员变量,而不是将其传递给每个函数。
(这意味着您必须使用vector
作为成员变量来保存它们)。
如果您不想这样做,那么根本没有Polygon
类的任何一点,您可以让get3Points
成为您通过的免费功能每次都vertexCoords
。
另一个问题是最终循环执行的次数太多。如果共有3
个顶点,则此循环应该运行一次,但实际上运行3
次(并且这样做,setPoint
读取vertexCoords
的结尾 - 或者如果setPoint
没有被破坏只读过第1点和第2点,那就好了。