# -*- coding: iso-8859-1 -*- # mk, 21.12.08, 27.12.08 # model import Gnuplot, Gnuplot.funcutils g = Gnuplot.Gnuplot(debug=1) g('set border 0;') g('set grid;') g('set size 1.2,1.6;') g('set origin -0.1,-0.3;') g('set lmargin 1;') g('set xtics axis 1;') g('set ytics axis 1;') g('set ztics axis 1;') g('set xzeroaxis lt -1 lw 1;') g('set yzeroaxis lt -1 lw 1;') g('set zzeroaxis lt -1 lw 1;') g('set ticslevel -0.5;') g('set view 70,110;') # g('splot \'v1.txt\' with vectors filled head lw 2;') import math def n1n2orthogonal(v): """ liefert 2 orthogonale Einheitsvektoren, die auf v senkrecht stehen """ if (v[1]!=0) or (v[2]!=0): n1 = [0,v[2],-v[1],0] else: n1 = [0,0,v[3],-v[2]] n1[0] = math.sqrt(n1[1]**2+n1[2]**2++n1[3]**2) # Betrag in n1[0] b = float(n1[0]) for i in range(4): n1[i] = n1[i]/b # print n1 # DEBUG n2 = [0,0,0,0] n2[1] = v[2]*n1[3]-v[3]*n1[2] n2[2] = v[3]*n1[1]-v[1]*n1[3] n2[3] = v[1]*n1[2]-v[2]*n1[1] n2[0] = math.sqrt(n2[1]**2+n2[2]**2+n2[3]**2) b = float(n2[0]) for i in range(4): n2[i] = n2[i]/b # print n2 # DEBUG return (n1,n2) def vektor(f,F,S): """ schreibt Daten für Pfeil mit Fußpunkt F und Spitze S in Datei f """ f.write('\n') f.write(str(F[1])+' '+str(F[2])+' '+str(F[3])+'\n') f.write(str(S[1])+' '+str(S[2])+' '+str(S[3])+'\n') f.write('\n') r=0.07 # Radius der Spitze s=0.4 # Länge der Spitze # Berechnung des Mittelpunktes des 'Spitzenkreises' b = math.sqrt((S[1]-F[1])**2+(S[2]-F[2])**2+(S[3]-F[3])**2) x0 = S[1]-(S[1]-F[1])*s/b y0 = S[2]-(S[2]-F[2])*s/b z0 = S[3]-(S[3]-F[3])*s/b # Berechnung von n1 und n2 n1,n2 = n1n2orthogonal([0,S[1]-F[1],S[2]-F[2],S[3]-F[3]]) # Kreis und Mantellinien w = 0.0 dw = 0.2 while w < 2*math.pi+dw: x = x0+r*math.cos(w)*n1[1]+r*math.sin(w)*n2[1] y = y0+r*math.cos(w)*n1[2]+r*math.sin(w)*n2[2] z = z0+r*math.cos(w)*n1[3]+r*math.sin(w)*n2[3] f.write(str(x)+' '+str(y)+' '+str(z)+'\n') f.write(str(S[1])+' '+str(S[2])+' '+str(S[3])+'\n') f.write(str(x)+' '+str(y)+' '+str(z)+'\n') w = w+dw def kreis(f,M,n,r): """ schreibt Daten für Kreis mit Mittelpunkt M, Normale n und Radius r in Datei f """ f.write('\n') # Berechnung von n1 und n2 n1,n2 = n1n2orthogonal(n) # Kreis w = 0.0 dw = 0.2 while w < 2*math.pi+dw: x = M[1]+r*math.cos(w)*n1[1]+r*math.sin(w)*n2[1] y = M[2]+r*math.cos(w)*n1[2]+r*math.sin(w)*n2[2] z = M[3]+r*math.cos(w)*n1[3]+r*math.sin(w)*n2[3] f.write(str(x)+' '+str(y)+' '+str(z)+'\n') w = w+dw def punkt(f,P): """ schreibt Daten für Punkt M in Datei f """ r = 0.05 kreis(f,P,[0,1,0,0],r) kreis(f,P,[0,0,1,0],r) kreis(f,P,[0,0,0,1],r) # Kreis """ n = [0,1,0,0] M = [0,-2,-2,3] kreis(f,M,n,2) kreis(f,M,[0,0,1,0],2) kreis(f,M,[0,0,0,1],2) """ # Vektor """ F = [0,1,1,0] S = [0,0,3,2] vektor(f,F,S) f.close() """ # control def ein(event): # Bereich festlegen b = e1.get() b2 = str(float(b)+0.5) g('set xrange[-'+b+':+'+b+'];') g('set yrange[-'+b+':+'+b+'];') g('set zrange[-'+b+':+'+b+'];') # Achsen beschriften g('unset label;') g('set label \'x\' at '+b2+',0,0;') g('set label \'y\' at 0,'+b2+',0;') g('set label \'z\' at 0,0,'+b2+';') # Titel setzen title = 's81bsp1' # # g('set label \"'+title+'\" at '+b2+','+b2+','+b2+';') # Pfeilspitzen an den Achsen f = open('t0.txt','w') F = [0,float(b)-0.4,0,0] S = [0,float(b),0,0] vektor(f,F,S) F = [0,0,float(b)-0.4,0] S = [0,0,float(b),0] vektor(f,F,S) F = [0,0,0,float(b)-0.4] S = [0,0,0,float(b)] vektor(f,F,S) f.write('\n') f.close() # Pfeile f = open('t1.txt','w') z = int(t1.index(END).split('.')[0]) for i in range(z-1): r = t1.get(str(i+1)+'.0',str(i+1)+'.end') if r != '': r = r.split(' ') F = [0,float(r[0]),float(r[1]),float(r[2])] # print F S = [0,float(r[3]),float(r[4]),float(r[5])] # print S vektor(f,F,S) f.write('\n') f.close() # Linien f = open('t2.txt','w') z = int(t2.index(END).split('.')[0]) for i in range(z-1): r = t2.get(str(i+1)+'.0',str(i+1)+'.end') f.write(r) f.write('\n') f.close() # Punkte f = open('t3.txt','w') z = int(t3.index(END).split('.')[0]) for i in range(z-1): r = t3.get(str(i+1)+'.0',str(i+1)+'.end') if r != '': r = r.split(' ') P = [0,float(r[0]),float(r[1]),float(r[2])] punkt(f,P) f.write('\n') f.close() # zeichnen g('splot \'t0.txt\' lt -1 with lines,\'t1.txt\' lt '+f1.get()+' with lines,\ \'t2.txt\' lt '+f2.get()+' with lines,\'t3.txt\' lt '+f3.get()+' with lines;') # view from Tkinter import * w = Tk() w.title('einfache 3D-Darstellung mit Gnuplot') w.geometry('510x300') e1 = Entry(master=w) e1.insert(0,'6.9') e1.place(x=70,y=20,width=40) l0 = Label(master=w,text='Bereich') l0.place(x=20,y=20) t1 = Text(master=w) t1.insert('1.0','0.0 0.0 0.0 2.0 4.0 3.0\n2 4 3 3 6 2') t1.place(x=20,y=70,width=150,height=150) l1 = Label(master=w,text='Pfeile') l1.place(x=20,y=50) f1 = StringVar() f1.set('3') r11 = Radiobutton(master=w,text='sw',variable=f1,value='-1') r11.place(x=20,y=225) r12 = Radiobutton(master=w,text='rt',variable=f1,value='1') r12.place(x=60,y=225) r13 = Radiobutton(master=w,text='gr',variable=f1,value='2') r13.place(x=100,y=225) r14 = Radiobutton(master=w,text='bl',variable=f1,value='3') r14.place(x=140,y=225) t2 = Text(master=w) t2.insert('1.0','2.0 4.0 3.0 \n-8.0 -16 13.0\n\n\n3 6 2\n12 24 -7') t2.place(x=180,y=70,width=150,height=150) l2 = Label(master=w,text='Linien') l2.place(x=180,y=50) f2 = StringVar() f2.set('1') r21 = Radiobutton(master=w,text='sw',variable=f2,value='-1') r21.place(x=180,y=225) r22 = Radiobutton(master=w,text='rt',variable=f2,value='1') r22.place(x=220,y=225) r23 = Radiobutton(master=w,text='gr',variable=f2,value='2') r23.place(x=260,y=225) r24 = Radiobutton(master=w,text='bl',variable=f2,value='3') r24.place(x=300,y=225) t3 = Text(master=w) t3.insert('1.0','1 2 4\n0 0 5') t3.place(x=340,y=70,width=150,height=150) l3 = Label(master=w,text='Punkte') l3.place(x=340,y=50) f3 = StringVar() f3.set('-1') r31 = Radiobutton(master=w,text='sw',variable=f3,value='-1') r31.place(x=340,y=225) r32 = Radiobutton(master=w,text='rt',variable=f3,value='1') r32.place(x=380,y=225) r33 = Radiobutton(master=w,text='gr',variable=f3,value='2') r33.place(x=420,y=225) r34 = Radiobutton(master=w,text='bl',variable=f3,value='3') r34.place(x=460,y=225) bAdd = Button(master=w,text='führe aus') bAdd.place(x=20,y=250,width=50) bAdd.bind('',ein) w.mainloop()