예제 #1
0
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)
예제 #2
0
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)
예제 #3
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([])