计算几何——多边形面积

 汇总篇:计算几何汇总 


 

规定顶点逆时针方向的多边形面积为正

多边形

取原点0(0,0)

S(a,b,c,d)=S(o,a,b)+S(o,b,c)+S(o,c,d)+S(o,d,a)

图中o在外部,obc,ocd, oda全部是正的,加起来构成了5变形obcda的面积,但oab是负面积,因此最后刚好等于abcd的面积。

而如果o点在多边形内部,则四个三角形全是正面积,等式正好成立。

代码

#include<cmath>


class point{
 	public:
	double x;
	double y;
	point(double x_=0,double y_=0):x(x_),y(y_){} 
	friend const point operator+(const point& p1,const point& p2){
		return point(p1.x+p2.x,p1.y+p2.y);
	};
	friend const point operator-(const point& p1,const point& p2){
		return point(p1.x-p2.x,p1.y-p2.y);
	};
	friend const point operator*(const point& p,const double& m){
		return point(p.x*m,p.y*m);
	};
	friend const point operator*(const double& m,const point& p){
		return point(p.x*m,p.y*m);
	};
	friend const point operator/(const point& p,const double& m){
		return point(p.x/m,p.y/m);
	};
	friend ostream& operator <<(ostream& out,point& a){
		printf("(%lf,%lf)",a.x,a.y);
		return out;
	};
};
typedef point vect2;//重命名,向量也是用坐标表示 

class line{
	public:
	point start;
	point end; 
	line(point s=point(0,0),point e=point(0,0)):start(s),end(e){}
};
double cross(point O,point A,point B){//叉乘 
	double oa_x=A.x-O.x;
	double oa_y=A.y-O.y;
	double ob_x=B.x-O.x;
	double ob_y=B.y-O.y;
	return oa_x*ob_y-oa_y*ob_x;
}
double polyArea(point *ex,int num){//求多边形面积 
	if(num<3)return 0.0;
	double s=0;
	point O;O.x=0;O.y=0;//取原点为
	for(int i=0;i<num;i++)
		s+=cross(O,ex[i],ex[(i+1)%num]);
	return fabs(s/2.0);//取绝对值 
} 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值