def test_rotate(self): from chempy import cpv from math import pi get_coord_list = lambda s: cmd.get_model(s).get_coord_list() cmd.fragment('ala') cmd.select('s1', 'hydro') c1_hydro = get_coord_list('s1') c1_other = get_coord_list('not s1') c1_hydro_rot = cpv.transform_array( cpv.rotation_matrix(pi * 0.25, [0,0,1]), c1_hydro) cmd.rotate('z', 45, 's1', camera=0, origin=(0,0,0)) c2_hydro = get_coord_list('s1') c2_other = get_coord_list('not s1') self.assertArrayEqual(c2_other, c1_other) self.assertArrayEqual(c2_hydro, c1_hydro_rot, 0.001)
def test_rotate(self): from chempy import cpv from math import pi get_coord_list = lambda s: cmd.get_model(s).get_coord_list() cmd.fragment('ala') cmd.select('s1', 'hydro') c1_hydro = get_coord_list('s1') c1_other = get_coord_list('not s1') c1_hydro_rot = cpv.transform_array( cpv.rotation_matrix(pi * 0.25, [0, 0, 1]), c1_hydro) cmd.rotate('z', 45, 's1', camera=0, origin=(0, 0, 0)) c2_hydro = get_coord_list('s1') c2_other = get_coord_list('not s1') self.assertArrayEqual(c2_other, c1_other) self.assertArrayEqual(c2_hydro, c1_hydro_rot, 0.001)
def torus(center=(0., 0., 0.), normal=(0., 0., 1.), radius=1., color='', cradius=.25, samples=20, csamples=20): ''' Generate and return a torus CGO with given center, normal and ring radius. ''' from math import cos, sin, pi if color and isinstance(color, str): color = list(cmd.get_color_tuple(color)) obj = [] axis = cpv.cross_product(normal, (0., 0., 1.)) angle = -cpv.get_angle(normal, (0., 0., 1.)) matrix = cpv.rotation_matrix(angle, cpv.normalize(axis)) obj_vertex = lambda x, y, z: obj.extend([VERTEX] + cpv.add(center, cpv.transform(matrix, [x, y, z]))) obj_normal = lambda x, y, z: obj.extend([NORMAL] + cpv.transform(matrix, [x, y, z])) r = radius cr = cradius rr = 1.5 * cr dv = 2 * pi / csamples dw = 2 * pi / samples v = 0.0 w = 0.0 while w < 2 * pi: v = 0.0 c_w = cos(w) s_w = sin(w) c_wdw = cos(w + dw) s_wdw = sin(w + dw) obj.append(BEGIN) obj.append(TRIANGLE_STRIP) if color: obj.append(COLOR) obj.extend(color) while v < 2 * pi + dv: c_v = cos(v) s_v = sin(v) c_vdv = cos(v + dv) s_vdv = sin(v + dv) obj_normal( (r + rr * c_v) * c_w - (r + cr * c_v) * c_w, (r + rr * c_v) * s_w - (r + cr * c_v) * s_w, (rr * s_v - cr * s_v)) obj_vertex( (r + cr * c_v) * c_w, (r + cr * c_v) * s_w, cr * s_v) obj_normal( (r + rr * c_vdv) * c_wdw - (r + cr * c_vdv) * c_wdw, (r + rr * c_vdv) * s_wdw - (r + cr * c_vdv) * s_wdw, rr * s_vdv - cr * s_vdv) obj_vertex( (r + cr * c_vdv) * c_wdw, (r + cr * c_vdv) * s_wdw, cr * s_vdv) v += dv obj.append(END) w += dw return obj
def torus(center=(0., 0., 0.), normal=(0., 0., 1.), radius=1., color='', cradius=.25, samples=20, csamples=20, _self=cmd): ''' Generate and return a torus CGO with given center, normal and ring radius. ''' from math import cos, sin, pi if color and isinstance(color, str): color = list(_self.get_color_tuple(color)) obj = [] axis = cpv.cross_product(normal, (0., 0., 1.)) angle = -cpv.get_angle(normal, (0., 0., 1.)) matrix = cpv.rotation_matrix(angle, cpv.normalize(axis)) obj_vertex = lambda x, y, z: obj.extend([VERTEX] + cpv.add(center, cpv.transform(matrix, [x, y, z]))) obj_normal = lambda x, y, z: obj.extend([NORMAL] + cpv.transform(matrix, [x, y, z])) r = radius cr = cradius rr = 1.5 * cr dv = 2 * pi / csamples dw = 2 * pi / samples v = 0.0 w = 0.0 while w < 2 * pi: v = 0.0 c_w = cos(w) s_w = sin(w) c_wdw = cos(w + dw) s_wdw = sin(w + dw) obj.append(BEGIN) obj.append(TRIANGLE_STRIP) if color: obj.append(COLOR) obj.extend(color) while v < 2 * pi + dv: c_v = cos(v) s_v = sin(v) c_vdv = cos(v + dv) s_vdv = sin(v + dv) obj_normal( (r + rr * c_v) * c_w - (r + cr * c_v) * c_w, (r + rr * c_v) * s_w - (r + cr * c_v) * s_w, (rr * s_v - cr * s_v)) obj_vertex( (r + cr * c_v) * c_w, (r + cr * c_v) * s_w, cr * s_v) obj_normal( (r + rr * c_vdv) * c_wdw - (r + cr * c_vdv) * c_wdw, (r + rr * c_vdv) * s_wdw - (r + cr * c_vdv) * s_wdw, rr * s_vdv - cr * s_vdv) obj_vertex( (r + cr * c_vdv) * c_wdw, (r + cr * c_vdv) * s_wdw, cr * s_vdv) v += dv obj.append(END) w += dw return obj
def rebuild(self) -> None: """ Rebuilds torus """ obj = [] axis = cpv.cross_product(self.normal.array(), (0., 0., 1.)) angle = -cpv.get_angle(self.normal.array(), (0., 0., 1.)) matrix = cpv.rotation_matrix(angle, cpv.normalize(axis)) def obj_vertex(x, y, z): return [cgo.VERTEX] + cpv.add(self.center.array(), cpv.transform(matrix, [x, y, z])) def obj_normal(x, y, z): return [cgo.NORMAL] + cpv.transform(matrix, [x, y, z]) r = self.radius cr = self.cradius rr = 1.5 * cr dv = 2 * math.pi / self.csamples dw = 2 * math.pi / self.samples v = 0.0 w = 0.0 while w < 2 * math.pi: v = 0.0 c_w = math.cos(w) s_w = math.sin(w) c_wdw = math.cos(w + dw) s_wdw = math.sin(w + dw) obj.append(cgo.BEGIN) obj.append(cgo.TRIANGLE_STRIP) obj.append(cgo.COLOR) obj.extend(self.color.array()) while v < 2 * math.pi + dv: c_v = math.cos(v) s_v = math.sin(v) c_vdv = math.cos(v + dv) s_vdv = math.sin(v + dv) obj.extend( obj_normal((r + rr * c_v) * c_w - (r + cr * c_v) * c_w, (r + rr * c_v) * s_w - (r + cr * c_v) * s_w, (rr * s_v - cr * s_v))) obj.extend( obj_vertex((r + cr * c_v) * c_w, (r + cr * c_v) * s_w, cr * s_v)) obj.extend( obj_normal( (r + rr * c_vdv) * c_wdw - (r + cr * c_vdv) * c_wdw, (r + rr * c_vdv) * s_wdw - (r + cr * c_vdv) * s_wdw, rr * s_vdv - cr * s_vdv)) obj.extend( obj_vertex((r + cr * c_vdv) * c_wdw, (r + cr * c_vdv) * s_wdw, cr * s_vdv)) v += dv obj.append(cgo.END) w += dw self._data = obj