[HDU1115]Lifting the Stone(计算几何-三角形的[心]+角度计算+旋转)

题目:

我是超链接

题意:

找到多边形的重心

题解:

三角形的重心我会求!就是顶点坐标的算术平均数。
一堆有质量的点的重心我会求!就是坐标加质量为权的平均数。
所以多边形重心我会求。

嘛这是重心(三条中线的交点)
对于其他的[心],我们先进行知识储备!

π

const double pi=acos(-1.0);

求夹角(这里都是弧度制啦)

double angle(vector a,vector b)
{
    return acos(Dot(a,b)/Len(a)/Len(b));
}

旋转(跳跃我闭着眼
向量v(x,y)逆时针旋转a弧度,则
x=xcosaysina
y=xsina+ycosa
推导:
y sin(a+b)=sinacosb+sinbcosa
x cos(a+b)=cosacosbsinasinb

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);
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值