## 计算几何入门

计算几何入门

一、计算几何
向量是将图形转化为代数的工具,这点我们在高中时就认识到了,碰到向量题,画出图形,几何解决问题以此避免大量计算。相反地,计算机几何却是用向量抽象地解决问题。

计算几何要确保精度,用到这个三态函数:
在这里插入图片描述

一般用到的模板:

struct Point
{
	double x,y;
	Point(double x,double y):x(x),y(y){}
	Point operator +(const Point B)const{ return Point(x+B.x,y+B.y); }
	Point operator -(const Point B)const{ return Point(x-B.x,y-B.y); }
	Point operator *(const double B)const{ return Point(x*B,y*B); }
	double Cross(const Point B)const{ return x*B.y-y*B.x; }
	double Dot(const Point B)const{ return x*B.x+y*B.y; }
	double Len()const{ return sqrt(Dot(*this)); }
	double Angle(const Point B)const{ return acos(Dot(B)/Len()/B.Len()); }
};

求任意多边形的面积:
选一个多边形的点为原点,每个点对于这个点有一个向量,将每一条边上两个端点的向量按同一个方向求叉积和的绝对值再除二

double polygon_area(point* p,int n){
	//求多边形面积,Point *p表示多边形。从原点开始划分三角形
	double area=0;
	for(int i=0;i<n;i++){
		area+=cross(p[i],p[(i+1)%n]);
	}
	return area/2;//面积有正负,不能取绝对值
}

求叉积的cross函数:

double cross(vector a,vector b){
	//求向量的叉积;大于0,B在A逆时针方向;等于0,A、B重合
	return a.x*b.y-a.y*b.x;
}

二、例题
‎地板上有许多秘密的开口,上面覆盖着一块沉重的石头。当石头被抬起来时,一种特殊的机制会检测到这一点,并激活在开口附近射出的有毒箭头。唯一的可能性是非常缓慢和小心地抬起石头。ACM 团队必须将绳索连接到石头上,然后用滑轮将其提起。此外,石头必须同时全部抬起:没有一方可以先于另一方上升。因此,找到重心并将绳索完全连接到该点非常重要。石头有一个多边形,其高度在整个多边形区域是相同的。您的任务是找到给定多边形的重心。‎

Input
‎输入由 T 测试案例组成。输入文件的第一行会给出它们的数量(T)。每个测试案例以包含单个整数 N(3 +lt;= 1000000)的行开头,指示形成多边形的点数。后面跟着 N 行,每个行包含两个整数 Xi 和 Yi (|习|, |易|[20000]。这些数字是第一点的坐标。当我们在给定顺序中连接点时,我们会获得多边形。您可能会认为边缘从不相互接触(相邻边缘除外),并且它们从不交叉。多边形的区域从来不是零,即它不能折叠成一条线。

Output
‎为每个测试案例打印一行。该行应包含由一个空间分离的正好两个数字。这些数字是重心的坐标。在小数点(0.005 到 0.01)之后,将坐标以两位数的准确数字将坐标旋转到最近的数字。请注意,如果其形状不是凸起,重心可能位于多边形之外。如果输入数据中有这种情况,则无论如何都要打印中心。‎

Sample Input
2
4
5 0
0 5
-5 0
0 -5
4
1 1
11 1
11 11
1 11

Sample Output
0.00 0.00
6.00 6.00

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值