问题 D: 【计算几何】Minimal Circle

本文介绍了一种求解点集覆盖最小圆的算法思路,通过动态调整圆心和半径,确保所有点被包含在圆内。算法首先确定一个初始圆,然后逐个检查新增点,如果该点位于圆外,则更新圆心和半径,直至所有点被覆盖。代码使用C++实现,包含了关键的数据结构定义、距离计算和圆心计算函数。

题目

参考博客

参考的楼上博主的思路,我重新理顺了一下思路,用我的话来表达,可能比较好理解 ,楼上博主的表述比较厉害(狗头保命

思路:假设我们在前 i 个点已经确定了一个圆,然后第 i+1个点在圆外面了,那么我们可以知道这个点和前i个点的距离比较远,则我们选择这个点作为圆的边界,然后在前i个点中再选一个点(与其距离最远,假设是第j个点),j和第i+1个点作为圆的直径(这样可以保证第j到第i+1个点全在则个圆内,画图易得),在前j-1个点中遍历,若还有点在圆外,则,和第j,i+1点三点做出一个圆,则这样所有点都在圆内了;

#include <iostream>
#include <cmath>
#include <cstdio>
#include <stdlib.h>
#include <ctime>
#include <algorithm>
#pragma GCC optimize("Ofast","inline","-ffast-math")
#pragma GCC target("avx,sse2,sse3,sse4,mmx")
using namespace std;
const double pi=acos(-1.0);
double r=0;
struct node
{
    double x,y;
}e[105],O;

inline double getdis(node a,node b)
{
    double x=a.x-b.x,y=a.y-b.y;
    return sqrt(x*x+y*y);
}

inline double workO(node p1,node p2,node p3)
{
    double x1=2*(p2.x-p1.x),y1=2*(p2.y-p1.y);
    double c1=p2.x*p2.x+p2.y*p2.y-p1.x*p1.x-p1.y*p1.y;
    double x2=2*(p3.x-p1.x),y2=2*(p3.y-p1.y);
    double c2=p3.x*p3.x+p3.y*p3.y-p1.x*p1.x-p1.y*p1.y;
    O.x=(y1*c2-y2*c1)/(y1*x2-y2*x1);
    O.y=(x2*c1-x1*c2)/(y1*x2-y2*x1);
    return getdis(O,p1);
}

int main()
{
    for(;;)
    {
        int n;cin>>n;
        if(n==0) break;
        for(int i=1;i<=n;i++)  scanf("%lf%lf",&e[i].x,&e[i].y);
        random_shuffle(e+1,e+n+1);
        O=e[1],r=0;
        for(int i=2;i<=n;i++)
        {
            if(getdis(O,e[i])>r)
            {
                O=e[i],r=0;
                for(int j=1;j<=i-1;j++)
                {
                    if(getdis(O,e[j])>r)
                    {
                        O.x=(e[i].x+e[j].x)/2;
                        O.y=(e[i].y+e[j].y)/2;
                        r=getdis(O,e[i]);
                        for(int k=1;k<=j-1;k++)
                        {
                            if(getdis(e[k],O)>r)
                            {
                                r=workO(e[i],e[j],e[k]);
                            }
                        }
                    }
                }
            }
        }
        printf("%.2lf %.2lf %.2lf\n",O.x,O.y,r);
    }
    return 0;
}

from maix import image, camera, display, app import cv2 import numpy as np # 实例化摄像头和显示对象 cam = camera.Camera(320, 240) disp = display.Display() # 创建形态学操作核 kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3)) def calculate_contour_center(contour): """使用轮廓矩计算精确中心点""" M = cv2.moments(contour) if M["m00"] > 0: return int(M["m10"]/M["m00"]), int(M["m01"]/M["m00"]) return None def draw_minimal_cross(image, center): """绘制小尺寸精密十字标记""" cx, cy = center # 十字线(长8px,宽1px) cv2.line(image, (cx-8, cy), (cx+8, cy), (0, 255, 255), 1) cv2.line(image, (cx, cy-8), (cx, cy+8), (0, 255, 255), 1) # 中心点(半径2px红色) cv2.circle(image, (cx, cy), 2, (0, 0, 255), -1) while not app.need_exit(): img = cam.read() img_raw = image.image2cv(img, copy=False) processed = img_raw.copy() # 图像预处理流程 gray = cv2.cvtColor(img_raw, cv2.COLOR_BGR2GRAY) blurred = cv2.GaussianBlur(gray, (5, 5), 0) edged = cv2.Canny(blurred, 50, 150) closed = cv2.morphologyEx(edged, cv2.MORPH_CLOSE, kernel) # 精确轮廓检测 contours, _ = cv2.findContours(closed, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 遍历前三大轮廓 for cnt in sorted(contours, key=cv2.contourArea, reverse=True)[:3]: # 多边形近似检测 peri = cv2.arcLength(cnt, True) approx = cv2.approxPolyDP(cnt, 0.015 * peri, True) # 仅处理四边形 if len(approx) == 4: # 精确中心计算 center = calculate_contour_center(cnt) if not center: continue # 绘制优化后的轮廓(青色细线) cv2.drawContours(processed, [approx], -1, (255, 255, 0), 1) # 绘制精密小十字 draw_minimal_cross(processed, center) # 显示坐标信息(小号字体) cv2.putText(processed, f"({center[0]},{center[1]})", (center[0]+10, center[1]-5), cv2.FONT_HERSHEY_SIMPLEX, 0.4, (255, 255, 0), 1) break # 找到第一个有效四边形后跳出循环 # 显示处理结果 img_show = image.cv2image(processed, copy=False) disp.show(img_show) 解释代码内容
08-01
MATLAB主动噪声和振动控制算法——对较大的次级路径变化具有鲁棒性内容概要:本文主要介绍了一种在MATLAB环境下实现的主动噪声和振动控制算法,该算法针对较大的次级路径变化具有较强的鲁棒性。文中详细阐述了算法的设计原理与实现方法,重点解决了传统控制系统中因次级路径动态变化导致性能下降的问题。通过引入自适应机制和鲁棒控制策略,提升了系统在复杂环境下的稳定性和控制精度,适用于需要高精度噪声与振动抑制的实际工程场景。此外,文档还列举了多个MATLAB仿真实例及相关科研技术服务内容,涵盖信号处理、智能优化、机器学习等多个交叉领域。; 适合人群:具备一定MATLAB编程基础和控制系统理论知识的科研人员及工程技术人员,尤其适合从事噪声与振动控制、信号处理、自动化等相关领域的研究生和工程师。; 使用场景及目标:①应用于汽车、航空航天、精密仪器等对噪声和振动敏感的工业领域;②用于提升现有主动控制系统对参数变化的适应能力;③为相关科研项目提供算法验证与仿真平台支持; 阅读建议:建议读者结合提供的MATLAB代码进行仿真实验,深入理解算法在不同次级路径条件下的响应特性,并可通过调整控制参数进一步探究其鲁棒性边界。同时可参考文档中列出的相关技术案例拓展应用场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值