POJ 1279 Art Gallery 半平面交 多边形的核

题意:求多边形的核的面积

套模板即可

#include <iostream>
#include <cstdio>
#include <cmath>
#define eps 1e-18
using namespace std;

const int MAXN = 1555;
double a, b, c;
int n, cnt;

struct Point
{
    double x, y;
    double operator ^(const Point &b) const
    {
        return x*b.y - y*b.x;
    }
}point[MAXN], p[MAXN], tp[MAXN];

void Get_equation(Point p1, Point p2)
{
    a = p2.y - p1.y;
    b = p1.x - p2.x;
    c = p2.x * p1.y - p1.x * p2.y;
}

Point Intersection(Point p1, Point p2)
{
    double u = fabs(a * p1.x + b * p1.y + c);
    double v = fabs(a * p2.x + b * p2.y + c);
    Point t;
    t.x = (p1.x * v + p2.x * u) / (u + v);
    t.y = (p1.y * v + p2.y * u) / (u + v);
    return t;
}

void Cut()
{
    int tmp = 0;
    for(int i=1; i<=cnt; i++)
    {
        //顺时针是>-eps和>eps,逆时针是<eps和<-eps
        if(a * p[i].x + b * p[i].y + c > -eps) tp[++tmp] = p[i];
        else
        {
            if(a * p[i-1].x + b * p[i-1].y + c > eps)
                tp[++tmp] = Intersection(p[i-1], p[i]);
            if(a * p[i+1].x + b * p[i+1].y + c > eps)
                tp[++tmp] = Intersection(p[i], p[i+1]);
        }
    }
    for(int i=1; i<=tmp; i++)
        p[i] = tp[i];
    p[0] = p[tmp];
    p[tmp+1] = p[1];
    cnt = tmp;
}

double solve()
{
    for(int i=1; i<=n; i++)
        p[i] = point[i];
    point[n+1] = point[1];
    p[0] = p[n];
    p[n+1] = p[1];
    cnt = n;
    for(int i=1; i<=n; i++)
    {
        Get_equation(point[i], point[i+1]);
        Cut();
    }
    double res = 0;
    for(int i = 1; i <= cnt; i++)
        res += p[i]^p[i+1];
    return fabs(res/2);
}

int main()
{
    int T;
    scanf("%d\n", &T);
    while(T--)
    {
        scanf("%d", &n);
        for(int i=1; i<=n; i++)
            scanf("%lf%lf", &point[i].x, &point[i].y);
        printf("%.2f\n", solve());
    }
    return 0;
}
时间: 2024-10-10 05:33:41

POJ 1279 Art Gallery 半平面交 多边形的核的相关文章

POJ 1279 Art Gallery 半平面交求多边形核

第一道半平面交,只会写N^2. 将每条边化作一个不等式,ax+by+c>0,所以要固定顺序,方便求解. 半平面交其实就是对一系列的不等式组进行求解可行解. 如果某点在直线右侧,说明那个点在区域内,否则出现在左边,就可能会有交点,将交点求出加入. //#pragma comment(linker, "/STACK:16777216") //for c++ Compiler #include <stdio.h> #include <iostream> #inc

POJ 1279 Art Gallery 半平面交+求多边形核的面积

裸的:半平面交+求多边形核的面积 Art Gallery Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 5735   Accepted: 2419 Description The art galleries of the new and very futuristic building of the Center for Balkan Cooperation have the form of polygons (not

POJ 1279 Art Gallery [半平面交]

Art Gallery Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 7324   Accepted: 2936 Description The art galleries of the new and very futuristic building of the Center for Balkan Cooperation have the form of polygons (not necessarily conve

poj 1279 -- Art Gallery (半平面交)

鏈接:http://poj.org/problem?id=1279 Art Gallery Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 5337   Accepted: 2277 Description The art galleries of the new and very futuristic building of the Center for Balkan Cooperation have the form

POJ 1279 Art Gallery(半平面交求多边形核的面积)

题目链接 题意 : 求一个多边形的核的面积. 思路 : 半平面交求多边形的核,然后在求面积即可. #include <stdio.h> #include <string.h> #include <iostream> #include <math.h> using namespace std ; struct node { double x; double y ; } p[1510],temp[1510],newp[1510];//p是最开始的多边形的每个点,

poj 1279 Art Gallery(利用极角计算半平面交)

题意:给出n个点的坐标描述一个多边形画廊.在画廊平面上找到一片表面,从该区域能够看到画廊墙壁上的每一个点: 思路:将这片表面称为多边形的核.核中一点与多边形边界上任意一点的连线都在多边形内部.凸多边形的核为其本身,凹多边形的核为其内部的一部分或不存在: 将多边形的n个顶点转化为n条边的直线方程:逆时针用多边形的边剖分多边形所在平面,保留向里的部分,舍去向外的部分,剩下的即为核: 利用叉积公式计算核面积,即为所求面积: #include<cstdio> #include<cstring&g

POJ 1279 Art Gallery 多边形内核面积

题目大意:按顺序给出一个多边形的顶点,求这个多边形内核的面积.答案保留两位输出. 思路:半平面交.加边的时候要讨论一下第一个点和最后一个点,否则会wa的很惨. CODE: #include <cmath> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define MAX 1510 #define EPS 1e-8 #define DC

poj 3384 Feng Shui 半平面交的应用 求最多覆盖凸多边形的面积的两个圆 的圆心坐标

题目来源: http://poj.org/problem?id=3384 分析: 用半平面交将多边形的每条边一起向"内"推进R,得到新的多边形(半平面交),然后求多边形的最远两点. 代码如下: const double EPS = 1e-10; const int Max_N = 105 ; struct Point{ double x,y; Point(){} Point(double x, double y):x(x),y(y){} Point operator - (Point

POJ 2451 nlog(n)半平面交裸题。

前言       最近学习C#,不过好在当初考计算机二级学习过C++,刚上手没有对C#感到很恐惧.C#视频也看了几天 了,总感觉不总结一下心里没底,现在跟着我从头走进C#之旅吧.     C#是以后总面向对象的编程语言(OOP),C#是从C和C++派生出来的,主要用于开发可以运行在.NET平台 上的应用程序.随着.NET的发展,C#语言简单.现代.面向对象和类型安全显示了一定的优势.     下面我就介绍一些初学者不太理解的一些东西.   C#有以下突出的特点       (1)语法简洁.不允许