draw_heart() now looks really cool
# -*- coding: utf-8 -*- # draw_heart.py # http://gaming.jhu.edu/~phf/2012/fall/cs112/assignment-02.pdf or # https://plus.google.com/app/basic/stream/z12lunmjbx33vh5bt04cilrpelnzcbhoorg0k #Draw a heart import canvas, sys from math import sin, cos, pi w = h = 600 def draw_heart(): #canvas.move_to(w/2, h/2) canvas.move_to(0, 0) for t_int in xrange(int(2 * pi * 1000)): t = t_int / 1000 x = 16*(sin(t) ** 3) y = 13*cos(t) - 5*cos(2*t) - 2*cos(3*t) - cos(4*t) canvas.add_line(x * 150, y * 150) canvas.close_path() canvas.set_line_width(3) canvas.draw_path() print('Starting...') canvas.set_size(w, h) draw_heart()
Try this one...
# draw a heart using equation import canvas, sys, random from console import clear from datetime import datetime from math import sin, cos, pi w = h = 600 # canvas size detail = random.random() * 100 # larger is slower # almost perfect : 12.485 75.05 125.3 # half left : 12.525 # half right : 12.605 scale = 15 # larger is bigger origin = w/2 # plot origin on canvas def draw_heart(outline = False): first = True for t in xrange(int(2*pi * detail)): t = t * detail # heart equation x = 16*(sin(t) ** 3) y = 13*cos(t) - 5*cos(2*t) - 2*cos(3*t) - cos(4*t) # scale result x = origin + x * scale y = origin + y * scale + scale*2 # hide first line if first: canvas.move_to(x, y) first = False else: canvas.add_line(x, y) # set color canvas.set_fill_color(1,0.5,0.5) canvas.set_stroke_color(0.5,0,0) canvas.set_line_width(detail/2) # draw heart if outline: canvas.draw_path() else: canvas.close_path() canvas.fill_path() clear() print 'Calculating... d =',detail start = datetime.now() canvas.set_size(w,h) canvas.draw_rect(0,0, w,h) #canvas.draw_line(0,h/2,w,h/2) #canvas.draw_line(w/2,0,w/2,h) draw_heart(True) # outlined draw_heart() # filled stop = datetime.now() print(stop-start)
Updated with comment and constant separation. Another update, add drawing timer. Another update, add fill mode via function argument. Another update, pick
detailvalue randomly, creating beautiful images out of the equation.
Output sample: https://pic.twitter.com/cGE1W9e3j6
Awesome bee... Just one more nagging question: https://github.com/cclauss/Pythonista_canvas
I couldn't find a floodfill function to fill an arbitrary area with a specified color. If you want to get a smooth edge of the heart, try to play with the
detailconstant. I found 62.66 seems to be smooth enough. I also found 12.66, 25, 37.66, etc seem to be smooth as well. Try to find other values.
fill_path()does fill the inner part. The problem is how to get smooth edges. So, "correct"
detailvalue seems the only answer. At least with this code. Try my updated code above.
detailvalue randomly, you'll get beautiful images out of the equation. Check out the latest update.
Happy Valentines Day!