python计算能够包含两个圆的最小圆

版权声明:本文为博主原创文章,未经博主允许不得转载。 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)

猜你喜欢

转载自blog.csdn.net/Kangyucheng/article/details/82736308