def drawTerrain(terrainFaces, terrainShades, style="flat"): if ag.spin >= radians(0) and ag.spin < radians(90): terrainFaces.sort(key=lambda i: -i[0][0]-i[0][1]-.5*i[1][0]) elif ag.spin >= radians(90) and ag.spin < radians(135): terrainFaces.sort(key=lambda i: i[0][1]-i[0][0]-.5*i[1][0]) elif ag.spin >= radians(135) and ag.spin < radians(180): terrainFaces.sort(key=lambda i: i[0][1]-i[0][0]+.5*i[1][0]) elif ag.spin >= radians(180) and ag.spin < radians(270): terrainFaces.sort(key=lambda i: i[0][0]+i[0][1]+.5*i[1][0]) elif ag.spin >= radians(270) and ag.spin < radians(315): terrainFaces.sort(key=lambda i: i[0][0]-i[0][1]+.5*i[1][0]) elif ag.spin >= radians(315) and ag.spin < radians(360): terrainFaces.sort(key=lambda i: i[0][0]-i[0][1]-.5*i[1][0]) for face in terrainFaces: p3d.gridDrawPolygon(face, terrainShades[face], style)
def drawSierpinski(peaks, color=ag.LINECOLOR, style="filledwire"): def shade(color, ratio=1): newcolor = [int( (x*ratio) ) for x in color] for x in range(len(newcolor)): if newcolor[x] > 255: newcolor[x] = 255 if newcolor[x] < 0: newcolor[x] = 0 return newcolor heightPerLevel = 1; sizeOfSide=1; top=0 if len(peaks) > 1: peaks.sort(key=lambda i: -i[2] ) heightPerLevel = peaks[0][2] - peaks[1][2] sizeOfSide = 2 * abs( peaks[0][0] - peaks[1][0] ) top = peaks[0][2] numLevels = top / heightPerLevel # Sort peaks by draw distance if ag.spin >= radians(0) and ag.spin < radians(90): peaks.sort(key=lambda i: -i[0]-i[1]+1000*i[2] ) elif ag.spin >= radians(90) and ag.spin < radians(180): peaks.sort(key=lambda i: -i[0]+i[1]+1000*i[2] ) elif ag.spin >= radians(180) and ag.spin < radians(270): peaks.sort(key=lambda i: i[0]+i[1]+1000*i[2] ) elif ag.spin >= radians(270) and ag.spin < radians(360): peaks.sort(key=lambda i: i[0]-i[1]+1000*i[2] ) # For each peak, draw faces in order of draw distance faces = [] for point in peaks: base = point[2] - heightPerLevel x1 = point[0]-sizeOfSide/2 y1 = point[1]-sizeOfSide/2 x2 = point[0]+sizeOfSide/2 y2 = point[1]+sizeOfSide/2 faces.append( ( point, (x1,y1,base), (x2,y1,base) ) ) faces.append( ( point, (x1,y2,base), (x2,y2,base) ) ) faces.append( ( point, (x1,y1,base), (x1,y2,base) ) ) faces.append( ( point, (x2,y1,base), (x2,y2,base) ) ) if ag.spin < radians(45): faces.sort(key=lambda i: -i[1][0]-3*i[1][1] - i[2][0]-3*i[2][1] ) elif ag.spin < radians(90): faces.sort(key=lambda i: -3*i[1][0]-i[1][1] - 3*i[2][0]-i[2][1] ) elif ag.spin < radians(135): faces.sort(key=lambda i: -3*i[1][0]+i[1][1] - 3*i[2][0]+i[2][1] ) elif ag.spin < radians(180): faces.sort(key=lambda i: -i[1][0]+3*i[1][1] - i[2][0]+3*i[2][1] ) elif ag.spin < radians(225): faces.sort(key=lambda i: i[1][0]+3*i[1][1] + i[2][0]+3*i[2][1] ) elif ag.spin < radians(270): faces.sort(key=lambda i: 3*i[1][0]+i[1][1] + 3*i[2][0]+i[2][1] ) elif ag.spin < radians(315): faces.sort(key=lambda i: 3*i[1][0]-i[1][1] + 3*i[2][0]-i[2][1] ) else: faces.sort(key=lambda i: i[1][0]-3*i[1][1] + i[2][0]-3*i[2][1] ) #faces.sort(key=lambda i: -i[0]+i[1]-10000*i[2]) for ii in range(len(faces)): drawColor = color if point[2] != top: drawColor = shade(color, 1.0*point[2]/top ) p3d.gridDrawPolygon(faces[0], drawColor, style) faces.pop(0)
return sampleCubes def drawCubeList(cubes, style="filledwire"): # drawCubes orders the provided list of cubes such that they're drawn back to front if ag.spin >= radians(0) and ag.spin < radians(90): cubes.sort(key=lambda i: -i[0][0]-i[0][1]) elif ag.spin >= radians(90) and ag.spin < radians(180): cubes.sort(key=lambda i: -i[0][0]+i[0][1]) elif ag.spin >= radians(180) and ag.spin < radians(270): cubes.sort(key=lambda i: i[0][0]+i[0][1]) elif ag.spin >= radians(270) and ag.spin < radians(360): cubes.sort(key=lambda i: i[0][0]-i[0][1]) for cube in cubes: drawCube(cube[0], cube[1], cube[2], style) def drawCube((x1,y1,z1),(x2,y2,z2),color=ag.LINECOLOR, style="filledwire"): # drawCube takes two opposite corners of a cube and a color and # draws two front faces (based on rotation), then the top face if ag.spin < radians(90) or ag.spin > radians(270): p3d.gridDrawPolygon([(x1,y1,z1),(x1,y1,z2),(x2,y1,z2),(x2,y1,z1)],color,style) if ag.spin > radians(90) and ag.spin < radians(270): p3d.gridDrawPolygon([(x1,y2,z1),(x1,y2,z2),(x2,y2,z2),(x2,y2,z1)],color,style) if ag.spin < radians(180): p3d.gridDrawPolygon([(x1,y1,z1),(x1,y1,z2),(x1,y2,z2),(x1,y2,z1)],color,style) if ag.spin > radians(180): p3d.gridDrawPolygon([(x2,y1,z1),(x2,y1,z2),(x2,y2,z2),(x2,y2,z1)],color,style) p3d.gridDrawPolygon([(x1,y1,z2),(x2,y1,z2),(x2,y2,z2),(x1,y2,z2)],color,style) def genSampleTerrain(size, scale=50): array = [] randomshift = random.randint(-scale,scale) for ii in range(size): array.append([])