def main(): args = sys.argv[1:] if len(args) != 1: print 'Usage: python main.py input_image' return paths = [] model = Model(args[0]) previous = None for i in range(ITERATIONS): error = model.average_error() if previous is None or previous - error > ERROR_RATE: print i, error if SAVE_FRAMES: model.render('frames/%06d.png' % i) previous = error paths.extend(model.split()) model.render('output.png') print '-' * 32 depth = Counter(x.depth for x in model.quads) for key in sorted(depth): value = depth[key] n = 4**key pct = 100.0 * value / n print '%3d %8d %8d %8.2f%%' % (key, n, value, pct) print '-' * 32 print ' %8d %8.2f%%' % (len(model.quads), 100) # for max_depth in range(max(depth.keys()) + 1): # model.render('out%d.png' % max_depth, max_depth) drawing = xy.Drawing(paths).scale_to_fit(315, 315).rotate(180).scale(1, -1) drawing.render().write_to_png('quads.png') xy.draw(drawing, tolerance=None)
def main(): args = sys.argv[1:] if len(args) != 1: print 'Usage: python main.py input_image' return paths = [] model = Model(args[0]) previous = None for i in range(ITERATIONS): error = model.average_error() if previous is None or previous - error > ERROR_RATE: print i, error if SAVE_FRAMES: model.render('frames/%06d.png' % i) previous = error paths.extend(model.split()) model.render('output.png') print '-' * 32 depth = Counter(x.depth for x in model.quads) for key in sorted(depth): value = depth[key] n = 4 ** key pct = 100.0 * value / n print '%3d %8d %8d %8.2f%%' % (key, n, value, pct) print '-' * 32 print ' %8d %8.2f%%' % (len(model.quads), 100) # for max_depth in range(max(depth.keys()) + 1): # model.render('out%d.png' % max_depth, max_depth) drawing = xy.Drawing(paths).scale_to_fit(315, 315).rotate(180).scale(1, -1) drawing.render().write_to_png('quads.png') xy.draw(drawing, tolerance=None)
def main(): t0 = 0 t1 = pi * 24 n = 100000 path = [butterfly(t) for t in times(t0, t1, n)] drawing = xy.Drawing([path]).scale_to_fit(60, 60) xy.draw(drawing)
def main(): points = [(0, 0)] + hexagon() corners = [ (2, 1, 6), (1, 2, 0), (2, 0, 6), (0, 6, 1), (0, 2, 3), (2, 3, 4), (3, 4, 0), (4, 0, 2), (4, 0, 6), (0, 6, 5), (6, 5, 4), (5, 4, 0), ] paths = [] for a, b, c in corners: p1 = points[a] p2 = points[b] p3 = points[b] p4 = points[c] paths.extend(lines(p1, p2, p3, p4, 32)) drawing = xy.Drawing(paths).scale_to_fit(315, 380) drawing = drawing.sort_paths_greedy() drawing.render().write_to_png('lines.png') xy.draw(drawing)
def main(): random.seed() paths = [] columns = 24 rows = 36 sqrsize = 30 h = sqrsize/2 step = .22 randsum = 0 dampen = 0.45 for y in range (1, rows+1): randsum = randsum + (y * step) for x in range (1, columns+1): path = [] randval = random.uniform(-randsum, randsum) c = math.cos(math.radians(randval)) s = math.sin(math.radians(randval)) x1 = (x*sqrsize)+(randval*dampen) y1 = (y*sqrsize)+(randval*dampen) #http://stackoverflow.com/questions/644378/drawing-a-rotated-rectangle #sqrsize/2 for rotating about the center of the square path.append((( x1 + h * c - h * s ), ( y1 + h * c + h * s )))#ul path.append((( x1 - h * c - h * s ), ( y1 + h * c - h * s )))#ur path.append((( x1 - h * c + h * s ), ( y1 - h * c - h * s )))#br path.append((( x1 + h * c + h * s ), ( y1 - h * c + h * s )))#bl path.append((( x1 + h * c - h * s ), ( y1 + h * c + h * s )))#ul paths.append(path) drawing = xy.Drawing(paths).scale_to_fit(10365, 16640, 2000) centereddrawing = drawing.translate((10365-drawing.width)/2,(16640-drawing.height)/2) #drawing = drawing.sort_paths_greedy() xy.draw(centereddrawing)
def main(): t0 = 0 t1 = pi * 24 n = 100000 path = [butterfly(t) for t in times(t0, t1, n)] drawing = xy.Drawing([path]).scale_to_fit(315, 380) xy.draw(drawing)
def main(): paths = [] for path in PATHS: paths.extend(xy.parse_svg_path(path)) drawing = xy.Drawing(paths).scale(1, -1).scale_to_fit(9 * 25.4, 12 * 25.4) im = drawing.render() im.write_to_png('svg.png') xy.draw(drawing)
def main(): h = 128 for rule in [30]:#range(256): print rule drawing = create_drawing(rule, h) im = drawing.render()#line_width=1.25) im.write_to_png('rule%03d.png' % rule) drawing = drawing.sort_paths_greedy() xy.draw(drawing)
def main(): h = 128 for rule in [30]: #range(256): print rule drawing = create_drawing(rule, h) im = drawing.render() #line_width=1.25) im.write_to_png('rule%03d.png' % rule) drawing = drawing.sort_paths_greedy() xy.draw(drawing)
def main(iteration): t = xy.Turtle() for i in range(1, 2 ** iteration): t.forward(1) if (((i & -i) << 1) & i) != 0: t.circle(-1, 90, 36) else: t.circle(1, 90, 36) drawing = t.drawing.rotate_and_scale_to_fit(315, 380, step=90).scale(1, -1).origin() drawing.render().write_to_png('dragon.png') xy.draw(drawing)
def main(iteration): t = xy.Turtle() for i in range(1, 2 ** iteration): t.forward(1) if (((i & -i) << 1) & i) != 0: t.circle(-1, 90, 36) else: t.circle(1, 90, 36) drawing = t.drawing.rotate_and_scale_to_fit(60, 60, step=90).scale(1, -1).origin() #drawing.render().write_to_png('dragon%s.png' % iteration) xy.draw(drawing)
def main(): try: drawing = xy.Drawing.load('pipes.dwg') except Exception: drawing = create_drawing() n = 50 o = 25 drawing = drawing.origin().crop(n, n + o, 315 - n, 315 - n + o).scale_to_fit(315, 315) drawing = drawing.sort_paths_greedy().join_paths() drawing.render().write_to_png('pipes.png') # drawing.save('pipes.dwg') xy.draw(drawing)
def main(filename): paths = load_paths(filename) paths = xy.remove_duplicates(paths) drawing = xy.Drawing(paths).rotate_and_scale_to_fit(315, 380, step=90) # drawing = drawing.move(315 / 2.0, 380 / 2.0, 0.5, 0.5) drawing.paths = [x for x in drawing.paths if len(x) > 1] # drawing = drawing.simplify_paths() drawing = drawing.sort_paths_greedy() drawing = drawing.join_paths() # drawing = drawing.simplify_paths() im = drawing.render() im.write_to_png('paths.png') xy.draw(drawing)
def main(filename): paths = load_paths(filename) paths = xy.remove_duplicates(paths) drawing = xy.Drawing(paths).rotate_and_scale_to_fit(315, 380, step=90) # drawing = drawing.move(315 / 2.0, 380 / 2.0, 0.5, 0.5) drawing.paths = [x for x in drawing.paths if len(x) > 1] # drawing = drawing.simplify_paths() drawing = drawing.sort_paths_greedy() drawing = drawing.join_paths() # drawing = drawing.simplify_paths() im = drawing.render() im.write_to_png("paths.png") xy.draw(drawing)
def main(): random.seed() paths = [] columns = 24 rows = 36 sqrsize = 30 h = sqrsize / 2 step = .22 randsum = 0 dampen = 0.45 for y in range(1, rows + 1): randsum = randsum + (y * step) for x in range(1, columns + 1): path = [] randval = random.uniform(-randsum, randsum) c = math.cos(math.radians(randval)) s = math.sin(math.radians(randval)) x1 = (x * sqrsize) + (randval * dampen) y1 = (y * sqrsize) + (randval * dampen) #http://stackoverflow.com/questions/644378/drawing-a-rotated-rectangle #sqrsize/2 for rotating about the center of the square path.append(((x1 + h * c - h * s), (y1 + h * c + h * s))) #ul path.append(((x1 - h * c - h * s), (y1 + h * c - h * s))) #ur path.append(((x1 - h * c + h * s), (y1 - h * c - h * s))) #br path.append(((x1 + h * c + h * s), (y1 - h * c + h * s))) #bl path.append(((x1 + h * c - h * s), (y1 + h * c + h * s))) #ul paths.append(path) drawing = xy.Drawing(paths).scale_to_fit(10365, 16640, 2000) centereddrawing = drawing.translate((10365 - drawing.width) / 2, (16640 - drawing.height) / 2) #drawing = drawing.sort_paths_greedy() xy.draw(centereddrawing)
def main(): random.seed() paths = [] columns = 14 rows = 19 sqrsize = 30 padding = sqrsize * .2 for y in range (1, rows+1): for x in range (1, columns+1): path = [] for z in range (0, 8): x1 = random.uniform(0, sqrsize) y1 = random.uniform(0, sqrsize) path.append(((x1+sqrsize*x+padding*x),(y1+sqrsize*y+padding*y))) if (z==0): x0 = x1 y0 = y1 path.append(((x0+sqrsize*x+padding*x),(y0+sqrsize*y+padding*y))) # return to the start for closed path paths.append(path) drawing = xy.Drawing(paths).scale_to_fit(10365, 16640, 2000) centereddrawing = drawing.translate((10365-drawing.width)/2,(16640-drawing.height)/2) #drawing = drawing.sort_paths_greedy() xy.draw(centereddrawing)
def main(): im = Image.open(sys.argv[1]) paths = [] # for x, y in get_points(im): # paths.extend(create_paths(x, -y)) # maze paths = [] paths.extend(find_lines(im)) for x, y in find_curve1(im): paths.append(xy.arc(x + 2, -y - 2, 2, 90, 180)) for x, y in find_curve2(im): paths.append(xy.arc(x + 2, -y - 1, 2, 180, 270)) for x, y in find_curve3(im): paths.append(xy.arc(x + 1, -y - 2, 2, 0, 90)) for x, y in find_curve4(im): paths.append(xy.arc(x + 1, -y - 1, 2, 270, 360)) for x, y in find_big_curve1(im): paths.append(xy.arc(x + 4, -y - 4, 4, 90, 180)) for x, y in find_big_curve2(im): paths.append(xy.arc(x + 4, -y - 0, 4, 180, 270)) for x, y in find_big_curve3(im): paths.append(xy.arc(x + 0, -y - 4, 4, 0, 90)) for x, y in find_big_curve4(im): paths.append(xy.arc(x + 0, -y - 0, 4, 270, 360)) for x, y in find_small_curve1(im): paths.append(xy.arc(x + 2, -y - 2, 1, 90, 180)) for x, y in find_small_curve2(im): paths.append(xy.arc(x + 2, -y - 2, 1, 180, 270)) for x, y in find_small_curve3(im): paths.append(xy.arc(x + 2, -y - 2, 1, 0, 90)) for x, y in find_small_curve4(im): paths.append(xy.arc(x + 2, -y - 2, 1, 270, 360)) for x, y in find_bar(im): paths.append([(x + 1, -y - 1), (x + 18, -y - 1)]) paths.append([(x + 1, -y - 2), (x + 18, -y - 2)]) paths.append([(x + 1, -y - 0), (x + 1, -y - 3)]) paths.append([(x + 18, -y - 0), (x + 18, -y - 3)]) maze_paths = xy.join_paths(xy.sort_paths_greedy(paths)) # ghosts paths = [] for x, y in find_ghosts(im): paths.append(xy.arc(x + 6.5, -y + 4.5, 6.5, 0, 180)) paths.append([(x, -y + 4.5), (x, -y - 2)]) paths.append([(x + 13, -y + 4.5), (x + 13, -y - 2)]) paths.append([(x, -y - 2), (x + 2, -y)]) paths.append([(x + 4, -y - 2), (x + 2, -y)]) paths.append([(x + 4, -y - 2), (x + 6.5, -y)]) paths.append([(x + 13, -y - 2), (x + 13 - 2, -y)]) paths.append([(x + 13 - 4, -y - 2), (x + 13 - 2, -y)]) paths.append([(x + 13 - 4, -y - 2), (x + 13 - 6.5, -y)]) ghost_paths = xy.join_paths(xy.sort_paths_greedy(paths)) # pacman paths = [] x, y = 113, -189 paths.append(xy.arc(x, y, 6.5, 225, 135 + 360)) x1 = x + 6.5 * math.cos(math.radians(135)) y1 = y + 6.5 * math.sin(math.radians(135)) x2 = x + 6.5 * math.cos(math.radians(225)) y2 = y + 6.5 * math.sin(math.radians(225)) paths.append([(x1, y1), (x + 2, y)]) paths.append([(x2, y2), (x + 2, y)]) pacman_paths = xy.join_paths(xy.sort_paths_greedy(paths)) # dots paths = [] for x, y in find_dots(im): paths.append(xy.circle(x + 1.5, -y - 1.5, 1)) for x, y in find_big_dots(im): paths.append(xy.circle(x + 3.5, -y - 4.5, 4)) dot_paths = xy.join_paths(xy.sort_paths_greedy(paths)) paths = maze_paths + ghost_paths + pacman_paths + dot_paths drawing = xy.Drawing(paths).scale_to_fit(315, 380) drawing.render().write_to_png('pac.png') xy.draw(drawing)
from poisson_disc import poisson_disc import random import xy random.seed(1182) points, pairs = poisson_disc(0, 0, 315, 315, 1, 16) drawing = xy.Drawing(pairs) print len(drawing.paths) drawing = drawing.linemerge() print len(drawing.paths) drawing.render().write_to_png('test.png') paths = drawing.paths paths = xy.sort_paths_greedy(paths) paths = xy.join_paths(paths) print len(paths) xy.draw(paths)
# Generate the poisson_disc with paired points, and produce a drawing object from it random.seed(1337) r = 0.70 n = 12 points, pairs = poisson_disc(0, 0, 120, 120, r, n) drawing = xy.Drawing(pairs) print 'Raw number of paths: %s' % len(drawing.paths) # Merge the lines and see how much it's reduced drawing = drawing.linemerge() print 'Paths after linemerge: %s' % len(drawing.paths) # Sort the paths and join them, optimized for the xy plotter paths = drawing.paths paths = xy.sort_paths_greedy(paths) paths = xy.join_paths(paths) print 'Paths after xy optimization: %s' % len(paths) for tolerance in [0, 1]: print('Simplyfiying based on tolerance %s' % tolerance) simplified_paths = paths if tolerance: simplified_paths = xy.simplify_paths(paths, tolerance=tolerance) print('Drawing...') drawing = xy.Drawing(simplified_paths) im = drawing.render() im.write_to_png('test_t%s_n%s_r%s.png' % (tolerance, n, r)) xy.draw(paths, tolerance=1)