def run(args): saver = ReproSaver() saver.seed() R = 150 phi = 1.6180339 smaller = R / phi # golden ratio pts = [] pts.extend(circle_connections(1200, R, np.pi, -np.pi)) rays = draw_rays(0, 7 * R * phi, 0, np.pi, 30) rays.extend(draw_rays(2.5 * R, 7 * R * phi, np.pi / 60, np.pi - np.pi / 60, 29)) rays = shift(rays, np.array([1.7 * R, 0])) rays = mask_drawing(rays, circle((0, 0), 1.05 * R, N=50), invert=True) pts.extend(rays) # pts = mask_drawing(pts, circle((0, 0), R, N=50)) # pts.extend(circle_connections(230, R, np.pi * 0.3, 0)) # pts.extend(circle_connections(530, R, np.pi * 0.5, 0)) # pts.extend(circle_connections(650, R, np.pi * 0.65, np.pi * 0.50)) # pts.extend(circle_connections(700, R, np.pi * 0.95, np.pi * 0.72)) # for i in range(1, 18): # smooth_circle = circle_connections(360, R * 1.02**i, np.pi / 180, np.pi / 180) # pts.extend(drop_parts(smooth_circle, space=1, passes=4)) lines = to_vpype(pts) lines.crop(-2.3 * R - smaller, 2.3 * R + smaller, R + smaller, -R - smaller) # left, bottom, right, top pts = from_vpype_lines(lines) if not args.nosave: saver.add_svg(pts) document = vpype.Document(lines) # document.extend_page_size(None) with open('/tmp/signal_planet.svg', 'w') as fout: vpype.write_svg(fout, document) vpype_viewer.show(document) return 0
def run(args): N = 40 size = 6 # rot = 5 # paths = rotate(hex_grid(N, N, size), np.radians(rot)) N_rows = N N_cols = int(np.round(np.sqrt(2) * N)) paths = hex_grid(N_rows, N_cols, size) paths_2 = hex_grid(N_rows, N_cols, size * (34 / 36)) # paths_3 = rotate( # hex_grid(N, N, size), # np.radians(2 * rot) # ) border = rounded_rect(drawing_bbox(paths_2), 15) paths = mask_drawing(paths, border) paths_2 = mask_drawing(paths_2, border) gui = Drawer() gui.add_lines(paths, 'k') gui.add_lines(paths_2, 'k') gui.draw() export_svg(paths + paths_2, '/tmp/hex_grids.svg') return 0
def run(args): saver = ReproSaver() saver.seed() if args.cfg is not None: saver.load_seeds(args.cfg) H, W = 210, 148 angle_range = 3 horizontal_lines = [] for i in range(1000): horizontal_lines.append( random_line(H, W, min_angle=np.radians(0 - angle_range / 2), max_angle=np.radians(0 + angle_range / 2))) vertical_lines = [] for i in range(1000): vertical_lines.append( random_line(H, W, min_angle=np.radians(90 - angle_range / 2), max_angle=np.radians(90 + angle_range / 2))) cross = draw_cross(H, W) horizontal, vertical = draw_cross_parts(H, W) margin = 10 (horizontal, vertical, cross) = resize_and_center([horizontal, vertical, cross], H, W, margin, margin, margin, margin) horizontal_lines = mask_drawing(horizontal_lines, horizontal) vertical_lines = mask_drawing(vertical_lines, vertical) horizontal_lines = jitter_length(horizontal_lines, 0, 5) vertical_lines = jitter_length(vertical_lines, 0, 5) vertical_lines = mask_drawing(vertical_lines, horizontal, invert=True) cross_lines = horizontal_lines cross_lines.extend(vertical_lines) cross_lines.extend(vertical_lines) # cross_lines.append(cross) bg_lines = [] for i in range(300): bg_lines.append(random_line(0.2 * H, W)) bg_lines = shift(bg_lines, (0, 0.8 * H)) bg_lines = mask_drawing(bg_lines, cross, invert=True) pts = [] pts.extend(cross_lines) pts = resize_and_center(pts, H, W, margin, margin, margin, margin) # pts.extend(bg_lines) lines = to_vpype(pts) document = vpype.Document(lines) vpype_viewer.show(document) if not args.nosave: saver.add_svg(pts) return 0
def run(args): svg_path = args.path parsed_paths, attributes, svg_attributes = svgpt.svg2paths( svg_path, return_svg_attributes=True) logger.info('SVG loaded') paths = [] for path in parsed_paths: if path.iscontinuous(): paths.append(path) else: for p in path.continuous_subpaths(): paths.append(p) np_paths = [] step = 1 for path_i, path in enumerate(tqdm.tqdm(paths, desc='paths')): np_path = [cplx_to_xy(path.start)] for part in path: if type(part) is svgpt.path.Line: start = cplx_to_xy(part.start) end = cplx_to_xy(part.end) if start != np_path[-1]: np_path.append(start) np_path.append(end) else: length = part.length() steps = int(np.round(length / step)) # steps = 20 if steps == 0: continue fraction_step = 1 / steps for i in range(steps + 1): try: pt = path.point(fraction_step * i) pt = cplx_to_xy(pt) np_path.append(pt) except Exception: pass np_paths.append(np.array(np_path)) logger.info('SVG converted') to_draw = np_paths if args.rotate: to_draw = rotate(to_draw) page_conf = load_page_conf(args.format) x_margin_mm = args.margins y_margin_mm = args.margins H = page_conf['H'] # 210 # A4 W = page_conf['W'] # 297 # A4 to_draw = resize_and_center(to_draw, H, W, x_margin_mm, x_margin_mm, y_margin_mm, y_margin_mm) orig = copy.deepcopy(to_draw) if args.border_crop: border = rounded_rect(drawing_bbox(to_draw), args.border_round) vis_drawing([border], 'b-', linewidth=0.5) logger.info("Masking drawing") to_draw = mask_drawing(to_draw, border) to_draw = multi_pass(to_draw, args.multipass) if not args.noopt: logger.info("Starting optimization") to_draw = optimize(to_draw, path_join_threshold=args.join, line_simplification_threshold=args.simplify, path_drop_threshold=args.drop) logger.info('plotting') vis_drawing(to_draw, 'r-', linewidth=0.5) vis_drawing(orig, 'k-', linewidth=0.5) plt.plot([0, W, W, 0, 0], [0, 0, H, H, 0], 'k:') plt.axis('equal') # plt.gca().invert_yaxis() plt.show() with Plotter('/dev/ttyUSB0', 9600) as p: p.load_config(args.opconfig) p.set_input_limits((0, 0), (W, 0), (0, H), (W, H)) p.set_speed(289) p.draw_polylines(to_draw) return 0
def run(args): img = cv2.imread(args.img) img = resize_to_px_count(img, 1000**2) gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) blur_type = 'bilateral' # blur_type = 'gauss' if blur_type == 'gauss': sigma = 8 if sigma > 0: gray = cv2.GaussianBlur(gray, ksize=(0, 0), sigmaX=sigma) elif blur_type == 'bilateral': sigmaColor = 20 sigmaSpace = 5 blurred = cv2.bilateralFilter(img, d=-1, sigmaColor=sigmaColor, sigmaSpace=sigmaSpace) # gray = cv2.cvtColor(blurred, cv2.COLOR_BGR2GRAY) # sigma = 3 # gray = cv2.GaussianBlur(gray, ksize=(0, 0), sigmaX=sigma) # cv2.imshow("cv: gray", gray) # while True: # c = cv2.waitKey(0) # if c == ord('q'): # sys.exit(1) cmyk = bgr2cmyk(blurred) to_draw = {} N_hatches = args.N_hatches for i, name in enumerate("CMYK"): to_draw[name] = multi_hatch(cmyk[:, :, i], args.hatch_step_px, contour_tolerance=1, N_hatches=N_hatches, dark=False) to_draw[name] = [x[:, ::-1] for x in to_draw[name]] # swap x, y if args.rotate: to_draw = rotate(to_draw) page_conf = load_page_conf(args.format) x_margin_mm = args.margins y_margin_mm = args.margins H = page_conf['H'] # 210 # A4 W = page_conf['W'] # 297 # A4 # to_draw = rotate(to_draw) to_draw = resize_and_center(to_draw, H, W, x_margin_mm, x_margin_mm, y_margin_mm, y_margin_mm) border = rounded_rect(drawing_bbox(to_draw), 15) vis_drawing([border], 'b:', linewidth=0.5) to_draw = mask_drawing(to_draw, border) to_draw = optimize(to_draw, line_simplification_threshold=0.1, path_drop_threshold=2.0, path_join_threshold=1.0) vis_drawing(to_draw, layer_options={ 'C': (['c-'], dict(linewidth=0.1, alpha=0.5)), 'M': (['m-'], dict(linewidth=0.1, alpha=0.5)), 'Y': (['y-'], dict(linewidth=0.1, alpha=0.5)), 'K': (['k-'], dict(linewidth=0.1, alpha=0.5)), }) plt.plot([0, W, W, 0, 0], [0, 0, H, H, 0], 'k:') plt.show() with Plotter('/dev/ttyUSB0', 9600) as p: p.load_config(args.opconfig) p.set_input_limits((0, 0), (W, 0), (0, H), (W, H)) p.draw_polylines(to_draw) # cv2.imshow("cv: canvas", canvas) # while True: # c = cv2.waitKey(0) # if c == ord('q'): # break # plt.contour(gray, levels=levels, # colors='k', linewidths=0.1) # plt.axis('equal') # plt.gca().invert_yaxis() # plt.show() return 0