程序应该找到两点的最小包围圈.

例子:

这两点的最小圆是圆心(1.5,1,5)和半径为0.71的圆.这只是图表上的一个表示:

以下是问题的解决方案:

#include <iostream>
#include <math.h>
#include <vector>
using namespace std;
const double INF = 1e18;
struct Point {
    double X, Y;
};
struct Circle {
    Point C;
    double R;
};
double dist(const Point& a, const Point& b)
{ return sqrt(pow(a.X - b.X, 2) + pow(a.Y - b.Y, 2)); }

int is_inside(const Circle& c, const Point& p)
{ return dist(c.C, p) <= c.R; }

Circle circle_from(const Point& A, const Point& B)
{
    Point C = { (A.X + B.X) / 2.0, (A.Y + B.Y) / 2.0 };
    return { C, dist(A, B) / 2.0 };
}

int is_valid_circle(const Circle& c, const vector<Point>& P)
{
    for (const Point& p : P)
        if (!is_inside(c, p)) return 0;
    return 1;
}

Circle minimum_enclosing_circle(const vector<Point>& P)
{
    int n = (int)P.size();
    if (n == 0)
        return { { 0, 0 }, 0 };
    if (n == 1)
        return { P[0], 0 };
    Circle mec = { { 0, 0 }, INF };
    for (int i = 0; i < n; i++) {
        for (int j = i + 1; j < n; j++) {
            Circle tmp = circle_from(P[i], P[j]);
            if (tmp.R < mec.R && is_valid_circle(tmp, P))
                mec = tmp;
        }
    }
    return mec;
}
int main() {
  Circle mec = minimum_enclosing_circle({
      {1, 1},
      {2, 2},
  });
  printf("(%.2f,%.2f) %.2f", mec.C.X, mec.C.Y, mec.R);
  return 0;
}
int main() {
  Circle mec = minimum_enclosing_circle({
      {1, 1},
      {2, 2},
  });
  printf("(%.2f,%.2f) %.2f", mec.C.X, mec.C.Y, mec.R);
  return 0;
}

这段代码的问题是使用向量进行计算.如果不使用向量和C数组,这怎么可能写呢?

推荐答案

c中的普通数组没有像size()这样的方法,在代码中,您需要用指针传递size参数,而不是vector::size()和->;它可以很好地工作

int is_valid_circle(const Circle c, const Point* P, size_t size)
{
    for(int i = 0; i < size ; i++)
    {
        if (!is_inside(c, P[i])) return 0;
    }

    return 1;
}

Circle minimum_enclosing_circle(const Point* P, size_t size)
{
    int n = size;
    if (n == 0)
        return { { 0, 0 }, 0 };
    if (n == 1)
        return { P[0], 0 };
    Circle mec = { { 0, 0 }, INF };
    for (int i = 0; i < n; i++) {
        for (int j = i + 1; j < n; j++) {
            Circle tmp = circle_from(P[i], P[j]);
            if (tmp.R < mec.R && is_valid_circle(tmp, P, size))
                mec = tmp;
        }
    }
    return mec;
}

测试时间:https://godbolt.org/z/xWTqfqxsn

C相关问答推荐

为什么 memcpy() 随机不复制正确的值?

为什么启用优化时 GCC 11 编译器会产生奇怪的输出?

Gnuplot 和 C - 绘制不同的符号/ colored颜色

在 C 中使用数组而不是向量

幂函数给出的答案与 C 中的 math.pow 函数不同

确定在嵌入式 C 中运行时使用哪个变量

在编译时构建静态数组

判断由大括号组成的输入字符串是否格式正确

通过默认网关地址的硬件地址而不是以太网多播地址发送多播

为什么 malloc() 被认为是库调用而不是系统调用?

为什么使用 MOV 指令将 XOR 交换优化为普通交换?