New paste Repaste Download
from openscad import *
from random import *
    
def create_cuts(w,h,cols, rows):
    result = []
    
    loop = []
    for j in range(rows-1):
        pts=[[-10, (j+1)*h]]
        off=0
        for i in range(cols):
            rh =h*(0.15+0.1*random())
            rw = w*(0.15+0.05*random())
            rc = w*(0.4+0.2*random())
            if random() > 0.5:
                rh=-rh
            pts=pts + [[off+0,(j+1)*h],[off+rc-rw,(j+1)*h],[off+rc-rw,(j+1)*h-rh],[off+rc+rw,(j+1)*h-rh],[off+rc+rw,(j+1)*h]]
            off=off+w
        pts.append([w*cols,(j+1)*h])            
        pts.append([w*cols+10,(j+1)*h])            
        if len(loop) == 0:
            loop=pts
        else:
            for pt in reversed(pts):
                loop.append(pt)
            result.append(spline(loop,fn=5))
            loop = []
    if len(loop) != 0:
        loop.append([w*cols+10,rows*h])            
        loop.append([-10,rows*h])            
        result.append(spline(loop,fn=5))
        
    mask=square([w*cols+2, h*rows+2])-[1,1]
    return union(result) & mask
    
W=80
H=160
rows=7  
cols=8
w=W/cols
h=H/rows
def preview(puzzle, row_mask, col_mask):
    r1=row_mask.offset(delta=-0.2)
    r2 = (puzzle-row_mask).offset(delta=-0.2)
    c1=col_mask.offset(delta=-0.2)
    c2 = (puzzle-col_mask).offset(delta=-0.2)
    ((puzzle & r1) & c1).show()
    ((puzzle & r2) & c1).show()
    ((puzzle & r1) & c2).show()
    ((puzzle & r2) & c2).show()
def laserview(puzzle, row_mask, col_mask):
    puzzle.color("black", alpha=0.5).show()
    row_mask.color("green", alpha=0.5).up(3).show()
    col_mask.color("red", alpha=0.5).up(6).show()
    #row_mask.color("black").show()
pic=circle(40)+[40,40]
pic=osimport("bunny.svg")+ [10,5]
    
puzzle=square([W,H])
puzzle = pic.color("black") | puzzle
#puzzle.show()
row_mask=create_cuts(w,h,cols,rows)
col_mask=create_cuts(h,w,rows,cols).rotz(-90).back(H)
preview(puzzle, row_mask, col_mask)
#laserview(puzzle, row_mask, col_mask)
Filename: None. Size: 2kb. View raw, , hex, or download this file.

This paste expires on 2026-03-06 17:55:28.488891+00:00. Pasted through web.