hdu 2528 Area

本文介绍了一种计算电子科技大学清水河校区被水渠分割后的两部分面积的方法。该校区占地约3128亩,通过直线分割形成不规则区域。代码使用C++实现,涉及点、线段交叉判断等几何计算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

电子科大清水河校区是电子科大大力兴建的未来主校区,于07年秋正式迎接学生入住,目前有07、08级本科生及部分研究生在此校区学习、生活。
清水河校区位于成都高新西区的中部地带,占地约3128亩。从空中看,新校区的整体像一个长方形,南北长,东西窄。一条水渠从西北角的顶点注入,笔直的延伸到南面围墙的大概三分之一分点的地方,由此流出学校。位于这条水渠和西墙之间的是研究院,最南面的是学术交流中心和接待中心。
在本题中,假设清水河校区是一个凸多边形,水渠是一条直线,要求给出清水河校区被水渠分割成的两部分的面积。(水渠一定穿过清水河校区
#include<iostream>
#include<cstdio>
#include<cmath>
#define precision 1e-6
#define INF 1e10
using namespace std;
struct point 
{
	double x;
	double y;
};
int dblcmp(double m)
{
	if(fabs(m)<precision)
		return 0;
	else if(m<0)
		return -1;
	return 1;
}

int cross(point p1,point p2,point a)
{
	return dblcmp( (p1.x-a.x)*(p2.y-a.y)-(p2.x-a.x)*(p1.y-a.y) );
	
}
bool judge(point a,point b,point p1,point p2,point &m)
{
	if(cross(p1,p2,a)*cross(p1,p2,b)>0)
		return false;
	double k1,b1,k2,b2;

	if(a.x==b.x)
	{
		k1=INF;
		b1=a.x;
	}
	else
	{
		k1=(a.y-b.y)/(a.x-b.x);
		b1=a.y-k1*a.x;
	}

	if(p1.x==p2.x)
	{
		k2=INF;
		b2=p1.x;
	}
	else
	{
		k2=(p1.y-p2.y)/(p1.x-p2.x);
		b2=p1.y-k2*p1.x;
	}

	if(k1!=INF && k2!=INF)
	{
		m.x=(b2-b1)/(k1-k2);
		m.y=k1*m.x+b1;
	}
	else if(k1==INF &&k2!=INF)
	{
		m.x=a.x;
		m.y=k2*m.x+b2;
	
	}
	else if(k1!=INF &&k2==INF)
	{
		m.x=p1.x;
		m.y=k1*m.x+b1;
	}
	return true;
}

int main()
{
	freopen("test.txt","r",stdin);
	int n;
	int i;
	point m;
	point p1,p2;
	point node[2];
	point a[25];
	int po[2];
	double area1,area2,sum;
	while(scanf("%d",&n)!=EOF && n!=0)
	{
		for(i=0;i<n;i++)
			scanf("%lf %lf",&a[i].x,&a[i].y);

		a[n]=a[0];
		scanf("%lf %lf %lf %lf",&p1.x,&p1.y,&p2.x,&p2.y);
		int j=0;
		for(i=0;i<n;i++)
		{
			if( judge(a[i],a[i+1],p1,p2,m) )
			{
				if( dblcmp(m.x-a[i+1].x)==0 && dblcmp(m.y-a[i+1].y)==0 )
					continue;
				po[j]=i;
				node[j++]=m;
				if(j==2)
					break;
			}
		}
	
		sum=0;
		for(i=0;i<n;i++)
			sum+=(a[i].x*a[i+1].y-a[i].y*a[i+1].x);
		sum=fabs(sum/2);

		area2= node[0].x*a[po[0]+1].y-a[po[0]+1].x*node[0].y;
		area2+= node[1].x*node[0].y-node[0].x*node[1].y ;
		area2+= a[po[1]].x*node[1].y-node[1].x*a[po[1]].y;


		for(i=po[0]+1;i<po[1];i++)
		{
			area2+= a[i].x*a[i+1].y-a[i].y*a[i+1].x;
		}
		area2=fabs(area2/2);
		area1=sum-area2;
		if(area1>area2)
			printf("%.0lf %.0lf\n",area1,area2);
		else
			printf("%.0lf %.0lf\n",area2,area1);
	}
	return 0;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值