题目传送门

题意:一个多边形,A点和B点,满足PB <= k * PA的P的范围与多边形的公共面积。

分析:这是个阿波罗尼斯圆。既然是圆,那么设圆的一般方程:(x + D/2) ^ 2 + (y + E/2) ^ 2 = (D ^ 2 + E ^ 2 - 4 * F)  / 4,通过PB == PA * k解方程来求解圆心以及半径。然后就是套模板啦,上海交大的红书。

#include <bits/stdc++.h>
using namespace std;#define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1 | 1
typedef long long ll;
const int N = 5e2 + 10;
const int INF = 0x3f3f3f3f;
const int MOD = 1e9 + 7;
const double EPS = 1e-10;
const double PI = acos (-1.0);int dcmp(double x)  {if (fabs (x) < EPS)   return 0;else    return x < 0 ? -1 : 1;
}
struct Point    {double x, y;Point ()    {}Point (double x, double y) : x (x), y (y) {}Point operator + (const Point &r) const {       //向量加法return Point (x + r.x, y + r.y);}Point operator - (const Point &r) const {return Point (x - r.x, y - r.y);}Point operator * (double p) const {       //向量乘以标量return Point (x * p, y * p);}Point operator / (double p) const {       //向量除以标量return Point (x / p, y / p);}bool operator < (const Point &r) const  {return x < r.x || (x == r.x && y < r.y);}bool operator == (const Point &r) const {return dcmp (x - r.x) == 0 && dcmp (y - r.y) == 0;}
};
typedef Point Vector;
Point read_point(void)  {double x, y;    scanf ("%lf%lf", &x, &y);return Point (x, y);
}
double polar_angle(Vector V)    {return atan2 (V.y, V.x);
}
double dot(Point a, Point b)    {return a.x * b.x + a.y * b.y;
}
double cross(Point a, Point b)  {return a.x * b.y - a.y * b.x;
}
double length(Vector V) {return sqrt (dot (V, V));
}
double my_sqrt(double x)    {return sqrt (max (0.0, x));
}Point ps[N];
double r, k;
double x1, _y1, x2, _y2;
int n;double sqr(double x)    {return x * x;
}struct  Line    {Point p;Vector v;double r;Line () {}Line (const Point &p, const Vector &v) : p (p), v (v) {r = polar_angle (v);}Point point(double a)   {return p + v * a;}
};struct Circle   {Point c;double r;Circle () {}Circle (Point c, double r) : c (c), r (r) {}Point point(double a)   {return Point (c.x + cos (a) * r, c.y + sin (a) * r);}
};int line_cir_inter(Line L, Circle C, double &t1, double &t2, vector<Point> &P)    {double a = L.v.x, b = L.p.x - C.c.x, c = L.v.y, d = L.p.y - C.c.y;double e = a * a + c * c, f = 2 * (a * b + c * d), g = b * b + d * d - C.r * C.r;double delta = f * f - 4 * e * g;if (dcmp (delta) < 0)   return 0;if (dcmp (delta) == 0)  {t1 = t2 = -f / (2 * e); P.push_back (L.point (t1));return 1;}t1 = (-f - sqrt (delta)) / (2 * e);t2 = (-f + sqrt (delta)) / (2 * e);if (t1 > t2)    swap (t1, t2);if (dcmp (t1) > 0 && dcmp (t1 - 1) < 0) P.push_back (L.point (t1));if (dcmp (t2) > 0 && dcmp (t2 - 1) < 0) P.push_back (L.point (t2));return (int) P.size ();
}double sector_area(Point a, Point b)    {double theta = polar_angle (a) - polar_angle (b);while (dcmp (theta) <= 0)   theta += 2 * PI;while (theta > 2 * PI)  theta -= 2 * PI;theta = min (theta, 2 * PI - theta);return r * r * theta / 2;
}double cal(Point a, Point b)    {double t1, t2;bool ina = dcmp (length (a) - r) < 0;bool inb = dcmp (length (b) - r) < 0;if (ina && inb) return fabs (cross (a, b)) / 2.0;vector<Point> p;int num = line_cir_inter (Line (a, b - a), Circle (Point (0, 0), r), t1, t2, p);if (ina)    return sector_area (b, p[0]) + fabs (cross (a, p[0])) / 2.0;if (inb)    return sector_area (p[0], a) + fabs (cross (p[0], b)) / 2.0;if (num == 2)   return sector_area (a, p[0]) + sector_area (p[1], b) + fabs (cross (p[0], p[1])) / 2.0;return sector_area (a, b);
}double cir_poly_area()  {double ret = 0;for (int i=0; i<n; ++i) {int sgn = dcmp (cross (ps[i], ps[i+1]));if (sgn != 0)   {ret += sgn * cal (ps[i], ps[i+1]);}}return ret;
}void init(void) {double D = (2 * x2 - 2 * sqr (k) * x1) / (1 - sqr (k));double E = (2 * _y2 - 2 * sqr (k) * _y1) / (1 - sqr (k));double F = (sqr (k*x1)+sqr (k*_y1)-sqr (x2)-sqr(_y2)) / (1 - sqr (k));double x0 = D / 2, y0 = E / 2;r = sqrt (F + sqr (D)/4 + sqr (E)/4);for (int i=0; i<n; ++i) {ps[i].x -= x0;  ps[i].y -= y0;}ps[n] = ps[0];
}int main(void)    {int cas = 0;while (scanf ("%d%lf", &n, &k) == 2)    {for (int i=0; i<n; ++i) {ps[i] = read_point ();}scanf ("%lf%lf", &x1, &_y1);scanf ("%lf%lf", &x2, &_y2);init ();printf ("Case %d: %.10f\n", ++cas, fabs (cir_poly_area ()));}//cout << "Time elapsed: " << 1.0 * clock() / CLOCKS_PER_SEC << " s.\n";return 0;
}

  

转载于:https://www.cnblogs.com/Running-Time/p/4949990.html

简单几何(圆与多边形公共面积) UVALive 7072 Signal Interference (14广州D)相关推荐

