| 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)
|