版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Kangyucheng/article/details/82736308
给定两个圆的圆心和半径,计算能够包含两个圆的最小圆
# Defines two classes, Point() and Disk().
# The latter has an "area" attribute and three methods:
# - change_radius(r)
# - intersects(disk), that returns True or False depending on whether
# the disk provided as argument intersects the disk object.
# - absorb(disk), that returns a new disk object that represents the smallest
# disk that contains both the disk provided as argument and the disk object.
#
# Written by kangyucheng
from math import pi, hypot
class Point:
def __init__(self, x = 0, y = 0):
self.x = x
self.y = y
def __repr__(self):
return f'Point({self.x:.2f}, {self.y:.2f})'
class Disk:
area = 0.00
r = 0.00
centre = Point()
def __init__(self, **kwargs):
radius = kwargs.get("radius")
centre = kwargs.get("centre")
if radius is not None:
self.area = radius * radius * pi
self.r = radius
if centre is not None:
self.centre = centre
def change_radius(self,r):
self.r = r
self.area = r * r * pi
def intersects(self, disk):
l = self.r + disk.r
x = self.centre.x - disk.centre.x
y = self.centre.y - disk.centre.y
d = hypot(x,y)
if d <= l:
return True
else:
return False
def absorb(self, disk):
x = 0.00 # 新圆的圆心 x
y = 0.00 # 新圆的圆心 y
r = 0.00 # 新圆的半径 r
d = hypot(self.centre.x - disk.centre.x, self.centre.y - disk.centre.y) # 两圆的圆心距离
if d < max(self.r, disk.r) - min(self.r, disk.r): # 大圆包含小圆
if self.r > disk.r:
r = self.r
x = self.centre.x
y = self.centre.y
else:
r = disk.r
x = disk.centre.x
y = disk.centre.y
else: # 两圆不互相包含
r = (self.r + disk.r + d) / 2.00
d1 = r-self.r
d2 = r-disk.r
x = self.centre.x-d1*(self.centre.x-disk.centre.x)/(d1+d2)
y = self.centre.y-d1*(self.centre.y-disk.centre.y)/(d1+d2)
return Disk(centre = Point(x, y), radius = r )
def __repr__(self):
return f'Disk({self.centre}, {self.r:.2f})'
#测试
# disk_1 = Disk()
# print(disk_1.area)
# disk_2 = Disk(centre = Point(3, 0), radius = 4)
# print(disk_2.area)
# print(disk_1.intersects(disk_2))
# print( disk_2.intersects(disk_1) )
# disk_1.change_radius(2)
# disk_4 = Disk(centre=Point(-4, 0), radius=2)
# print(disk_4.intersects(disk_1))
# disk_5 = disk_4.absorb(disk_1)
# disk_5.change_radius(5)
# print(disk_5)
# disk_6 = Disk(centre = Point(1, 2), radius = 6)
# disk_7 = disk_5.absorb(disk_6)
# print(disk_7.area )
# disk_8 = Disk()
# disk_8.change_radius(7)