[1264] | 1 | from visual import * |
---|
| 2 | |
---|
| 3 | class Surface: |
---|
| 4 | def __init__(self,domain,scale=1.0/1.0): |
---|
| 5 | """Create visualisation of domain |
---|
| 6 | """ |
---|
| 7 | |
---|
| 8 | self.frame = frame() |
---|
| 9 | self.bed_model = faces(frame=self.frame) |
---|
| 10 | self.stage_model = faces(frame=self.frame) |
---|
| 11 | self.domain = domain |
---|
| 12 | self.scale = scale |
---|
| 13 | |
---|
| 14 | self.vertices = domain.vertex_coordinates |
---|
| 15 | self.bed = domain.quantities['elevation'].vertex_values |
---|
| 16 | self.stage = domain.quantities['stage'].vertex_values |
---|
| 17 | |
---|
| 18 | self.max_x = max(max(self.vertices[:,0],self.vertices[:,2],self.vertices[:,4])) |
---|
| 19 | self.min_x = min(min(self.vertices[:,0],self.vertices[:,2],self.vertices[:,4])) |
---|
| 20 | self.max_y = max(max(self.vertices[:,1],self.vertices[:,3],self.vertices[:,5])) |
---|
| 21 | self.min_y = min(min(self.vertices[:,1],self.vertices[:,3],self.vertices[:,5])) |
---|
| 22 | self.range_x = self.max_x - self.min_x |
---|
| 23 | self.range_y = self.max_y - self.min_y |
---|
| 24 | |
---|
| 25 | self.range_xy = max(self.range_x, self.range_y) |
---|
| 26 | |
---|
| 27 | self.max_bed = max(self.bed) |
---|
| 28 | self.min_bed = min(self.bed) |
---|
| 29 | self.range_bed = self.max_bed - self.min_bed |
---|
| 30 | |
---|
| 31 | print self.max_x, self.min_x, self.max_y, self.min_y, self.min_bed |
---|
| 32 | print self.max_bed, self.range_x, self.range_y, self.range_xy, self.range_bed |
---|
| 33 | |
---|
| 34 | print 'Calculating triangles' |
---|
| 35 | |
---|
| 36 | self.pos = zeros( (6*len(domain),3), Float) |
---|
| 37 | self.colour = zeros( (6*len(domain),3), Float) |
---|
| 38 | self.normals = zeros( (6*len(domain),3), Float) |
---|
| 39 | |
---|
| 40 | print 'keys',self.domain.quantities.keys() |
---|
| 41 | print 'shape of stage',shape(self.stage) |
---|
| 42 | |
---|
| 43 | self.update_all() |
---|
| 44 | |
---|
| 45 | def update_all(self): |
---|
| 46 | |
---|
| 47 | self.update_bed() |
---|
| 48 | self.update_stage() |
---|
| 49 | |
---|
| 50 | def update_bed(self): |
---|
| 51 | |
---|
| 52 | print 'update bed arrays' |
---|
| 53 | c0 = 0.3 |
---|
| 54 | c1 = 0.3 |
---|
| 55 | c2 = 0.3 |
---|
| 56 | self.update_arrays(self.bed, (c0,c1,c2) ) |
---|
| 57 | print 'update bed image' |
---|
| 58 | self.bed_model.pos = self.pos |
---|
| 59 | self.bed_model.color = self.colour |
---|
| 60 | self.bed_model.normal = self.normals |
---|
| 61 | |
---|
| 62 | |
---|
| 63 | def update_stage(self): |
---|
| 64 | c0 = 0.1 |
---|
| 65 | c1 = 0.4 |
---|
| 66 | c2 = 0.99 |
---|
| 67 | print 'update stage arrays' |
---|
| 68 | self.update_arrays(self.stage, (c0,c1,c2) ) |
---|
| 69 | print 'update stage image' |
---|
| 70 | self.stage_model.pos = self.pos |
---|
| 71 | self.stage_model.color = self.colour |
---|
| 72 | self.stage_model.normal = self.normals |
---|
| 73 | |
---|
| 74 | def calc_normal(self,v): |
---|
| 75 | |
---|
| 76 | from math import sqrt |
---|
| 77 | |
---|
| 78 | cross = zeros(3,Float) |
---|
| 79 | normal = zeros(3,Float) |
---|
| 80 | |
---|
| 81 | v10 = v[1,:]-v[0,:] |
---|
| 82 | v20 = v[2,:]-v[0,:] |
---|
| 83 | |
---|
| 84 | normal[0] = v10[1]*v20[2] - v20[1]*v10[2] |
---|
| 85 | normal[1] = v10[2]*v20[0] - v20[2]*v10[0] |
---|
| 86 | normal[2] = v10[0]*v20[1] - v20[0]*v10[1] |
---|
| 87 | |
---|
| 88 | norm = sqrt( normal[0]**2 + normal[1]**2 + normal[2]**2) |
---|
| 89 | |
---|
| 90 | normal[0] = normal[0]/norm |
---|
| 91 | normal[1] = normal[1]/norm |
---|
| 92 | normal[2] = normal[2]/norm |
---|
| 93 | |
---|
| 94 | return normal |
---|
| 95 | |
---|
| 96 | |
---|
| 97 | |
---|
| 98 | def update_arrays(self, quantity, qcolor): |
---|
| 99 | |
---|
| 100 | col = asarray(qcolor) |
---|
| 101 | v = zeros( (3,3), Float) |
---|
| 102 | normal = zeros( 3, Float) |
---|
| 103 | N = len(self.domain) |
---|
| 104 | scale = self.scale |
---|
| 105 | |
---|
| 106 | |
---|
| 107 | |
---|
| 108 | for i in range( N ): |
---|
| 109 | |
---|
| 110 | for j in range(3): |
---|
| 111 | v[j,0] = 2.0*(self.vertices[i,2*j ]-self.min_x)/self.range_xy-1.0 |
---|
| 112 | v[j,1] = 2.0*(self.vertices[i,2*j+1]-self.min_y)/self.range_xy-1.0 |
---|
| 113 | v[j,2] = quantity[i,j]*scale |
---|
| 114 | |
---|
| 115 | |
---|
| 116 | |
---|
| 117 | normal = self.calc_normal(v) |
---|
| 118 | |
---|
| 119 | self.pos[6*i ,:] = v[0,:] |
---|
| 120 | self.pos[6*i+1,:] = v[1,:] |
---|
| 121 | self.pos[6*i+2,:] = v[2,:] |
---|
| 122 | self.pos[6*i+3,:] = v[0,:] |
---|
| 123 | self.pos[6*i+4,:] = v[2,:] |
---|
| 124 | self.pos[6*i+5,:] = v[1,:] |
---|
| 125 | |
---|
| 126 | |
---|
| 127 | |
---|
| 128 | self.colour[6*i ,:] = col |
---|
| 129 | self.colour[6*i+1,:] = col |
---|
| 130 | self.colour[6*i+2,:] = col |
---|
| 131 | self.colour[6*i+3,:] = col |
---|
| 132 | self.colour[6*i+4,:] = col |
---|
| 133 | self.colour[6*i+5,:] = col |
---|
| 134 | |
---|
| 135 | self.normals[6*i ,:] = normal |
---|
| 136 | self.normals[6*i+1,:] = normal |
---|
| 137 | self.normals[6*i+2,:] = normal |
---|
| 138 | self.normals[6*i+3,:] = -normal |
---|
| 139 | self.normals[6*i+4,:] = -normal |
---|
| 140 | self.normals[6*i+5,:] = -normal |
---|
| 141 | |
---|
| 142 | |
---|
| 143 | |
---|
| 144 | |
---|
| 145 | #scene.width = 1000 |
---|
| 146 | #scene.height = 800 |
---|
| 147 | |
---|
| 148 | #Original |
---|
| 149 | #scene.center = (0.5,0.5,0) |
---|
| 150 | #scene.forward = vector(-0.1, 0.5, -0.5) |
---|
| 151 | |
---|
| 152 | #Temporary (for bedslope) |
---|
| 153 | #scene.forward = vector(0.0006, 0.7, -0.03) |
---|
| 154 | |
---|
| 155 | |
---|
| 156 | #Temporary for hackett - begin |
---|
| 157 | #scene.autoscale = 0 |
---|
| 158 | #scene.scale = (0.002, 0.002, 0.01) #Scale z so that countours stand out more |
---|
| 159 | #scene.center = (300.0,500.0,-10) |
---|
| 160 | #Temporary for hackett - end |
---|
| 161 | |
---|
| 162 | |
---|
| 163 | #scene.ambient = 0.4 |
---|
| 164 | #scene.lights = [(0.6, 0.3, 0.2), (0.1, -0.5, 0.4), (-0.1, 0.1, -0.4), |
---|
| 165 | # (-0.2, 0.2, 0.1)] |
---|
| 166 | |
---|
| 167 | |
---|
| 168 | def create_surface(domain): |
---|
| 169 | |
---|
| 170 | surface = Surface(domain) |
---|
| 171 | domain.surface = surface |
---|
| 172 | |
---|
| 173 | def update(domain): |
---|
| 174 | |
---|
| 175 | surface = domain.surface |
---|
| 176 | surface.update_stage() |
---|
| 177 | |
---|
| 178 | |
---|
| 179 | |
---|