多边形求重心总结
多边形求重心:
逆时针给出你n边形的n个顶点,求重心利用的原理就是,加权平均,如下图:
将a点作为所有小三角形的公共顶点,那么多边形abcdef的中心=);
三角形的面积:用向量的×乘就可以 s1=向量ac×向量ba;(尽量不要用海伦公式,因为海林公式除法太多,容易卡精度)
三角形的重心:重心为顶点与对边中点的连线的交点,有一个性质很重要如下图:
ab=ac*(2/3);中学里学过的,证明方法这里就不讲了
利用这个性质就简单的求出三角形的重心
/********************************多边形中心模板**************************************/ struct Point{ double x,y; Point(){} Point(double a,double b){ x=a; y=b; } void input(){ scanf("%lf%lf",&x,&y); } }; Point p; vector<Point>v;//用来存储所有的点 double s[N];//用来存放n-2个小三角形的面积 void init(){ v.clear(); } double dis(Point a,Point b){//两点间距离 return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)); } Point operation_Focus(){ double sall=0; Point p(0,0); for(int i=1;i<v.size()-1;i++){//每个三角形由v[0],v[i],v[i+1]三个顶点组成 //面积 s[i-1]=(v[i].x - v[0].x)*(v[i+1].y - v[0].y) - (v[i].y-v[0].y)*(v[i+1].x - v[0].x); sall+=s[i-1]; //cout<<"S="<<s[i-1]<<endl; //重心 p.x+=s[i-1]*(v[i].x+v[i+1].x+v[0].x)*1.0/3; p.y+=s[i-1]*(v[i].y+v[i+1].y+v[0].y)*1.0/3; //cout<<"Point=("<<(fx*2+v[0].x)/3<<","<<(fy*2+v[0].y)/3<<")"<<endl; } p.x/=sall*1.0; p.y/=sall*1.0; return p; } /********************************多边形中心模板**************************************/