使用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
相关产品推荐
相关产品推荐

