# # castle.cad # # # define limits and parameters # cad_xmin = -1 cad_xmax = 1 cad_ymin = -1 cad_ymax = 1 cad_zmin = -.6 cad_zmax = 1.1 cad_rx = 45 # x view rotation (degrees) cad_rz = 20 # z view rotation (degrees) cad_units = 'in' # coordinates units cad_bit_depth = '1' # bit depth cad_npts = 200 cad_nx = cad_npts # x points to render cad_ny = cad_npts # y points to render cad_nz = 200 # z points to render # # define shapes and transformation # # circle(x0, y0, r) # cylinder(x0, y0, z0, z1, r) # sphere(x0, y0, z0, r) # torus(x0, y0, z0, r0, r1) # rectangle(x0, x1, y0, y1) # cube(x0, x1, y0, y1, z0, z1) # union(part1, part2) # intersect(part1, part2) # subtract(part1, part2) # translate(part,dx,dy,dz) # rotate_x(part, theta) # rotate_y(part, theta) # rotate_z(part, theta) # reflect_x(part, x0) # reflect_y(part, y0) # reflect_z(part, z0) # reflect_xy(part) # reflect_yz(part) # (many more to come) def circle(x0, y0, r): part = "(((X-x0)**2 + (Y-y0)**2) <= r**2)" part = replace(part,'x0',str(x0)) part = replace(part,'y0',str(y0)) part = replace(part,'r',str(r)) return part def cylinder(x0, y0, z0, z1, r): part = "(((X-x0)**2 + (Y-y0)**2 <= r**2) & (Z >= z0) & (Z <= z1))" part = replace(part,'x0',str(x0)) part = replace(part,'y0',str(y0)) part = replace(part,'z0',str(z0)) part = replace(part,'z1',str(z1)) part = replace(part,'r',str(r)) return part def cone(x0, y0, z0, r0, h): part = "((sqrt((X-x0)**2 + (Y-y0)**2) <= (r0 - (Z-z0)*r0/h)) & (Z >= z0) & (Z <= (z0+h)))" part = replace(part,'x0',str(x0)) part = replace(part,'y0',str(y0)) part = replace(part,'z0',str(z0)) part = replace(part,'r0',str(r0)) part = replace(part,'h',str(h)) return part def sphere(x0, y0, z0, r): part = "(((X-x0)**2 + (Y-y0)**2 + (Z-z0)**2) <= r**2)" part = replace(part,'x0',str(x0)) part = replace(part,'y0',str(y0)) part = replace(part,'z0',str(z0)) part = replace(part,'r',str(r)) return part def torus(x0, y0, z0, r0, r1): part = "(((r0 - sqrt((X-x0)**2 + (Y-y0)**2))**2 + (Z-z0)**2) <= r1**2)" part = replace(part,'x0',str(x0)) part = replace(part,'y0',str(y0)) part = replace(part,'z0',str(z0)) part = replace(part,'r0',str(r0)) part = replace(part,'r1',str(r1)) return part def rectangle(x0, x1, y0, y1): part = "((X >= x0) & (X <= x1) & (Y >= y0) & (Y <= y1))" part = replace(part,'x0',str(x0)) part = replace(part,'x1',str(x1)) part = replace(part,'y0',str(y0)) part = replace(part,'y1',str(y1)) return part def cube(x0, x1, y0, y1, z0, z1): part = "((X >= x0) & (X <= x1) & (Y >= y0) & (Y <= y1) & (Z >= z0) & (Z <= z1))" part = replace(part,'x0',str(x0)) part = replace(part,'x1',str(x1)) part = replace(part,'y0',str(y0)) part = replace(part,'y1',str(y1)) part = replace(part,'z0',str(z0)) part = replace(part,'z1',str(z1)) return part def union(part1, part2): part = "(part1) | (part2)" part = replace(part,'part1',part1) part = replace(part,'part2',part2) return part def intersect(part1, part2): part = "(part1) & (part2)" part = replace(part,'part1',part1) part = replace(part,'part2',part2) return part def subtract(part1, part2): part = "(part1) & ~(part2)" part = replace(part,'part1',part1) part = replace(part,'part2',part2) return part def translate(part,dx,dy,dz): part = replace(part,'X','(X-'+str(dx)+')') part = replace(part,'Y','(Y-'+str(dy)+')') part = replace(part,'Z','(Z-'+str(dz)+')') return part def rotate_x(part, theta): part = replace(part,'Y','(cos(theta)*Y+sin(theta)*z)') part = replace(part,'Z','(-sin(theta)*Y+cos(theta)*z)') part = replace(part,'z','Z') part = replace(part,'theta',str(theta)) return part def rotate_y(part, theta): part = replace(part,'X','(cos(theta)*X+sin(theta)*z)') part = replace(part,'Z','(-sin(theta)*X+cos(theta)*z)') part = replace(part,'z','Z') part = replace(part,'theta',str(theta)) return part def rotate_z(part, theta): part = replace(part,'X','(cos(theta)*X+sin(theta)*y)') part = replace(part,'Y','(-sin(theta)*X+cos(theta)*y)') part = replace(part,'y','Y') part = replace(part,'theta',str(theta)) return part def reflect_x(part, x0): part = replace(part,'X','(x0-X)') part = replace(part,'x0',str(x0)) return part def reflect_y(part, y0): part = replace(part,'Y','(y0-Y)') part = replace(part,'y0',str(y0)) return part def reflect_z(part, z0): part = replace(part,'Z','(z0-Z)') part = replace(part,'z0',str(z0)) return part def reflect_xy(part): part = replace(part,'X','temp') part = replace(part,'Y','X') part = replace(part,'temp','Y') return part def reflect_yz(part): part = replace(part,'Y','temp') part = replace(part,'Z','Y') part = replace(part,'temp','Z') return part # # define part # castle = cube(-.6,.6,-.6,.6,-.5,.1) castle = subtract(castle,cube(-.3,.3,-.3,.3,-1,1)) tower = cylinder(0,0,-.5,.5,.2) tower = union(tower,cone(0,0,.5,.3,.2)) tower1 = translate(tower,.6,.6,0) tower2 = translate(tower,-.6,.6,0) tower3 = translate(tower,.6,-.6,0) tower4 = translate(tower,-.6,-.6,0) castle = union(castle,tower1) castle = union(castle,tower2) castle = union(castle,tower3) castle = union(castle,tower4) door = cube(-.1,.1,-.7,0,-.6,-.2) castle = subtract(castle,door) arch = cylinder(0,0,-1,0,.1) arch = reflect_yz(arch) arch = translate(arch,0,0,-.2) castle = subtract(castle,arch) battlement = cube(-.4,-.2,-.05,.05,.1,.2) battlement = union(battlement,cube(-.1,.1,-.05,.05,.1,.2)) battlement = union(battlement,cube(.2,.4,-.05,.05,.1,.2)) castle = union(castle,translate(battlement,0,-.55,0)) castle = union(castle,translate(battlement,0,.55,0)) battlement = reflect_xy(battlement) castle = union(castle,translate(battlement,-.55,0,0)) castle = union(castle,translate(battlement,.55,0,0)) # # assign part to SAT_function # SAT_function = castle