1、 代码部分
Hpoint.h(储存点)
#pragma once
class HPOINT
{
public:
double x;
double y;
int flag;//判断是否该点已输入数据
public:
HPOINT();
~HPOINT();
};
Hpoint.cpp
#include "HPOINT.h"
HPOINT::HPOINT()
{
x = 0;
y = 0;
flag = 0;//0表示改点没有输入数据,1表示该点已有数据
}
HPOINT::~HPOINT()
{
}
CPolygon.h(多边形类)
#pragma once
#include "HPOINT.h"
class CPolygon
{
public:
CPolygon(void);
~CPolygon(void);
public:
HPOINT* pPointData;//顶点数组
int iPointCount;//顶点个数
public:
bool SetPoint(double pos,double x, double y);//输入的坐标传给数组
bool Setsize(int n);//开辟空间
double Area(void);//计算面积
double Perimeter(void);//计算周长
public:
double TwoPointDist(HPOINT p1,HPOINT p2);
};
CPolygon.cpp
#include "CPolygon.h"
#include "math.h"
#include "string.h"
#include "iostream"
using namespace std;
CPolygon::CPolygon(void)
{
pPointData = NULL;
iPointCount = 0;
}
CPolygon::~CPolygon(void)
{
if (pPointData)
{
delete[] pPointData;
}
}
bool CPolygon::SetPoint(double pos, double x, double y)
{
if (pos > iPointCount)
{
return false;
}
pPointData[int(pos)].x = x;
pPointData[int(pos)].y = y;
pPointData[int(pos)].flag = 1;//改变标志变量的值,表示该顶点已有数据
return true;
}
bool CPolygon::Setsize(int n)
{
if (n < 3)
{
return false;
}
pPointData = new HPOINT[n];
iPointCount = n;
for (int i = 0; i < iPointCount; i++)
{
pPointData[i].x = 0;
pPointData[i].y = 0;
}
}
double CPolygon::Area(void)
{
double dArea = 0;
for (int i = 0; i < iPointCount; i++)
{
if (i == iPointCount - 1)
{
dArea += 0.5 * (pPointData[0].x + pPointData[i].x) * (pPointData[0].y - pPointData[i].y);
}
else
{
dArea += 0.5 * (pPointData[i + 1].x + pPointData[i].x) * (pPointData[i + 1].y - pPointData[i].y);
}
}
return fabs(dArea);/*顺时针输入坐标时,面积为正,逆时针输入坐标时,面积为负,故取绝对值*/
}
double CPolygon::Perimeter(void)
{
double dDist;
double p = 0;
for (int i = 0; i < iPointCount; i++)
{
if (i == iPointCount - 1)
{
dDist = TwoPointDist(pPointData[i], pPointData[0]);
}
else
{
dDist = TwoPointDist(pPointData[i], pPointData[i+1]);
}
p = p + dDist;
}
return p;
}
double CPolygon::TwoPointDist(HPOINT p1, HPOINT p2)
{
double d;
d = sqrt((p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y));
return d;
}
main.cpp
#include "iostream"
#include "CPolygon.h"
using namespace std;
const double EPSILION = 1.0E-10;
int main(void)
{
CPolygon a;
cout << "请输入点的个数:" << endl;
int n = 0;
cin >> n;
if (n < 3)
{
cout << "点的个数必须大于3,请重新输入" << endl;
cin >> n;
}
a.Setsize(n);
cout << "请输入下标和点的坐标(注意按顺时针或者逆时针输入顶点坐标)" << endl;
double x = 0; double y = 0;
double pos = 0;
for (int i = 0; i < n; i++)
{
cin >> pos;
if ((pos - size_t(pos)) > EPSILION|| (pos - size_t(pos)) <(-EPSILION)|| pos > size_t(n - 1) || pos < (-EPSILION))
{
cout << "输入的下标必须为大于0且小于等于"<<n-1<<"的整数,请重新输入"<< endl;
i--;
continue;//鲁棒性
}
if (a.pPointData[int(pos)].flag == 1)
{
cout << "此下标对应的点已经输入数据,请重新输入下标和坐标" << '\n';
i--;
continue;//鲁棒性
}
cin >>x >> y;
a.SetPoint(pos,x, y);
}
double area = a.Area();
double perimeter = a.Perimeter();
cout << "该多边形的面积是:" << area << "\n";
cout << "该多边形的周长是:" << perimeter<< "\n";
if (a.pPointData)
{
delete[] a.pPointData;
}
return 0;
}
2、运行效果
3、面积计算原理
面积参考公式:假设有n个点,(X1,Y1)、(X2,Y2)…(Xn,Yn),依顺序(按顺时针或者逆时针)构成多边形。
则公式为
原理:此计算方法是利用把一个n多边形分成n个梯形后,再来计算各梯形的面积,然后把各梯形面积进行合计。
4、说明
此程序参考戴吾蛟老师的《测绘程序设计》编写,有部分代码修改。鲁棒性还有待增强,可以增加顶点输入顺序错误的情况的处理情况。欢迎大家评论给出方法!