You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 11:51:01