Python使用Point、Line、Circle类计算两圆距离出现ValueError报错如何解决

代码问题分析
- 运算符使用错误:Python 中
^是按位异或运算符,并非求平方运算符,需使用**2表示平方。异或运算可能生成负数,math.sqrt()对负数执行开平方操作就会触发ValueError: math domain error报错。 - 半径计算逻辑错误:计算r1时第二项写为
self.l1.p2.x-self.l1.p2.x,结果恒为0,还遗漏了y坐标的差值计算;计算r2时仅使用y坐标差值计算,完全忽略x坐标,计算结果不是两点之间的实际距离。 - 类设计不符合要求:题目要求创建
Circle类,你的实现类名是小写的circle,且Circle类的初始化逻辑不合理,一个Circle实例应对应单个圆的属性,你将两个圆的半径线段都存入同一个Circle实例,设计逻辑混乱。
优化实现
优化后的代码严格遵循题目要求,保留Point、Line、Circle三个类,在Circle类中完成两圆距离计算:
import math class Point: def __init__(self, x, y): self.x = x self.y = y class Line: def __init__(self, p1, p2): self.p1 = p1 self.p2 = p2 # 封装线段长度计算逻辑,提升复用性 def get_length(self): diff_x = self.p1.x - self.p2.x diff_y = self.p1.y - self.p2.y return math.sqrt(diff_x ** 2 + diff_y ** 2) class Circle: def __init__(self, center: Point, point_on_circle: Point): # 单个Circle实例对应一个圆,传入圆心和圆上任意点即可计算半径 self.radius = Line(center, point_on_circle).get_length() @classmethod def calculate_circles_distance(cls, circle_a: "Circle", circle_b: "Circle") -> float: # 按题目要求,两圆距离为半径之和 return circle_a.radius + circle_b.radius # 测试逻辑 if __name__ == "__main__": # 实例化两个圆的圆心和圆上点 center1 = Point(1, 2) circle1_point = Point(3, 4) center2 = Point(2, 3) circle2_point = Point(5, 6) circle1 = Circle(center1, circle1_point) circle2 = Circle(center2, circle2_point) # 计算并打印两圆距离 print(Circle.calculate_circles_distance(circle1, circle2))
优化说明
- 将线段长度计算封装到Line类的内部方法中,逻辑解耦,避免重复编写计算逻辑时出错。
- Circle类每个实例对应单个圆,初始化时自动计算自身半径,符合面向对象的设计规范。
- 使用类方法实现两圆距离计算,完全满足题目要求在Circle类中完成计算的规则。
内容的提问来源于stack exchange,提问作者AB21
相关产品推荐
相关产品推荐

