学习python编程,在新东方少儿编程官网的自由创作平台做的一些作品。
可以在线运行,效果如下(在新页面中打开链接):
代码如下(用到平台自定义的xdf库):
from xdf import * import math W = 768 H = 1024 h0 = 60 ps = [] ls = [] def reset(): ps.clear() ls.clear() refresh() pass def trace(): s = '[['+str(ps)+'],['+ str(ls)+']]' print(s) pass text('点击清空重新开始', 0, h0, h0, 'red').tap = reset text('点击完成输出结果', 0, H, h0, 'red').tap = trace def ang2rad(ang): return math.pi * ang / 180 def rad2ang(rad): return 180 * rad / math.pi class factory: def __init__(self, tp, co): self.tp = tp self.co = co self.arr = [] self.pool = [] pass def get(self): if len(self.pool): return self.initC(self.pool.pop()) return self.initC(self.create()) def initC(self, c): self.arr.append(c) c.front() c.show() return c def remove(self, c): c.hide() self.pool.append(c) self.arr.remove(c) pass def removeAll(self): for c in self.arr: c.hide() self.pool.extend(self.arr) self.arr.clear() pass def create(self): if self.tp == 'circle': return circle(0, 0, 10, self.co) if self.tp == 'line': return line(0, 0, 100, 100, 5, self.co) return None pass facC = factory('circle', 'red') facL = factory('line', 'black') def tap(): if y > h0 and y < H - h0: pushP(int(x), int(y)) refresh() pass pass def pushP(x, y): pi = getP(x, y) if pi >= 0: ls.append(pi) else: ls.append(len(ps)) ps.append(x) ps.append(y) def getP(x, y): for i in range(0, len(ps), 2): dx = x - ps[i] dy = y - ps[i+1] if dx*dx + dy*dy < 20*20: return i return -1 def setLine(li, x0, y0, x1, y1): dx = x1 - x0 dy = y1 - y0 sz = math.sqrt(dx * dx + dy * dy) rot = math.atan2(dy, dx) li.move(x0, y0) li.rotate(rad2ang(rot) + 90) li.size(sz) pass def refresh(): facC.removeAll() facL.removeAll() for i in range(1, len(ls)): x0 = ps[ls[i - 1]] y0 = ps[ls[i - 1] + 1] x1 = ps[ls[i]] y1 = ps[ls[i] + 1] setLine(facL.get(), x0, y0, x1, y1) for i in range(0, len(ps), 2): facC.get().move(ps[i], ps[i+1])
也可以下载代码,本地python环境运行(用pygame封装了xdf库)。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。