'''Generate Data for a 1/2 Sphere of points. There are 20 Points Objects with 5000 co-ordinates each. 5000 * 20 = 100,000 point object! Points Object generator: self.flag is the Action modifier for Makeshell: 0 [0,0,0] = Full Star 1 [0,0,1] = Half Star: Vertical 2 [0,1,0] = Half Star: Horizontal 3 [0,1,1] = Quarter Star 4 [1,0,0] = Magnetic + Full Star 5 [1,0,1] = Magnetic + Half Star: Vertical 6 [1,1,0] = Magnetic + Half Star: Horizontal 7 [1,1,1] = Magnetic + Quarter Star Control: Press a to animate Press x to exit''' from visual import * __copywrite__ = 'Shell - (\xa9) Symion 2009' __all__ = ['Keyscan', 'Startup', 'Huey', 'Graphic', 'Makeshell', 'Close'] mkey=['left','middle','right'] kkey=['mk.drag','mk.drop','mk.release','mk.press'] def Keyscan(): '''Respond to User mouse key input''' found=(0,0,0) if scene.mouse.events>0: mk = scene.mouse.getevent() for a in kkey: b = eval(a) # Scan for User mouse key activity if b in mkey: # Look for a key type km = mkey.index(b) # print a,b,km, # mkey[km]==b if a in kkey[1:3]: # drop or release = end of action found = (kkey.index(a),scene.mouse.pos,0) else: found = (kkey.index(a),0,scene.mouse.pos) break else: found = (-1,0,0) return found class stars: def __init__(self): self.version = 1.1 self.flag = [0,0,0] self.direct = 1.0 # control object orientation self.data = list() self.table = list() self.shell = 20 # Major impact on colour self.num = 5000 # shell*num = points per object! self.rep = 1.0/self.shell self.size=1 # points size 0|1 self.type=1 # points type 0|1 def Startup(self): '''Define scene size''' scene.visible = scene.autoscale = False scene.range = self.shell scene.background = (0,0,.1) scene.fov = .01 scene.forward=(0,0,1) scene.x,scene.y,scene.width,scene.height,scene.title = 0,0,600,600,__copywrite__ def Huey(self,hue=1): '''Build Colour List''' if hue==1: self.colour = [(1.0,i*self.rep,0.0) for i in range(self.shell)] elif hue==2: self.colour = [(1.0,0.0,i*self.rep) for i in range(self.shell)] else: self.colour = [(0.0,i*self.rep,1.0) for i in range(self.shell)] if not True: for i,f in enumerate([(1,1,0),(1,.5,0),(1,0,0)]): self.colour[i] = f def Graphic(self): '''Build multi point objects''' self.frame = frame() g = self.flag[0] for a in range(self.shell): b = self.shell-a-1 self.Makeshell(self.num,a+g,a+1) self.table.append(points(frame=self.frame, pos=self.data, shape=['round','square'][self.type], size=self.size*b, color=self.colour[b])) self.table.append(sphere(frame=self.frame, color=(6,6,6))) self.table.append(curve(frame=self.frame, pos=array(map(lambda x: (self.shell*sin(x), 0, self.shell*cos(x)), arange(0,2*pi+0.1,0.1))), color=(0,1,0))) def Makeshell(self,n,rmn,rmx): '''3D Annulus: n points (1 to 10000): rmn = Minimum radius: rmx = Maximum radius''' n = min(10000,max(1,int(n))) self.data = list() for a in range(n): if self.flag[2]: theta = random.uniform(0,pi) else: theta = random.uniform(0,2*pi) if self.flag[1]: zn = random.uniform(0,1) else: zn = random.uniform(-1,1) rn = 1.0-zn**2 if self.flag[0]: rho = random.uniform(rmn*rn,rmx*rn) else: rho = random.uniform(rmn,rmx) rxy = rho*sqrt(rn) x = rxy*cos(theta)*self.direct y = rxy*sin(theta)*self.direct z = rho*zn*self.direct self.data.append((x,y,z)) def Close(self): '''Clean up time''' for a in self.table: a.visible = False self.frame.visible = False if __name__ == '__main__': print '%s\n\n%s' %(__copywrite__,__doc__) program = stars() program.Startup() program.Huey() program.Graphic() duo = not False # 1 or 2 objects? if duo: scene.range = program.shell*2 program.frame.pos = (-program.shell,0,0) # Define second object newprog = stars() newprog.flag = [1,0,1] # Magnetic field sym newprog.num = 5000 newprog.direct = 1.0 newprog.size=0 newprog.type=0 newprog.Huey(hue=2) # Build it newprog.Graphic() newprog.frame.pos = (newprog.shell,0,0) scene.visible = True anim = True while 1: if anim: rate(2) program.frame.rotate(angle=radians(5)) #, axis=scene.up) if duo: newprog.frame.rotate(angle=radians(5)) #, axis=scene.up) else: rate(50) result = Keyscan() if result[0]>0: if result[1]==0: print kkey[result[0]],'Center at',result[2] scene.center = result[2] else: print kkey[result[0]],result[1] elif scene.kb.keys>0: ky = scene.kb.getkey() if ky in ['x','X']: break elif ky in ['a','A']: anim = (anim == False) program.Close() if duo: newprog.Close() scene.visible = False