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)