  1. 牛客网暑期ACM多校训练营(第三场) J Distance to Work 计算几何求圆与多边形相交面积模板...

    链接:https://www.nowcoder.com/acm/contest/141/J 来源:牛客网 Eddy has graduated from college. Currently, he ...

  2. [几何] 计算任意多边形的面积、中心、重心

    最近项目用到:在不规则任意多边形的中心点加一个图标.(e.g: xx地区发生暴雪,暴雪区域是多边形,给多边形中心加一个暴雪的图标) 之前的设计是,计算不规则多边形范围矩形bounds的中心点.这个比较 ...

  3. [hihoCoder1231 2015BeijingOnline]求圆与多边形公共部分的周长

    题意:如题 思路:离散.将所有交点求出来,相当于将多变形的边切成了很多条元边,对每条元边,有两种情况 在圆内,答案加上此边长 在圆外,答案加上此边相对于圆心的"有向转弧" #inc ...

  4. 转:求多边形的面积 算法几何

    我还是简单解释一下,如果是没有读过高等数学的朋友,也让你大致明白. 定积分的本质是求和,计算f(x)在积分区间[a,b]上的一个和S,首先把积分区间分成n份,这样的分法记为λ,记Δ(λ)=max{Δx ...

  5. c#圆的周长和面积面向对象_初遇C#:一个简单的小程序(圆形周长,面积计算器)...

    作为一个面向对象的语言,与用户的交互很关键! 在此,我们可以先分析一下我们这个小程序要与用户交互的内容: 1.命名很重要,让用户看见这个程序就知道这个程序的作用. 2.当用户打开这个程序时,提示用户输 ...

  6. 2021牛客暑期多校训练营2 F Girlfriend (阿波罗尼斯圆+简单几何)

    F Girlfriend (阿波罗尼斯球+简单几何) 题目大意: 给定四个点,每两个点构成一个阿波罗尼斯球,求两圆相交部分的体积. 思路: 一看就是几何题啊,话不多说直接开淦... 首先对于阿波罗尼斯 ...

  7. 简单的C++程序求圆的周长和面积

    C++程序求圆的周长和面积 求圆的周长和面积 方法1:用结构化方法编程,求圆的周长和面积 方法2:用面向对象方法编程,求圆的周长和面积 初学者易犯错误模型 求圆的周长和面积 数据描述: 半径,周长,面 ...

  8. python画三维几何图-Python下opencv使用笔记(二)(简单几何图像绘制)

    简单几何图像一般包含点.直线.矩阵.圆.椭圆.多边形等等.首先认识一下opencv对像素点的定义. 图像的一个像素点有1或者3个值.对灰度图像有一个灰度值,对彩色图像有3个值组成一个像素值.他们表现出 ...

  9. 两个凸多边形的公共面积

    如何求两个矩形的公共面积? 看到这个问题,首先应该打破思维定式,不要觉得两个矩形一定是终归中规中矩地放着,很有可能是斜着放的. 如果把矩形当成正着放,那么这个问题比:如何求两个三角形公共面积还要简单. ...

最新文章

  1. 分享:Arcadia 0.12.1 发布,Ruby 集成开发环境
  2. 用C语言解“两个数的简单计算器”题
  3. ISA2006标准版配置导入企业版
  4. 深度解析JAVA动态代理设计模式
  5. nyoj 174 Max Sequence(最大子串和变形)
  6. Windows下载、安装、卸载Redis
  7. 小米oj 有多少个公差为2的等差数列
  8. 【Linux】一步一步学Linux——id命令(94)
  9. 27岁姑娘,去世前一天,留给世界这封信,看哭众多网友
  10. python cms api_python3 获取阿里云OSS 最新存储容量 SDK API
  11. map和foreach的区别和应用场景_面试官:说说UDP和TCP的区别及应用场景
  12. 用C语言实现计算器功能
  13. Linux自学之旅-基础命令(一)
  14. git Tower 操作记录
  15. 计算机英语摘要,跪求计算机论文摘要英文翻译
  16. ET服务器框架——部署与运维笔记(一)
  17. java中 成员变量和属性的区别
  18. DeepFool公式理解
  19. 5W2H 分析法
  20. 解决Linux命令行前出现base

热门文章

  1. 使用Python内置浏览器缓存cookies并做更新
  2. Linux的DNS高速缓存
  3. SQL数据库连接语句
  4. HTML5的input color系统颜色选择器
  5. NFS服务启动:rpc.nfsd: writing fd to kernel failed: errno 111 (Connection refused)
  6. 基于Adobe LCDS产品的数据访问解决方案Part4
  7. ios设计规范(下)
  8. linux每日命令(1):which
  9. Ubuntu安装JDK,搭建java环境
  10. 闰年的判断方法_练习题079:如何判断某年为闰年