首页 > 编程语言 >【计算几何】Python求解覆盖N个点的最小圆

【计算几何】Python求解覆盖N个点的最小圆

时间:2023-05-14 16:34:12浏览次数:38  
标签:shuffled 求解 Python inside continue points enumerate circle 个点

目录

题目地址

https://ac.nowcoder.com/acm/contest/52826/D

代码

import sys
import math

def euclidean_distance(p1, p2):
    return math.sqrt((p1[0] - p2[0]) ** 2 + (p1[1] - p2[1]) ** 2)

def make_circle(points):
    shuffled = list(points)
    circle = (0, 0, 0)
    for i, p in enumerate(shuffled):
        if is_inside_circle(circle, p):
            continue
        circle = (p[0], p[1], 0)
        for j, q in enumerate(shuffled[:i]):
            if is_inside_circle(circle, q):
                continue
            circle = ((p[0] + q[0]) / 2, (p[1] + q[1]) / 2, euclidean_distance(p, q) / 2)
            for k, r in enumerate(shuffled[:j]):
                if is_inside_circle(circle, r):
                    continue
                circle = make_circumcircle(p, q, r)
    return circle

def is_inside_circle(circle, point):
    center, radius = (circle[0], circle[1]), circle[2]
    return euclidean_distance(center, point) <= radius

def make_circumcircle(p1, p2, p3):
    d = 2 * (p1[0] * (p2[1] - p3[1]) + p2[0] * (p3[1] - p1[1]) + p3[0] * (p1[1] - p2[1]))
    ux = ((p1[0] ** 2 + p1[1] ** 2) * (p2[1] - p3[1]) + (p2[0] ** 2 + p2[1] ** 2) * (p3[1] - p1[1]) + (p3[0] ** 2 + p3[1] ** 2) * (p1[1] - p2[1])) / d
    uy = ((p1[0] ** 2 + p1[1] ** 2) * (p3[0] - p2[0]) + (p2[0] ** 2 + p2[1] ** 2) * (p1[0] - p3[0]) + (p3[0] ** 2 + p3[1] ** 2) * (p2[0] - p1[0])) / d
    r = euclidean_distance((ux, uy), p1)
    return (ux, uy, r)

def main():
    N = int(input().strip())
    points = [tuple(map(float, input().strip().split())) for _ in range(N)]

    circle = make_circle(points)
    print("{:.10f}".format(circle[2]))
    print("{:.10f} {:.10f}".format(circle[0], circle[1]))

if __name__ == "__main__":
    main()

Prompt

Given N points, let's draw the smallest circle that contains all the points.

python code

input
6
8.0 9.0
4.0 7.5
1.0 2.0
5.1 8.7
9.0 2.0
4.5 1.0

output
5.0000000000
5.0000000000 5.0000000000

标签:shuffled,求解,Python,inside,continue,points,enumerate,circle,个点
From: https://www.cnblogs.com/yhm138/p/17297127.html

相关文章

  • MATLAB代码:粒子群算法求解 IEEE 33bus最优潮流模型 关键词:粒子
    MATLAB代码:粒子群算法求解IEEE33bus最优潮流模型关键词:粒子群算法PSO最优潮流牛顿迭代仿真平台:MATLAB主要内容:这是一个用粒子群来解IEEE33的最优潮流模型,潮流模型是用牛顿迭代法写的模型包含了柴油机,储能,以及和上一级电网的交易,出图效果好。ID:6449681890419665......
  • Python代码:微网-预测+调度(多种预测算法以及强化学习调度算法)
    Python代码:微网-预测+调度(多种预测算法以及强化学习调度算法)关键词:光伏/负荷预测强化学习LSTM优化调度微网模型预测控制参考文档:《EnergyManagement和EconomicEvaluationofGrid-ConnectedMicrogridOperation》复现仿真平台:Python主要内容:该项目的目标是探索并网微......
  • python常用的时间模块之datetime模块
    一、基本类型1、date类datetime.date(2023,5,1) 2、time类datetime.time(12,20,20,10) 3、datetime类datetime.datetime(2023,5,1,12,20,20,10) 4、timedelta类datetime.timedelta(weeks=1,days=1,hours=1,minutes=1,seconds=1,microseconds=1)提......
  • Python学习之八_调用Outlook发送邮件以及调用远程windows上面的python
    Python学习之八_调用Outlook发送邮件以及调用远程windows上面的python摘要之前只有一个需求是发送加密邮件.之前一直是使用linux进行发送.但是总是无法发送加密邮件.最近学习python,发现可以使用python来调用outlook来发送邮件.这样就比较简单了.可以直接使用outlook的......
  • python安全攻防学习笔记一 语言基础篇
    1.列表python中创建一个列表,只要把逗号分隔的不同的数据项使用方括号括起来即可。如:l1=["你好",0,1,2,3,4,5,6,7,8,9,0]l2=["嘟嘟嘟嘟嘟","雪球来了"]列表中的数据可以进行增删改查,方法有:dell1[1]#删除指定的数据l1.append("我不好")#在末尾添加数据......
  • Python组合数据类型
    本文转自:https://www.cnblogs.com/skynet/archive/2013/05/06/3063245.html一、  String:字符串放在单引号、双引号、三引号(多行时)中,从0开始索引,支持n  查:find、index、n  切片: s[0:2]、s[1:]n  连接:“abc”+“ef”=>“abcdef”、joinn  分割:splitn  格式化: ......
  • 如何使用Python实现二分查找算法
    二分查找算法是一种常用的搜索算法,其时间复杂度为O(logn),可以快速地从有序数组中找出目标元素。在本篇文章中,我们将学习如何使用Python实现二分查找算法。二分查找算法的原理很简单:首先确定数组的中间位置,然后将目标元素与中间元素进行比较。如果目标元素小于中间元素,则在数组的左......
  • Python学习之七_input和print
    Python学习之七_input和print摘要python3之后函数必须带()了因为我开始学习的比较晚,所以准备Python3开始学起前面主要是模仿别人的代码进行学习后续慢慢学习使用python调用ebpf等内容.这里简单先总结一下input和print的函数.作为一个学习总结print和inputprint......
  • python常用的模块值时间模块-time
    一、在python中,通常有以下几种方式来表达时间1、时间戳,比如1684036783.6709572、格式化字符串,比如2023-05-05/14/2311:58:363、元组,比如time.struct_time(tm_year=2023,tm_mon=5,tm_mday=14,tm_hour=11,tm_min=59,tm_sec=43,tm_wday=6,tm_yday=134,tm_isdst=0) 二......
  • 常见问题解决 --- python必备技能 换源
    源是什么源是编程开发或则是操作系统要使用的第三方依赖软件应用市场,源又从何而来,其实源来自其他的源的克隆,或者是源提供者自己收集,编译,又或者作者的上传为什么要换源这些源往往都在国外,国内以为你懂的原因无法直接访问或者特别慢怎么换Windows下python永久换源方式有两种:修......