#!/usr/bin/env python # Graphical representation of sorting import time import random import sys import os from math import pi,cos,sin from numpy import * import vtk L = 1 Lz = 0.5 nnum = 100 Lx = 10.0/float(nnum) # Create the Renderer, RenderWindow, and RenderWindowInteractor ren = vtk.vtkRenderer() renWin = vtk.vtkRenderWindow() renWin.AddRenderer(ren) renWin.SetSize(640, 480) cub_actors = [] txt_actors = [] xcubes = [] xcube = -Lx*nnum/2 vals = [] maxval = 100 for k in range(nnum): val = random.randint(0,maxval) vals.append(val) cube = vtk.vtkCubeSource() cube.SetXLength(Lx) cube.SetYLength(L) cube.SetZLength(Lz) cubMapper = vtk.vtkPolyDataMapper() cubMapper.SetInputConnection(cube.GetOutputPort() ) cubMapper.ScalarVisibilityOff() cub_actor = vtk.vtkActor() cub_actor.SetMapper(cubMapper) cub_actor.SetPosition(xcube,0.0,0.0) cub_actor = vtk.vtkActor() cub_actor.SetMapper(cubMapper) cub_actor.SetPosition(xcube,0.0,0.0) alpha = float(val)/float(maxval) prop = cub_actor.GetProperty() if alpha<0.5: alpha *= 2.0 prop.SetColor(0,alpha,1-alpha) else: alpha = 2*(alpha-0.5) prop.SetColor(alpha,1-alpha,0.0) prop.SetOpacity(1.0) prop.SetSpecular(1.0) prop.SetDiffuse(1.) prop.EdgeVisibilityOn() text = vtk.vtkVectorText() text.SetText(str(val)) txtMapper = vtk.vtkPolyDataMapper() txtMapper.SetInputConnection(text.GetOutputPort() ) txt_actor = vtk.vtkActor() txt_actor.SetMapper(txtMapper) txt_actor.SetPosition(xcube-L/2,-0.25*L,Lz/2+0.1) prop = txt_actor.GetProperty() prop.SetColor(0,0,0) # Add the actors to the renderer ren.AddActor(cub_actor) # ren.AddActor(txt_actor) cub_actors.append(cub_actor) txt_actors.append(txt_actor) xcubes.append(xcube) xcube += Lx ren.SetBackground(0.7,0.7,0.7) cam = ren.GetActiveCamera() cam.SetViewUp(0.,1.,0.); cam.SetFocalPoint(-1,0,0) ## This is used to store the frames ## for creating a movie w2i = vtk.vtkWindowToImageFilter() w2i.SetInput(renWin) w2i.Update() ## The TIFF writer writer = vtk.vtkTIFFWriter() writer.SetInputConnection(w2i.GetOutputPort()) writer.SetCompressionToJPEG() xcam = array([-5,3,8]) xcam *= 1.5 cam.SetPosition(xcam) def replot(i,z): cub_actors[i].SetPosition(xcubes[i],0.0,z) txt_actors[i].SetPosition(xcubes[i]-L/2,-0.25*L,z+Lz/2+0.1) def swap(v,i,j): tmp = v[i] v[i] = v[j] v[j] = tmp def exchange(i,j,exc): nfx = 1 xcubei0 = xcubes[i] xcubej0 = xcubes[j] for k in range(nfx): fac = exc*float(k+1)/float(nfx) xcubes[i] = xcubei0 + fac*(xcubej0-xcubei0) xcubes[j] = xcubej0 - fac*(xcubej0-xcubei0) replot(i,0.1) replot(j,0.2) renWin.Render() time.sleep(0.005) replot(i,0) replot(j,0) renWin.Render() if exc: swap(cub_actors,i,j) swap(txt_actors,i,j) swap(xcubes,i,j) swap(vals,i,j) def bubble(): # Bubble sort for k in range(0,nnum-1): for l in range(nnum-1,k,-1): if vals[l]pivot: ok = 1 pivot = vals[k] break if not ok: # print "(%d,%d) done" % (j1,j2) return j2 # print vals l=j1 r=j2-1 while True: while vals[l]=pivot: r -= 1 # print "vals[l=%d] %d, vals[r=%d] = %d" % (l,vals[l],r,vals[r]) if l>r: break exchange(r,l,1) # tmp = vals[l] # vals[l] = vals[r] # vals[r] = tmp # print "pivot ", pivot, vals return l def quick(j1,j2): # print "entering quick(%d,%d)" % (j1,j2) if j2-j1<=1: return l = partition(j1,j2) if l==j2: return quick(j1,l) quick(l,j2) raw_input("Enter something: ") method = 'q' if len(sys.argv)>=2: method = sys.argv[1] if method == 'q': quick(0,nnum) else: bubble() print "done" raw_input("Enter something: ")