Dibujar diagonales de la ventana (en colores azul y rojo)
from Tkinter import *
ventana=Tk()
#objeto (“tela”) para dibujar
ancho=200; alto=100 #pixeles
cv=Canvas(ventana,width=ancho,height=alto)
cv.pack()
#dibujar diagonales (azul y roja)
#cv.create_line(h1,v1,h2,v2,fill=”color”)
cv.create_line(0,0,ancho,alto,fill="blue")
cv.create_line(0,alto,ancho,0,fill="red")
ventana.mainloop()
Nota.
coordenadas se expresan en la forma horizontal,vertical
0,0: coordenadas de esquina superior izquierda
from Tkinter import *
ventana=Tk()
cv=Canvas(ventana,width=200,height=200)
cv.pack()
cv.create_rectangle(20,40,100,100)
cv.create_rectangle(100,100,180,160,fill="black")
ventana.mainloop()
from Tkinter import *
ventana=Tk()
cv=Canvas(ventana,width=200,height=200)
cv.pack()
cv.create_oval(20,40,100,100)
cv.create_oval(100,100,200,200,fill="black")
ventana.mainloop()
#circunferencias al azar
from Tkinter import *
import random
def dibujar():
x=random.randint(0,ancho)
y=random.randint(0,alto)
r=random.randint(1,min(alto,ancho))/2
cv.create_oval(x-r,y-r,x+r,y+r)
v=Tk()
alto=200; ancho=200
b=Button(v,text="circunferencia",command=dibujar)
cv=Canvas(v,width=ancho,height=alto)
b.pack(); cv.pack()
v.mainloop()
Problema. Graficar la función y=x2 para x en [-100,100].
Nota. la función se grafica uniendo n líneas rectas
cv.create_line(h0,v0,h,v)
Conversión de coordenadas:
x
horizontal
y
vertical
-100
0
10000
0
0
W/2
0
H
100
W
10000
0
x
W (x+100)/200
2
y=x
H - H y/10000
from Tkinter import *
ventana=Tk()
W=input("ancho?"); H=input("alto?")
cv=Canvas(ventana,width=W,height=H,bg="white")#fondo
cv.pack()
#dibujar ejes
cv.create_line(0,H-1,W,H-1) #horizontal
cv.create_line(W/2,0,W/2,H) #vertical
h0=0; v0=0 #coordenadas comienzo primera linea
#iterar con x=-100,-90,…,-10,0,10,…,90,100
x = -100.0
while x<=100 :
y=x*x #valor de la función
h = int(W*(x+100)/200 + 0.5) #coord horizontal
v = H - int(H*y/10000 + 0.5) #coord vertical
cv.create_line(h0,v0,h,v)
h0=h; v0=v #actualizar coordenadas comienzo línea
x = x + 10
ventana.mainloop()
Método para graficar función f usando n puntos del intervalo[a,b] en
canvas cv de WxH pixeles
def graficar(f,n,a,b,cv,W,H):
Ejemplo: seno con 20 ptos entre 0 y 2∏ en canvas de 200x100 pixeles
Ejemplo: x2 con 20 ptos entre -100 y 100 en canvas de 200x200 pixeles
#graficar seno con 20 ptos entre 0 y 2*pi
from Tkinter import *
import math
ventana=Tk()
cv=Canvas(ventana,width=200,height=100,bg="white")
cv.pack()
graficar(math.sin,20,0,2*math.pi,cv,200,100)
ventana.mainloop()
#graficar x*x con 20 ptos entre -100 y 100
def cuadrado(x): return x*x
from Tkinter import *
ventana=Tk()
cv=Canvas(ventana,width=200,height=200,bg="white")
cv.pack()
graficar(cuadrado,20,-100,100,cv,200,200)
ventana.mainloop()
from Tkinter import *
#graficar f usando n puntos de [a,b] en canvas
cv de WxH pixeles
def graficar(f,n,a,b,cv,W,H):
#determinar minimo y maximo de f en [a,b]
minimo=f(a)
maximo=f(a)
delta=(b-a)/(n-1)
x=a+delta
while x <= b :
y=f(x)
minimo=min(y,minimo)
maximo=max(y,maximo)
x = x + delta
#graficar funcion
h0=0
v0=H-coordenadaPixel(f(a),minimo,maximo,H)
x=a+delta
while x<=b:
h=coordenadaPixel(x,a,b,W)
v=H-coordenadaPixel(f(x),minimo,maximo,H)
cv.create_line(h0,v0,h,v)
h0=h; v0=v
x=x+delta
#convertir x en [y,z] a coord [0,w] de pixel
def coordenadaPixel(x,y,z,w):
return int(w*(x-y)/(z-y)+0.5)
Problema. Dibujar la siguiente figura (cuadrado girado en )
L
L
L seno 

h2,v2

h,v
L coseno 
cv=Canvas(…)
h2=h+int(L*math.cos(alfa*math.pi/180))
v2=v-int(L*math.sin(alfa*math.pi/180))
cv.create_line(h,v,h2,v2)
#primera línea
h3=...; v3=...
cv.create_line(h2,v2,h3,v3) #segunda línea
h4=...; v4=...
cv.create_line(h3,v3,h4,v4) #tercera línea
cv.create_line(h4,v4,h,v)
#cuarta línea
Solución 2. Usando la geometría de la “tortuga” (de Logo).
#ubicar tortuga al centro de cv
t=Tortuga(W/2,H/2,cv)
#girar la tortuga en angulo alfa
t.girar(45)
#repetir 4 veces
i=1
while i<=4:
i=i+1
#avanzar tortuga en L(dibujando linea)
t.avanzar(50)
#girar tortuga en 90º
t.girar(90)
Descargar

Clase12(Dibujos_y_Gr..