JOJ 1984: A Round Peg in a Ground Hole (判断点在凸多边形内)
来源:互联网 发布:winpe 加载网络 编辑:程序博客网 时间:2024/05/21 06:45
之前的代码,整理一下,计算几何已经被我忘差不多了 。。。
#include<iostream>#include<cstdio>#include<cmath>const double pi=acos(-1.0);const double eps = 1e-8;const int maxn=1000;struct point{ double x,y; point operator-(point p) { point res; res.x = x - p.x; res.y = y - p.y; return res; }};struct circle{ point c; double r;};double dis(point p1, point p2){ point p3 = p2 - p1; return sqrt(p3.x * p3.x + p3.y * p3.y);}double multi(point p1, point p2){ return p1.x * p2.y - p1.y * p2.x;}void ChangeDir(point p[], int n){ point tmp; for(int i = 0;i < n / 2;i++) { tmp = p[i]; p[i] = p[n - i - 1]; p[n - i - 1] = tmp; }}double AreaOfPloy(point p[], int n){ double area = 0.0; for(int i = 0;i < n;i++) area += multi(p[i], p[i + 1]); return area / 2;}double AreaOfThree(point p1, point p2, point p3){ return fabs(multi(p2 - p1, p3 - p1)) / 2;}void OutPoint(point q){ printf("(%.2lf %.2lf) ", q.x, q.y);}int IsConvex(point p[], int n){ /* 判断是否凸多边形 */ for(int i = 1;i <= n;i++) if(multi(p[i % n] - p[i - 1], p[(i + 1) % n] - p[i % n]) < 0) return 0; return 1;}int IsInConvex(point p[], int n, point q) /* 点是否在凸多边形内 */{ double area = 0.0; for(int i = 0;i < n;i++) area += AreaOfThree(q, p[i], p[i + 1]); if(fabs(area - fabs(AreaOfPloy(p, n))) < eps) return 1; return 0;}double min(double a, double b){ return a < b ? a : b;}double disPointToSeg(point p1, point p2, point p3){ double a = dis(p1, p2); double b = dis(p1, p3); double c = dis(p2, p3); if(fabs(a + b - c) < eps) return 0; if(fabs(a + c - b) < eps || fabs(b + c - a) < eps) return min(a, b); double t1 = -a * a + b * b + c * c; double t2 = a * a - b * b + c * c; if(t1 <= 0 || t2 <= 0) return min(a, b); double l = (a + b + c) / 2; double s = sqrt(l * (l - a) * (l - b) * (l - c)); return 2 * s / c;}int main(){ //freopen("pD1.in", "r", stdin); //freopen("outbie.out", "w", stdout); int n; circle peg; point p[1000]; while(scanf("%d", &n) != EOF) { if(n < 3) break; scanf("%lf%lf%lf", &peg.r, &peg.c.x, &peg.c.y); for(int i = 0;i < n;i++) scanf("%lf%lf", &p[i].x, &p[i].y); p[n] = p[0]; if(AreaOfPloy(p, n) < 0) ChangeDir(p, n); p[n] = p[0]; if(!IsConvex(p, n)) { printf("HOLE IS ILL-FORMED\n"); continue; } if(!IsInConvex(p, n, peg.c)) { printf("PEG WILL NOT FIT\n"); continue; } int success = 1; for(int i = 0;i < n;i++) if(disPointToSeg(peg.c, p[i], p[i + 1]) < peg.r) { success = 0; printf("PEG WILL NOT FIT\n"); break; } if(success == 1) printf("PEG WILL FIT\n"); } return 0;}
- JOJ 1984: A Round Peg in a Ground Hole (判断点在凸多边形内)
- poj 1584 A Round Peg in a Ground Hole(判断凸多边形+圆是否在凸多边形内)
- poj_1584 A Round Peg in a Ground Hole(凸包判断凸多边形+判断点在多边形内)
- A Round Peg in a Ground Hole(POJ1584点在多边形内+是否为凸多边形)
- POJ1584 A Round Peg in a Ground Hole 判断多边形是否为凸多边形,判断凸多边形是否在圆内
- POJ 1584 A Round Peg in a Ground Hole(判断凸多边形,判断圆是否在凸多边形内)
- poj 1584 A Round Peg in a Ground Hole 判断多边形是否为凸多边形 + 圆心是否在凸多边形内 + 圆是否在凸多边形内部
- POJ 1584:A Round Peg in a Ground Hole _判断点是否在多边形内(5种方法)
- POJ 1584 A Round Peg in a Ground Hole(判断凸多边形,点到线段最短距离)
- POJ 1584 A Round Peg in a Ground Hole(凸多边形判断+点与多边形的位置关系)
- poj1584 A Round Peg in a Ground Hole 凸多边形判断 和多边形与圆的位置
- POJ 1584 A Round Peg in a Ground Hole (判断凸多边形模板)
- A Round Peg in a Ground Hole
- poj1584A Round Peg in a Ground Hole
- POJ-1584-A Round Peg in a Ground Hole-计算几何-凸多边形+多边形包含圆
- POJ A Round Peg in a Ground Hole <凸包判断以及点与多边形的相对位置>
- poj1584--A Round Peg in a Ground Hole(判断凸包,并且判断圆是否在凸包内)
- POJ 1584 A Round Peg in a Ground Hole (凸包的判断+点在凸包+圆在凸包内)
- 堆和栈的区别
- cocos2d-x开发游戏时,使用Texture packer来合并图片
- android 浏览器插件开发 - 插件库
- Gartner:2011年十大战略性IT技术
- atol实现
- JOJ 1984: A Round Peg in a Ground Hole (判断点在凸多边形内)
- 关于BitmapData画图方法效率的测试和对比
- linux学习笔记(二) linux下发布tomcat应用程序
- Xtreme.Toolkit.Pro v11.2.1汉化方法
- 非递归方式遍历目录及其子目录的文件
- Android---AlarmManager(全局定时器/闹钟)指定时长或以周期形式执行某项操作
- QTP9.2破解方法
- UltraEdit search and replace
- Make sure Drupal file types are recognized as PHP files