■
タートルグラフィックスを少しずつ改修。
色を変えたり太さを変えたり、clearできるようになったりした。
青い螺旋。
タートルの方
#!/usr/bin/env python from wireFrame import * from math import * class turtle3D: def __init__(self): self.wf = wireFrame() self.currentPoint = (0,0,0) self.angle = [0,0] self.penStatus = 1 def right(self,angle): xy,z = self.angle xy = xy - angle self.angle = [xy,z] def left(self,angle): xy,z = self.angle xy = xy + angle self.angle = [xy,z] def up(self,angle): xy,z = self.angle z = z + angle self.angle = [xy,z] def down(self,angle): xy,z = self.angle z = z + angle self.angle = [xy,z] def penDown(self): self.penStatus = 1 def penUp(self): self.penStatus = 0 def clear(self): self.wf.clearCanvas() def forward(self,l): x,y,z = self.currentPoint axy,az = self.angle zcos = cos(radians(az)) zsin = sin(radians(az)) nx,ny,nz = cos(radians(axy))*l*zcos+x,sin(radians(axy))*l*zcos+y,z+zsin*l if self.penStatus==1: self.wf.createObject(['line',x,y,z,nx,ny,nz]) print x,y,z,nx,ny,nz,axy,az self.currentPoint = [nx,ny,nz]
ワイヤーフレームの方
#!/usr/bin/env python import Tkinter import tkFileDialog import math class wireFrame: def clickOpenFile(self): fileName = tkFileDialog.askopenfilename() self.openFile(fileName) def cnvMap(self,x,y,z): return (x-self.width/2,y*-1+self.height/2) def cnvCanvas(self,x,y,z): interval = self.viewPoint.get()*10 / (self.viewPoint.get()*10 + float(z)) x = x*interval y = y*interval return (x+self.width/2,(y-self.height/2)*-1) def roll(self,x,y,degree): (orgX,orgY) = (x,y) orgR = math.sqrt(math.pow(orgX,2)+math.pow(orgY,2)) if orgR==0: return (x,y) orgTheta = math.atan2(orgY/orgR,orgX/orgR) theta = math.radians(degree)+orgTheta x = math.cos(theta)*orgR y = math.sin(theta)*orgR return (x,y) def roll3DbySetting(self,x,y,z): x,y = self.roll(x,y,self.zAxisRollAngle.get()) y,z = self.roll(y,z,self.xAxisRollAngle.get()) x,z = self.roll(x,z,self.yAxisRollAngle.get()) return (x,y,z) def createObject(self,item): if item[0]=='line': (itemType,sx,sy,sz,ex,ey,ez) = (item[0], int(item[1]),int(item[2]),int(item[3]), int(item[4]),int(item[5]),int(item[6])) (rsx,rsy,rsz) = self.roll3DbySetting(sx,sy,sz) (rex,rey,rez) = self.roll3DbySetting(ex,ey,ez) (lineSx,lineSy) = self.cnvCanvas(rsx,rsy,rsz) (lineEx,lineEy) = self.cnvCanvas(rex,rey,rez) line = self.canvas.create_line(lineSx,lineSy, lineEx,lineEy, fill=self.penColor,width=self.penWidth) self.objects.append((line,itemType,sx,sy,sz,ex,ey,ez)) else: pass pass def clearCanvas(self): for obj in self.objects: item,itemType,sx,sy,sz,ex,ey,ez = obj self.canvas.delete(item) self.objects = [] def openFile(self,fileName): f = open(fileName) for row in f: row = row.replace('\n','') if row=='':continue item = row.split(',') obj = self.createObject(item) f.close() def angleChanged(self,event): for ii in range(len(self.objects)): item,itemType,sx,sy,sz,ex,ey,ez = self.objects[ii] (rsx,rsy,rsz) = self.roll3DbySetting(sx,sy,sz) (rex,rey,rez) = self.roll3DbySetting(ex,ey,ez) (lineSx,lineSy) = self.cnvCanvas(rsx,rsy,rsz) (lineEx,lineEy) = self.cnvCanvas(rex,rey,rez) self.canvas.coords(item,lineSx,lineSy,lineEx,lineEy) def __init__(self): self.window = Tkinter.Tk() self.width = 400 self.height = 300 self.penColor = 'red' self.penWidth = 3 self.canvas = Tkinter.Canvas(self.window,bg="white", width=self.width,height=self.height) self.canvas.pack() self.xAxisRollAngle = Tkinter.Scale(self.window, from_=0, to=360, orient=Tkinter.HORIZONTAL) self.xAxisRollAngle.bind("<ButtonPress-1>",self.angleChanged) self.xAxisRollAngle.bind("<ButtonRelease-1>",self.angleChanged) self.xAxisRollAngle.bind("<B1-Motion>",self.angleChanged) self.xAxisRollAngle.pack(side=Tkinter.LEFT); self.yAxisRollAngle = Tkinter.Scale(self.window, from_=0, to=360, orient=Tkinter.HORIZONTAL) self.yAxisRollAngle.bind("<ButtonPress-1>",self.angleChanged) self.yAxisRollAngle.bind("<ButtonRelease-1>",self.angleChanged) self.yAxisRollAngle.bind("<B1-Motion>",self.angleChanged) self.yAxisRollAngle.pack(side=Tkinter.LEFT); self.zAxisRollAngle = Tkinter.Scale(self.window, from_=0, to=360, orient=Tkinter.HORIZONTAL) self.zAxisRollAngle.bind("<ButtonRelease-1>",self.angleChanged) self.zAxisRollAngle.bind("<ButtonPress-1>",self.angleChanged) self.zAxisRollAngle.bind("<B1-Motion>",self.angleChanged) self.zAxisRollAngle.pack(side=Tkinter.LEFT); self.viewPoint = Tkinter.Scale(self.window, from_=1, to=100, orient=Tkinter.HORIZONTAL) self.viewPoint.bind("<ButtonRelease-1>",self.angleChanged) self.viewPoint.bind("<ButtonPress-1>",self.angleChanged) self.viewPoint.bind("<B1-Motion>",self.angleChanged) self.viewPoint.set(100) self.viewPoint.pack(side=Tkinter.LEFT); self.btnOpenFile = Tkinter.Button(self.window,text="open",command=self.clickOpenFile) self.btnOpenFile.pack(side=Tkinter.RIGHT) self.objects = [] # self.window.mainloop() if __name__=='__main__': wireFrame()