题目:
题意:
找到多边形的重心
题解:
三角形的重心我会求!就是顶点坐标的算术平均数。
一堆有质量的点的重心我会求!就是坐标加质量为权的平均数。
所以多边形重心我会求。
嘛这是重心(三条中线的交点)
对于其他的[心],我们先进行知识储备!
求 π
const double pi=acos(-1.0);
求夹角(这里都是弧度制啦)
double angle(vector a,vector b)
{
return acos(Dot(a,b)/Len(a)/Len(b));
}
旋转(跳跃我闭着眼)
向量
x′=xcosa−ysina
y′=xsina+ycosa
推导:
y′ sin(a+b)=sinacosb+sinbcosa
x′ cos(a+b)=cosacosb−sinasinb
vector rotate(vector a,double rad)
{
return vector(a.x*cos(rad)-a.y*sin(rad),a.x*sin(rad)+a.y*cos(rad));
}
我们还可以求一下外心(三条垂直平分线的交点)
首先判断一下三个向量是不是共线,这样输出中点就好啦,不共线的话就随便找两条线的垂直平分线求交点
Point TC(Point A,Point B,Point C)
{
Point P=(A+B)/2,Q=(A+C)/2;
Vector v=Rotate(B-A,pi/2),w=Rotate(C-A,pi/2);
if (dcmp(Cross(v,w))==0)
{
if (dcmp(Len(A-B)+Len(B-C)-Len(A-C))==0)
return (A+C)/2;
if (dcmp(Len(A-C)+Len(B-C)-Len(A-B))==0)
return (A+B)/2;
if (dcmp(Len(A-B)+Len(A-C)-Len(B-C))==0)
return (B+C)/2;
}
return GLI(P,v,Q,w);
}
代码:
#include <cstdio>
using namespace std;
struct po
{
double x,y;
po(double X=0,double Y=0){x=X;y=Y;}
};
po operator -(po x,po y){return po(x.x-y.x,x.y-y.y);}
double cj(po x,po y){return x.x*y.y-x.y*y.x;}
int main()
{
int T,n;scanf("%d",&T);
while (T--)
{
scanf("%d",&n);double x,y,sx=0,sy=0,sum=0;po a,b,c;
scanf("%lf%lf",&x,&y),a.x=x,a.y=y;
scanf("%lf%lf",&x,&y),b.x=x,b.y=y;
for (int i=3;i<=n;i++)
{
scanf("%lf%lf",&x,&y),c.x=x,c.y=y;
po v=b-a,w=c-a;double s=cj(v,w);
sx+=(a.x+b.x+c.x)*s;
sy+=(a.y+b.y+c.y)*s;
sum+=s; b=c;
}
printf("%.2lf %.2lf\n",sx/sum/3,sy/sum/3);
}
}