最小圆覆盖
来源:互联网 发布:ubuntu 17.10 qq 编辑:程序博客网 时间:2024/05/05 02:00
代码如下:
#include <iostream>#include <stdio.h>#include <math.h>using namespace std;const int N = 1005;struct node{double x, y;}p[N];node center; //圆心 double radius; //半径double dis(node s, node t){return sqrt((s.x-t.x)*(s.x-t.x)+(s.y-t.y)*(s.y-t.y));}double multi(node p1, node p2, node p0) //判断是否是钝角{return (p1.x-p0.x)*(p2.y-p0.y) - (p1.y-p0.y)*(p2.x-p0.x);}void getthirdp(node p1, node p2, int n){center.x = (p1.x+p2.x)/2.0;center.y = (p1.y+p2.y)/2.0;radius = dis(p1, p2)/2.0;int k;double c1,c2;for(k=1;k<=n;k++){if(dis(center, p[k]) <= radius)continue;if(multi(p1, p2, p[k]) != 0.0) //如果不是钝角{c1 = (p1.x*p1.x+p1.y*p1.y-p2.x*p2.x-p2.y*p2.y)/2.0;c2 = (p1.x*p1.x+p1.y*p1.y-p[k].x*p[k].x-p[k].y*p[k].y)/2.0;center.x=(c1*(p1.y-p[k].y)-c2*(p1.y-p2.y))/((p1.x-p2.x)*(p1.y-p[k].y)-(p1.x-p[k].x)*(p1.y-p2.y));center.y=(c1*(p1.x-p[k].x)-c2*(p1.x-p2.x))/((p1.y-p2.y)*(p1.x-p[k].x)-(p1.y-p[k].y)*(p1.x-p2.x));radius = dis(center,p[k]);}else //是钝角{double a, b, c;a = dis(p1, p2);b = dis(p1, p[k]);c = dis(p2, p[k]);if(a >= b && a >= c){center.x = (p1.x+p2.x)/2.0;center.y = (p1.y+p2.y)/2.0;radius = a/2.0;}else if(b >= a && b >= c){center.x = (p1.x+p[k].x)/2.0;center.y = (p1.y+p[k].y)/2.0;radius = b/2.0;}else{center.x = (p2.x+p[k].x)/2.0;center.y = (p2.y+p[k].y)/2.0;radius = c/2.0;}}}}void getsecondp(node p1, int n) {center.x = (p1.x+p[1].x)/2.0;center.y = (p1.y+p[1].y)/2.0;radius = dis(p1, p[1])/2.0;for(int i = 2; i <= n; i ++)if(dis(p[i],center) > radius) getthirdp(p1, p[i], i-1);}int main(){int i, j, n;while(scanf("%d", &n) && n){for(i = 1; i <= n; i ++)scanf("%lf%lf", &p[i].x, &p[i].y);if(n == 1){printf("%.2lf %.2lf 0.00\n", p[1].x, p[1].y);continue;}radius = dis(p[1], p[2])/2.0;center.x = (p[1].x+p[2].x)/2.0;center.y = (p[1].y+p[2].y)/2.0;for(i = 3; i <= n; i ++)if(dis(center, p[i]) > radius)getsecondp(p[i], i-1);printf("%.2lf %.2lf %.2lf\n", center.x, center.y, radius);}return 0;}
- 最小圆覆盖
- 最小圆覆盖
- 最小圆覆盖
- 最小圆覆盖
- 最小圆覆盖
- 最小圆覆盖
- 最小圆覆盖问题
- 最小圆覆盖
- 最小圆覆盖
- 最小圆覆盖算法
- 最小圆覆盖问题
- [BZOJ1337]最小圆覆盖(最小圆覆盖)
- bzoj 1337: 最小圆覆盖 (最小圆覆盖)
- [BZOJ1336][Balkan2002]Alien最小圆覆盖(最小圆覆盖)
- bzoj1336: [Balkan2002]Alien最小圆覆盖&&1337: 最小圆覆盖
- hdu3007 zoj1450最小圆覆盖
- HDU 3007 最小圆覆盖
- 最小圆覆盖模板(zoj1450)
- 绘制矩形(方法一)
- NSPredicate的用法
- AsyncSocket详解
- Windows下Resin的配置与部署(可用版)
- 简单安装NFS流程
- 最小圆覆盖
- 作业4
- 如何读取配置文件数据
- 页游项目开发中的一些经验和教训
- Unity3D NotificationCenter
- 绘制矩形(方法二、空心的)
- TI 6678第四天 关于执行 .out文件
- TI 6678第三天 低版本工程导入高版本时候
- iOS 5与iOS 6的 low-memory 处理