码迷,mamicode.com
首页 > 其他好文 > 详细

计算几何

时间:2018-10-04 11:11:34      阅读:153      评论:0      收藏:0      [点我收藏+]

标签:多边形   ==   scan   include   src   线段   nbsp   模板   while   

一、基本向量运算

技术分享图片技术分享图片

板子:

技术分享图片技术分享图片

例:线段求交点,点到直线的面积

技术分享图片技术分享图片

直线求交点,点在多边形内

技术分享图片技术分享图片

多边形面积,凸包

技术分享图片技术分享图片

凸包板子,根据圆心角求点的坐标

技术分享图片技术分享图片

两圆求交点

技术分享图片技术分享图片

 二、Graham‘s Scan求凸包

例:http://acm.hdu.edu.cn/showproblem.php?pid=1348  凸包模板题

#include <bits/stdc++.h>

using namespace std;
const int maxn=1006;
const double pi=acos(-1.0);
struct node{
    double x,y;
}p[maxn],P[maxn];

int n,tot;
double ans;
double X(node A,node B,node C)      //求差积
{
    return (B.x-A.x)*(C.y-A.y)-(C.x-A.x)*(B.y-A.y);
}
double len(node A,node B){          //两点距离
    return sqrt((A.x-B.x)*(A.x-B.x)+(A.y-B.y)*(A.y-B.y));
}
bool cmp(node A,node B){            //极角扫描比较;
    double pp=X(p[0],A,B);
    if(pp>0)return true;
    if(pp<0)return false;
    return len(p[0],A)<len(p[0],B);
}
int main()
{
    int t,l;
    scanf("%d",&t);
    for(int cas=1;cas<=t;cas++)
    {
        if(cas!=1)printf("\n");
        scanf("%d%d",&n,&l);
        ans=2*pi*l;     //圆的面积
        for(int i=0;i<n;i++)
            scanf("%lf%lf",&p[i].x,&p[i].y);
        if(n==1){
            printf("%.0f\n",ans);
        }else if(n==2){
            printf("%.0f\n",ans+len(p[0],p[1]));
        }else{
            for(int i=0;i<n;i++)
            {
                if(p[i].y<p[0].y){      //将p[0]设为左下角最小的点;
                    swap(p[i],p[0]);
                }else if(p[i].y==p[0].y&&p[i].x<p[0].x){
                    swap(p[i],p[0]);
                }
            }
            sort(p+1,p+n,cmp);
            P[0]=p[0];
            P[1]=p[1];
            tot=1;
            for(int i=2;i<n;i++)        //模拟栈的工作;
            {
                while(tot>0&&X(P[tot-1],P[tot],p[i])<=0)tot--;
                tot++;
                P[tot]=p[i];
            }
            for(int i=0;i<tot;i++)
                ans+=len(P[i],P[i+1]);
            ans+=len(P[0],P[tot]);
            printf("%.0f\n",ans);
        }
    }
}

 

计算几何

标签:多边形   ==   scan   include   src   线段   nbsp   模板   while   

原文地址:https://www.cnblogs.com/Cloud-king/p/9715793.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!