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(): device = xy.Device() time.sleep(2) device.pen_up() time.sleep(1) device.home() print 'main' im = cv2.imread('/Users/fogleman/Workspace/maptiles/zoom20clean.png') im = isolate_buildings(im) # im = combine_images() contours = find_contours(im) contours = filter_contours(contours) print len(contours) im[:] = 0 cv2.drawContours(im, contours, -1, 255, -1) cv2.imwrite('out.png', im) paths = contour_paths(contours) print 'scaling paths' drawing = xy.Drawing(paths).rotate_and_scale_to_fit(315, 380, step=90).scale(1, -1) drawing = drawing.move(300, 0, 1, 0) drawing.render().write_to_png('buildings.png') print 'drawing paths' paths = drawing.paths paths.sort(key=lambda path: path[0][1]) n = 100 for i in range(0, len(paths), n): print i group = paths[i:i + n] group.sort(key=lambda path: path[0][0]) for path in group: device.draw(xy.simplify(path, 0.05))
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 create_drawing(filename, x, y, w, h, p): paths = load_paths(filename) paths = xy.remove_duplicates(paths) drawing = xy.Drawing(paths) drawing = drawing.rotate_and_scale_to_fit(w - p, h - p, step=5) drawing = drawing.move(x + w / 2, y + h / 2, 0.5, 0.5) return drawing
def main(): im = Image.open(sys.argv[1]) paths = create_paths(im) drawing = xy.Drawing(paths).rotate_and_scale_to_fit(315, 380, step=90) drawing = drawing.sort_paths_greedy() drawing = drawing.join_paths() im = drawing.render() im.write_to_png('image.png')
def main(filenames, nx): paths = [] w = h = 100 p = 10 for index, filename in enumerate(filenames): i = index % nx j = index / nx x = i * w y = j * h drawing = create_drawing(filename, x, y, w, h, p) paths.extend(drawing.paths) drawing = xy.Drawing(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('grid.png')
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 create_drawing(rule, h): rows = compute_rows(rule, h) rows = pad(rows) rows = crop_diagonal(rows) # rows = crop(rows) rows = pad(rows) pairs, points = form_pairs(rows) paths = [trim_pair(x, 0.25) for x in pairs] for x, y in points: paths.append(xy.circle(x, y, 0.25)) drawing = xy.Drawing(paths) drawing = drawing.scale(1, -1).rotate(45) drawing = drawing.scale_to_fit(315, 380) return drawing
def main(): paths = [] for i in range(50): x = i / 100.0 paths.append([ (0 + x, 0 + x), (1 - x, 0 + x), (1 - x, 1 - x), (0 + x, 1 - x), (0 + x, 0 + x), ]) paths = [xy.xkcdify(path, 0.005, 0.01 / 4) for path in paths] drawing = xy.Drawing(paths).scale_to_fit(315, 380) im = drawing.render() im.write_to_png('xkcd.png')
def main(): paths = [] for path in PATHS: path = xy.parse_svg_path(path) path.append(path[0]) paths.extend(path) polygons = [geometry.Polygon(x) for x in paths] lines = geometry.MultiPolygon(polygons) for i in range(4): n = 3 - i o = i * 10 for j in range(-n, n + 1): paths += convert(lines.buffer(o + j * 0.667)) drawing = xy.Drawing(paths).scale(1, -1).rotate_and_scale_to_fit(315, 380, step=90) im = drawing.render() im.write_to_png('frog.png')
def create_drawing(): random.seed(1004) occupied = set() pipes = [Pipe(occupied) for _ in range(PIPES)] for _ in range(60000): done = True for pipe in pipes: if pipe.update(): done = False if done: break print len(occupied) shapes = [] for pipe in pipes: pipe.add_sphere(pipe.position) shapes.extend(pipe.shapes) print len(shapes) scene = xyz.Scene(shapes) paths = scene.render((25, 25, 10), (0, 0, 0), (0, 0, 1), 60, 1, 0.1, 100, 0.05) # paths.append([(-1, -1), (1, -1), (1, 1), (-1, 1), (-1, -1)]) drawing = xy.Drawing(paths).rotate(90).scale_to_fit(315, 380).rotate(-90) return drawing
def main(): shapes = [] for x in range(-4, 5): for y in range(-4, 5): z = random.random() * 2 r = random.random() + 0.5 shapes.append(xyz.Sphere(r, (x, y, z))) # shapes.append(pipe((x, y, 0), (x, y, z), 0.25)) # shapes.append(sphere(x, y, z, 0.25)) # shapes.append(sphere(0, 0, 0, 0.5)) # shapes.append(pipe((0, 1, 2), (0, 3, 2), 0.25)) # shapes.append(pipe((-3, -1, 5), (3, -1, 5), 0.25)) # shapes.append(sphere(-3, -1, 5, 0.25)) # shapes.append(sphere(3, -1, 5, 0.25)) # shapes.append(sphere(0, 1, 2, 0.25)) # shapes.append(sphere(0, 3, 2, 0.25)) # shapes.append(pipe((0, 0, 1), (0, 0, 4), 0.25)) # shapes.append(pipe((0, 1, 0), (0, 1, 3), 0.25)) # shapes.append(pipe((-1, 0, 0), (1, 0, 0), 0.5)) # shapes.append(pipe((0, -1, 0), (0, 1, 0), 0.5)) # shapes.append(pipe((0, 0, -1), (0, 0, 1), 0.5)) # shapes.append(sphere(-1, 0, 0, 0.5, 0)) # shapes.append(sphere(0, -1, 0, 0.5, 1)) # shapes.append(sphere(0, 0, -1, 0.5, 2)) # shapes.append(sphere(1, 0, 0, 0.5, 0)) # shapes.append(sphere(0, 1, 0, 0.5, 1)) # shapes.append(sphere(0, 0, 1, 0.5, 2)) scene = xyz.Scene(shapes) paths = scene.render((20, 20, 10), (0, 0, 0), (0, 0, 1), 30, 1, 0.1, 100, 0.05) # paths.append([(-1, -1), (1, -1), (1, 1), (-1, 1), (-1, -1)]) drawing = xy.Drawing(paths).scale_to_fit(315, 380) drawing = drawing.sort_paths_greedy().join_paths() drawing.render().write_to_png('three.png')
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(): device = xy.Device() time.sleep(2) device.pen_up() time.sleep(1) device.home() print 'parsing osm file' h = Handler() p = OSMParser(None, h.on_nodes, h.on_ways, h.on_relations, h.on_coords) p.parse('/Users/fogleman/Workspace/Manhattan/osm/manhattan.osm.pbf') print 'creating paths' paths = h.create_paths() print len(paths) print 'creating drawing' drawing = xy.Drawing(paths).scale(1, -1).scale_to_fit(315, 380) # print 'rendering drawing' # drawing.render().write_to_png('manhattan.png') paths = drawing.paths paths.sort(key=lambda path: path[0][1]) n = 250 for i in range(0, len(paths), n): print i for path in xy.sort_paths(paths[i:i + n], 500000): device.draw(xy.simplify(path, 0.1))
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)
p = (x - lo) / (hi - lo) x = new_lo + p * (new_hi - new_lo) result.append(x) return result random.seed(13) N = 400 noises = [random.random() * 2 - 1 for _ in range(N)] for _ in range(3): noises = low_pass(noises, 0.2) noises = normalize(noises, -1, 1) paths = [] x = 0 y = 0 m = 0.5 for i, n in enumerate(noises): r = i + 1 #N - i paths.append(xy.circle(x, y, r, 120)) a = n * math.pi x += math.cos(a) * m y += math.sin(a) * m drawing = xy.Drawing(paths) s = 315 / 2.0 drawing = drawing.crop(-s, -s, s, s) drawing.render().write_to_png('contain.png')
def main(): paths = create_paths() drawing = xy.Drawing(paths).scale_to_fit(315, 380) drawing = drawing.sort_paths_greedy() im = drawing.render() im.write_to_png('radial.png')
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)
from poisson_disc import poisson_disc import random import xy # 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()