def main(): points = poisson_disc(0, 0, 12, 8.5, 0.4, 64) index = Index(points) paths = [] for x1, y1 in points: index.remove((x1, y1)) x2, y2 = index.nearest((x1, y1)) index.insert((x1, y1)) d = math.hypot(x2 - x1, y2 - y1) paths.append(star(x1, y1, d / 2)) drawing = axi.Drawing(paths) drawing = drawing.remove_paths_outside(12, 8.5) drawing = drawing.sort_paths() im = drawing.render() im.write_to_png('out.png') axi.draw(drawing)
def main(): mm = 25.4 w = 11 * mm h = 8.5 * mm p = 0.5 * mm s = 0.25 * mm points = poisson_disc(p, p, w - p * 2, h - p * 2, s, 32) points = xy.sort_points(points) print len(points) device = xy.Device() time.sleep(3) device.pen_up() device.home() for cx, cy in points: r = (0.03125 + random.random() * 0.0625) * mm device.draw(circle(cx, cy, r, 36)) device.home()
def render(seed=None): random.seed(seed) width = height = 512 scale = 2 surface = cairo.ImageSurface(cairo.FORMAT_RGB24, width * scale, height * scale) dc = cairo.Context(surface) dc.set_line_cap(cairo.LINE_CAP_ROUND) dc.set_line_join(cairo.LINE_JOIN_ROUND) dc.scale(scale, scale) layer = make_layer() # layer.save('layer.png', 0, 0, width, height) points = poisson_disc(0, 0, width, height, 8, 16) shape1 = layer.alpha_shape(points, 0.1, 1, 0.1).buffer(-4).buffer(4) shape2 = layer.alpha_shape(points, 0.3, 1, 0.1).buffer(-8).buffer(4) shape3 = layer.alpha_shape(points, 0.12, 0.28, 0.1).buffer(-12).buffer(4) points = [ x for x in points if shape1.contains(Point(*x)) and layer.get(*x) >= 0.25 ] path = find_path(layer, points, 16) mark = path[0] # water background dc.set_source_rgb(*Color('#2185C5').rgb) dc.paint() # shallow water n = 5 shape = shape1.simplify(8).buffer(32).buffer(-16) shapes = [shape] for _ in range(n): shape = shape.simplify(8).buffer(64).buffer(-32) shape = xkcdify(shape, 2, 8) shapes.append(shape) shapes.reverse() c1 = Color('#4FA9E1') c2 = Color('#2185C5') for c, shape in zip(c2.range_to(c1, n), shapes): dc.set_source_rgb(*c.rgb) render_shape(dc, shape) dc.fill() # height dc.save() dc.set_source_rgb(*Color('#CFC291').rgb) for _ in range(5): render_shape(dc, shape1) dc.fill() dc.translate(0, 1) dc.restore() # sandy land dc.set_source_rgb(*Color('#FFFFA6').rgb) render_shape(dc, shape1) dc.fill() # grassy land dc.set_source_rgb(*Color('#BDF271').rgb) render_shape(dc, shape2) dc.fill() # dark sand dc.set_source_rgb(*Color('#CFC291').rgb) render_shape(dc, shape3) dc.fill() # path dc.set_source_rgb(*Color('#DC3522').rgb) render_curve(dc, path, 4) dc.set_dash([4]) dc.stroke() dc.set_dash([]) # mark dc.set_source_rgb(*Color('#DC3522').rgb) render_mark(dc, *mark) dc.set_line_width(4) dc.stroke() # compass dc.save() dc.translate(48, height - 64) dc.rotate(random.random() * math.pi / 4 - math.pi / 8) render_compass(dc) dc.restore() return surface
def render(seed=None): random.seed(seed) width = height = 512 scale = 2 surface = cairo.ImageSurface(cairo.FORMAT_RGB24, width * scale, height * scale) dc = cairo.Context(surface) dc.set_line_cap(cairo.LINE_CAP_ROUND) dc.set_line_join(cairo.LINE_JOIN_ROUND) dc.scale(scale, scale) layer = make_layer() # layer.save('layer.png', 0, 0, width, height) points = poisson_disc(0, 0, width, height, 8, 16) shape1 = layer.alpha_shape(points, 0.1, 1, 0.1).buffer(-4).buffer(4) shape2 = layer.alpha_shape(points, 0.3, 1, 0.1).buffer(-8).buffer(4) shape3 = layer.alpha_shape(points, 0.12, 0.28, 0.1).buffer(-12).buffer(4) points = [x for x in points if shape1.contains(Point(*x)) and layer.get(*x) >= 0.25] path = find_path(layer, points, 16) mark = path[0] # water background dc.set_source_rgb(*Color('#2185C5').rgb) dc.paint() # shallow water n = 5 shape = shape1.simplify(8).buffer(32).buffer(-16) shapes = [shape] for _ in range(n): shape = shape.simplify(8).buffer(64).buffer(-32) shape = xkcdify(shape, 2, 8) shapes.append(shape) shapes.reverse() c1 = Color('#4FA9E1') c2 = Color('#2185C5') for c, shape in zip(c2.range_to(c1, n), shapes): dc.set_source_rgb(*c.rgb) render_shape(dc, shape) dc.fill() # height dc.save() dc.set_source_rgb(*Color('#CFC291').rgb) for _ in range(5): render_shape(dc, shape1) dc.fill() dc.translate(0, 1) dc.restore() # sandy land dc.set_source_rgb(*Color('#FFFFA6').rgb) render_shape(dc, shape1) dc.fill() # grassy land dc.set_source_rgb(*Color('#BDF271').rgb) render_shape(dc, shape2) dc.fill() # dark sand dc.set_source_rgb(*Color('#CFC291').rgb) render_shape(dc, shape3) dc.fill() # path dc.set_source_rgb(*Color('#DC3522').rgb) render_curve(dc, path, 4) dc.set_dash([4]) dc.stroke() dc.set_dash([]) # mark dc.set_source_rgb(*Color('#DC3522').rgb) render_mark(dc, *mark) dc.set_line_width(4) dc.stroke() # compass dc.save() dc.translate(48, height - 64) dc.rotate(random.random() * math.pi / 4 - math.pi / 8) render_compass(dc) dc.restore() return surface
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()
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)