【补充】GIS丨计算多边形面积代码

初级版

当坐标已知且固定,可以定义两个数组分别存放x坐标值和y坐标值,通过for循环求出面积。

#include<stdio.h>
int main()
{
	double x[4]={1,2,4,1};
	double y[4]={2,5,4,2};
	double area,sum=0;
	int i;
	for(i=0;i<3;i++)
	   {
			area=(x[i+1]-x[i])*(y[i+1]+y[i])/2;
			sum+=area;
	   }
	printf("%f",sum);
	return 0;
}

这种方法只能运用在数据量较少的情况下,而且不能重复使用,也就是如果要计算不同的多边形的面积,每次都要修改代码中数组的大小以及数组中的元素。故下面的版本对此进行了改进,使得我们能根据不同的需求自行输入坐标计算面积。

中级版

如果想要不固定坐标值而改成每次输入不同的坐标值进行运算,由于我这里的是C99之前的版本,不能用变量作为数组定义的大小,所以采用了两种方法解决了该问题。

方法一定义宏变量N表示坐标的个数,每次计算面积还是需要改变代码中N的数值,但是不需要再对坐标进行修改,而是每次运行时再输入;而方法二用stdio.h中的malloc函数申请空间来分配动态内存,每次运行计算面积的命令前不用修改代码。

方法一

#include<stdio.h>
#include<string.h>
#define N 4 //N的数值自行修改

int main()
{
	double x[N],y[N];
	double area=0,sum=0.0;
	int i,j;
	for(i=0;i<N;i++)
	{
		printf("请输入横坐标:");
		scanf("%lf",&x[i]);
	 }
     printf("横坐标输入完毕");
	 for(i=0;i<N;i++)
	 {
		 printf("请输入纵坐标:");
		 scanf("%lf",&y[i]);
	 }

	 for(i=0;i<N-1;i++)
	   {
			area=(x[i+1]-x[i])*(y[i+1]+y[i])/2;
			sum+=area;
	   }

	printf("area equals to %lf",sum);
	return 0;
}

方法二

#include<stdio.h>
#include<stdlib.h>
int CreatePolygon(double **a,double **b,int c);
double CalculateArea(double *a,double *b,int c);

int main()
{
	int number;//坐标个数
	double *x=0,*y=0; 
	double area;
	printf("请输入坐标个数:");
	scanf("%d",&number);
	CreatePolygon(&x,&y,number);
	area=CalculateArea(x,y,number);
	printf("该多边形面积为%lf\n",area);
	free(x);
	free(y);
	return 0;
}

int CreatePolygon(double **a,double **b,int c)
{
	int i;
	*a=(double*)malloc(c*sizeof(double));
	*b=(double*)malloc(c*sizeof(double));

	for(i=0;i<c;i++)
	{
		printf("请输入第%d个点的横坐标",i+1);
		scanf("%lf",*a+i);
	}
	printf("%%%%横坐标输入完成%%%%\n");

	for(i=0;i<c;i++)
	{
		printf("请输入第%d个点的纵坐标",i+1);
		scanf("%lf",*b+i);
	}
	printf("%%%%纵坐标输入完成%%%%\n");
	return 0;
}

double CalculateArea(double *a,double *b,int c)
{
	int i;
	double sum=0,area;
	for(i=0;i<c-1;i++)
	   {
			area=(a[i+1]-a[i])*(b[i+1]+b[i])/2;
			sum+=area;
	   }
	return sum;
}

中级的两种方法解决了代码需要手动修改的问题,但坐标需要手动输入,如果数据量太大,以上的方法真正使用起来还是过于繁琐。而坐标数据通过文件的形式传输给代码则会方便很多。

所以,我对此再次改进,改成以文件的形式输入横纵坐标,减少了运行代码时需要一个一个输入坐标的麻烦。

终极版

当坐标的数据量庞大,且源自一个文件,手动输入坐标太复杂,则可以采用读取文件的方式获得坐标。这里我设计的代码对文件格式有一些要求:

1、文件的第一行是坐标的个数,其余行是点的x,y坐标;

2、其中第一行和最后一行坐标应该相同,使得多边形闭合。

函数整体上与version 2的第二种方法相似,只不过将scanf改为fscanf。

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int CreatePolygon(double **x,double **y,char *filename);
double CalculateArea(double *x,double *y,int z);

int main()
{
	double *x=0,*y=0,area;
	int k;
	char FileName[100];
	printf("请输入文件名:");
	scanf("%s",FileName);
	k=CreatePolygon(&x,&y,FileName);
/*
四个坐标才能构成三角形,
所以k>3才能成功创建多边形
*/
	if(k>3)
    {
		area=CalculateArea(x,y,k);
        printf("多边形面积为%lf\n",area);
    }
    else
    {
        printf("Failed to create polygon.\n");
    }
	free(x);
	free(y);
	return 0;
}

int CreatePolygon(double **x,double **y,char *filename)
{ 
	FILE *fp;
	int number,i;
		
	fp=fopen(filename,"r");
	if(fp==NULL)
    {
        printf("Error opening file.\n");
        return -1;
    }
	/*判断文件是否能打开*/

	fscanf(fp,"%d",&number);
	*x=(double*)malloc(number*sizeof(double));
	*y=(double*)malloc(number*sizeof(double));

	for(i=0;i<number;i++)
	{
		fscanf(fp,"%lf%lf",&(*x)[i], &(*y)[i]); 
		/*读取第i个点的x和y*/
	}
	fclose(fp);
	return number;
}

double CalculateArea(double *x,double *y,int z)
{
	int i;
	double sum=0,area;
	for(i=0;i<z-1;i++)
	   {
			area=(x[i+1]-x[i])*(y[i+1]+y[i])/2;
			sum+=area;
	   }
	return fabs(sum);
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值