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

使用graphics库绘制3D函数z=cos(r)*0.1^(-r)运行报错求解

代码报错原因与修复方案

直接报错原因

代码运行直接抛出异常的核心问题是未定义变量c:你创建的圆形对象赋值给了变量point,但后续调用绘制方法时错误使用了不存在的变量c,触发NameError。

其他逻辑错误

即使修复变量名问题,也无法绘制出预期的3D函数曲面,还存在以下问题:

  • 坐标范围不匹配:graphics库的窗口左上角为坐标原点(0,0),你遍历的x_a取值范围为-7到7,负坐标会绘制到窗口可视区域外,看不到绘制结果。
  • 数值爆炸:你传入的参数d=0.1,d**(-sqrt_cul)等价于10^sqrt_cul,当sqrt_cul值接近300时,计算结果会远超浮点数上限,也完全超出1000x1000的窗口坐标范围。
  • 遍历范围不全:仅遍历了x轴的极小范围,没有遍历y轴的所有取值,无法覆盖整个3D函数的定义域。
  • 缺少3D转2D的投影逻辑:直接将z值叠加到y坐标的绘制方式无法呈现正确的3D透视效果。

修复后可运行代码

from graphics import *
from math import *
def D3_graph(scale=20, z_scale=5, d=0.1):
    win = GraphWin("3D_graph", 1000, 1000)
    win.setBackground(color_rgb(0,0,0))
    # 绘制中心参考圆
    border_circle = Circle(Point(500,500), 300)
    border_circle.setOutline("white")
    border_circle.draw(win)
    # 遍历x、y的取值范围
    for x_a in range(-15, 16):
        for y_a in range(-15, 16):
            r = sqrt(x_a**2 + y_a**2)
            # 限制r的范围避免数值过大
            if r > 10:
                continue
            z = cos(r) * (d ** (-r))
            # 3D坐标转2D屏幕坐标,原点偏移到窗口中心(500,500),z值抬高y坐标实现立体效果
            screen_x = 500 + x_a * scale
            screen_y = 500 + y_a * scale - z * z_scale
            # 仅绘制在窗口范围内的点
            if 0 <= screen_x < 1000 and 0 <= screen_y < 1000:
                win.plot(screen_x, screen_y, "blue")
    win.getMouse()
    win.close()
D3_graph()

内容的提问来源于stack exchange,提问作者karin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.22 04:06:06