Processing 3.5.4 Python模式雷达程序数组使用错误修正求助
Processing Python模式雷达程序数组修正方案
问题描述
开发雷达程序时,需要用数组存储360个角度对应的距离值以实现不同线条的差异化显示,但当前代码中数组的声明和使用存在错误,导致显示异常。当前效果如下:
错误分析与修正步骤
1. 数组初始化错误
Python中没有array[360]这种声明方式,Processing Python模式下推荐使用列表实现数组功能,创建包含360个初始值(如0)的列表:
# 错误写法 distance = array[360] # 正确写法 distance = [0] * 360
2. 串口事件下标变量问题
原代码中serialEvent里的x是局部变量,每次触发串口事件都会重置为0,导致永远只修改distance[0]。需将x声明为全局变量,确保下标能持续递增:
# 在全局作用域初始化x x = 0 def serialEvent(evt): global distance, x # 声明x为全局变量 inString = evt.readString().strip() distance[x] = int(inString) x = x + 1 if x == 360: x = 0
3. 串口对象全局化
原代码中ser是setup内的局部变量,setup执行完成后会被销毁,导致串口事件无法正常触发。需将ser声明为全局变量:
ser = None # 全局作用域初始化串口对象 def setup(): global f, ser size(801, 801) # 窗口尺寸 f = createFont("Arial", 20) ser = Serial(this, "COM5", 9600) LF = 10 ser.bufferUntil(LF)
修正后的完整代码
add_library('serial') # 全局变量初始化 distance = [0] * 360 # 创建360个元素的列表,初始值为0 x = 0 ser = None def setup(): global f, ser size(801, 801) # 窗口尺寸 f = createFont("Arial", 20) ser = Serial(this, "COM5", 9600) LF = 10 ser.bufferUntil(LF) def draw(): global distance rectMode(CENTER) stroke(255) fill(0) rect(400, 400, 800, 800) ellipseMode(CENTER) ellipse(400, 400, 800, 800) ellipse(400, 400, 600, 600) ellipse(400, 400, 400, 400) ellipse(400, 400, 200, 200) line(400, 0, 400, 800) line(0, 400, 800, 400) line(400 - 400 * cos(0.785), 400 - 400 * sin(0.785), 400 + 400 * cos(0.785), 400 + 400 * sin(0.785)) line(400 - 400 * cos(0.785), 400 + 400 * sin(0.785), 400 + 400 * cos(0.785), 400 - 400 * sin(0.785)) textFont(f) fill(255) text("25cm", 440, 390) text("50cm", 540, 390) text("75cm", 640, 390) text("100cm", 730, 390) for i in range(360): stroke(0,255,0) line(400, 400,400+distance[i]*4*cos(radians(i)), 400+distance[i]*4*sin(radians(i))) stroke(255,0,0) line(400+distance[i]*4*cos(radians(i)), 400+distance[i]*4*sin(radians(i)),400+400*cos(radians(i)),400+400*sin(radians(i))) # print(distance[i]) # 可注释减少控制台输出压力 def serialEvent(evt): global distance, x inString = evt.readString().strip() # 增加输入合法性判断,避免非数字输入报错 if inString.isdigit(): distance[x] = int(inString) x = x + 1 if x == 360: x = 0
额外优化建议
- 保留
serialEvent中的输入合法性判断,避免串口传入非数字内容导致程序崩溃。 - 注释掉
draw中的print(distance[i]),减少控制台输出,提升程序运行流畅度。
内容的提问来源于stack exchange,提问作者Enrico Negrin
相关产品推荐
相关产品推荐

