//#include <stdio.h>
#include <iostream>
#include <cmath>
using namespace std;
//声明结构,用来保存点坐标
struct PointCoordinates{
int PointName;
double x;
double y;};
//总点数确定(总行数减一)
int PointNumber()
{
FILE *fp=NULL;
if((fp=fopen("多边形坐标.csv","r"))==NULL)
return 0;
else{
char lose[512];
int i=0;
while(fgets(lose,511,fp)!=NULL)
{ //fget(……)每次读取一行,i计算行数
++i;}
cout<<"读取到"<<i-1<<"个点坐标"<<endl;
return i-1;
}
fp=NULL;
}
//声明点坐标文件读取函数
int PointCoordinatesInput(PointCoordinates *Point,int PointNumber)
{
FILE *fp=NULL;
if((fp=fopen("多边形坐标.csv","r"))==NULL)
return 0;
else{
char lose[512];
fgets(lose,511,fp);//丢掉第一行
char ch; //用来过滤掉逗号分隔
for(int i=0;i<PointNumber;++i)
{
fscanf(fp,"%d%c%lf%c%lf",&(Point[i].PointName),&ch,&(Point[i].x),&ch,&(Point[i].y));
//输出点号坐标
cout.precision(10); //设置输出格式(十个数)
cout<<"点号:"<<Point[i].PointName<<"\tX坐标:" <<Point[i].x<<"\tY坐标:"<<Point[i].y<<endl;
}
return 1;
}
fp=NULL;
}
//面积计算函数
double PolygonArea(PointCoordinates *Point,int PointNumber)
{
double PA=0;
int i=0;
for(i;i<PointNumber-1;++i) //最后闭合回去的要另外算(从01边到倒数第二条边
{
PA+=((Point[i+1].x- Point[i].x)*(Point[i].y+Point[i+1].y)/2);
}
PA+=((Point[0].x-Point[i].x)*(Point[i].y+Point[0].y)/2);
return PA;
}
//周长计算函数
double PolygonPerimeter(PointCoordinates *Point,int PointNumber)
{
double PP=0;
int i=0;
for(i;i<PointNumber-1;++i) //最后闭合回去的要另外算(从01边到倒数第二条边
{
PP+=sqrt(pow((Point[i+1].x- Point[i].x),2)+pow((Point[i+1].y-Point[i].y),2));
}
PP+=sqrt(pow((Point[0].x-Point[i].x),2)+pow((Point[i].y-Point[0].y),2));
return PP;
}
int main(int argc, char *argv[])
{
system("title 多边形面积周长计算——龙岩学院 willows");
cout<<"读取本程序所在文件夹下的\n多边形坐标.csv 进行面积周长计算"<<endl;
int PM;
PM=PointNumber();
if(PM==0)
{ cout<<"未能读取到坐标值,请检查坐标文件"<<endl;
system("PAUSE");
return 0;
}
//new建立数组保存点坐标
PointCoordinates * Point=new PointCoordinates [PM];
if(PointCoordinatesInput(Point,PM)==0)
{ cout<<"未能读取到坐标值,请检查坐标文件"<<endl;
system("PAUSE");
return 0;
}
//简化坐标值
//这一步是不需要的,只是个人习惯罢了
//把坐标全部转换为不改变相对位置的正整数
double Xmin=Point[0].x,Ymin=Point[0].y;
for(int i=1;i<PM;++i)
{
if(Point[i].x<Xmin)
Xmin=Point[i].x;
if(Point[i].y<Ymin)
Ymin=Point[i].y;
}
for(int i=0;i<PM;++i)
{
Point[i].x-=Xmin;
Point[i].y-=Ymin;
}
//计算面积
double Area;
Area=PolygonArea(Point,PM);
//计算周长
double Perimeter;
Perimeter=PolygonPerimeter(Point,PM);
// system("cls"); //清屏
/******************输出到屏幕******************/
cout << "\n\n■■■■■■■多边形面积周长计算程序 ■■■■■■■■■";
cout << "\n■■■■ 龙岩学院测绘一棵树 willows ╭(╯3╰)╮■■■■";
cout << "\n■■■■■■■■■■■解算完成 ■■■■■■■■■■■■";
cout<<"\n\n\n多边形的面积是:\t"<<Area<<"\n多边形的周长是:\t"<<Perimeter<<"\n\n\n\n\n\n";
delete [] Point;
system("PAUSE");
return EXIT_SUCCESS;
}
- 1
- 2
- 3
前往页