ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

【计算几何】最小圆覆盖

2021-03-08 02:32:06  阅读:199  来源: 互联网

标签:覆盖 Point int double 最小 cc distTo 几何 Circle


期望复杂度 \(O(n)\)

const double PI = acos(-1.0);
const double EPS = 1e-10;

double sqr(double x) {
    return x * x;
}

struct Point {
    double x, y;
};

struct Circle {
    double x, y, r;
    double distTo(Point a) {
        return sqrt(sqr(x - a.x) + sqr(y - a.y));
    }
};

Circle getCircleFromTriangle(Point &a, Point &b, Point &c) {
    double A1 = a.x - b.x, B1 = a.y - b.y;
    double A2 = c.x - b.x, B2 = c.y - b.y;
    double C1 = (a.x * a.x - b.x * b.x + a.y * a.y - b.y * b.y) / 2;
    double C2 = (c.x * c.x - b.x * b.x + c.y * c.y - b.y * b.y) / 2;
    Circle cc;
    cc.x = (C1 * B2 - C2 * B1) / (A1 * B2 - A2 * B1);
    cc.y = (A1 * C2 - A2 * C1) / (A1 * B2 - A2 * B1);
    cc.r = cc.distTo(a);
    return cc;
}

Circle getMinCoverCircle(Point p[], int n) {
    srand(time(0));
    random_shuffle(p + 1, p + 1 + n);
    Circle c;
    c.x = p[1].x; c.y = p[1].y; c.r = 0;
    for (int i = 2; i <= n; ++i) {
        if (c.distTo(p[i]) >= c.r + EPS) {
            c.x = p[i].x, c.y = p[i].y, c.r = 0;
            for (int j = 1; j < i; ++j)
                if (c.distTo(p[j]) >= c.r + EPS) {
                    c.x = (p[i].x + p[j].x) / 2;
                    c.y = (p[i].y + p[j].y) / 2;
                    c.r = c.distTo(p[i]);
                    for (int k = 1; k < j; ++k)
                        if (c.distTo(p[k]) >= c.r + EPS)
                            c = getCircleFromTriangle(p[i], p[j], p[k]);
                }
        }
    }
    return c;
}

const int MAXN = 1e5 + 10;

int n;
Point p[MAXN];

void solve() {
    scanf("%d", &n);
    for (int i = 1; i <= n; ++i)
        scanf("%lf%lf", &p[i].x, &p[i].y);
    Circle c = getMinCoverCircle(p, n);
    printf("%.8f\n%.8f %.8f\n", c.r, c.x, c.y);
}

标签:覆盖,Point,int,double,最小,cc,distTo,几何,Circle
来源: https://www.cnblogs.com/purinliang/p/14497687.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有