多边形类计算多边形的面积和周长(c++控制台)

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、说明

此程序参考戴吾蛟老师的《测绘程序设计》编写,有部分代码修改。鲁棒性还有待增强,可以增加顶点输入顺序错误的情况的处理情况。欢迎大家评论给出方法!

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值