C案例:最小覆盖圆问题
Posted howard2005
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C案例:最小覆盖圆问题相关的知识,希望对你有一定的参考价值。
文章目录
一、提出任务 - 最小覆盖圆
(一)描述
- 给出平面上 N ( N ≤ 1 0 2 ) N(N\\le10^2) N(N≤102)个点。请求出一个半径最小的圆覆盖住所有的点。
(二)输入
- 第一行给出数字 N N N,接下来 N N N行,每行两个实数 x , y x,y x,y表示其坐标。其中, − 1 0 5 ≤ x , y ≤ 1 0 5 -10^5\\le x,y \\le 10^5 −105≤x,y≤105
(三)输出
- 第一行输出最小覆盖医的圆心
- 第二行输出半径
- 输出保留三位小数
(四)样例
输入
4
1 0
0 1
0 -1
-1 0
输出
0.000 0.000
1.000
二、完成任务
(一)编程思路
- 任意两点间距离的最大值就是最小覆盖圆的直径
- 距离最大值的两个点的中心就是最小覆盖圆的圆心
(二)编写代码,实现功能
- 在
C_WORK
目录里创建C程序 -最小覆盖圆.c
#include "stdio.h"
#include "math.h"
int main()
int n;
double distance, maxDistance = 0;
double cx = 0, cy = 0, r;
// 输入点数量
scanf("%d", &n);
// 声明点坐标数组
double x[n], y[n];
// 输入全部点的坐标
for (int i = 0; i < n; i++)
scanf("%lf %lf", &x[i], &y[i]);
// 求两点间最大距离
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
distance = sqrt(pow(x[i] - x[j], 2) + pow(y[i] - y[j], 2));
if (maxDistance < distance)
maxDistance = distance;
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
distance = sqrt(pow(x[i] - x[j], 2) + pow(y[i] - y[j], 2));
if (maxDistance == distance)
cx = (x[i] + x[j]) / 2; // 最小覆盖圆圆心横坐标
cy = (y[i] + y[j]) / 2; // 最小覆盖圆圆心纵坐标
break;
// 最小覆盖圆半径
r = maxDistance / 2;
4
// 输出最小覆盖圆圆心坐标
printf("%.3f %.3f\\n", cx, cy);
// 输出最小覆盖圆半径
printf("%.3f\\n", r);
return 0;
(三)运行程序,查看结果
- 输入4,与四个点坐标
以上是关于C案例:最小覆盖圆问题的主要内容,如果未能解决你的问题,请参考以下文章