示例#1
0
def flashlight(phi=np.pi/4, direction=(0,0,1), size=None, dtype=np.double):
    theta, u = np.random.uniform(0.0, 2*np.pi, size), \
        np.random.uniform(np.cos(phi), 1, size)

    c = np.sqrt(1-u**2)

    if np.equal(direction, (0,0,1)).all():
        rotation_axis = (0,0,1)
        rotation_angle = 0.0
    else:
        rotation_axis = np.cross((0,0,1), direction)
        rotation_angle = \
            -np.arccos(np.dot(direction, (0,0,1))/np.linalg.norm(direction))

    if size is None:
        return rotate(np.array([c*np.cos(theta), c*np.sin(theta), u]),
                      rotation_angle, rotation_axis)

    points = np.empty((size, 3), dtype)

    points[:,0] = c*np.cos(theta)
    points[:,1] = c*np.sin(theta)
    points[:,2] = u

    return rotate(points, rotation_angle, rotation_axis)
示例#2
0
def laser(radius, hwhm, direction=(0, 0, 1), size=None, dtype=np.double):
    """
    Creates a collimated laser source (positions) with Lorentzian (Cauchy) distribution.
    CURRENTLY DEPRECATED
    """
    r, theta = lineshape(radius, hwhm, size)  #Theta aziumthal

    if np.equal(direction, (0, 0, 1)).all():
        rotation_axis = (0, 0, 1)
        rotation_angle = 0.0
    else:
        rotation_axis = np.cross((0, 0, 1), direction)
        rotation_angle = -np.arccos(
            np.dot(direction, (0, 0, 1)) / np.linalg.norm(direction))

    if size == None:
        raise Exception("laser: size is None!")

    points = np.empty((size, 3), dtype)

    points[:, 0] = r * np.cos(theta)
    points[:, 1] = r * np.sin(theta)
    points[:, 2] = np.zeros(size)

    return rotate(points, rotation_angle, rotation_axis)
示例#3
0
def test_rotate():
    n = nthreads_per_block * blocks

    a = np.random.rand(n, 3).astype(np.float32)
    t = np.random.rand(n).astype(np.float32) * 2 * np.pi
    w = normalize(np.random.rand(3))

    a_gpu = ga.to_gpu(to_float3(a))
    t_gpu = ga.to_gpu(t)

    dest_gpu = ga.empty(n, dtype=ga.vec.float3)

    t0 = time.time()
    rotate_gpu(a_gpu,
               t_gpu,
               ga.vec.make_float3(*w),
               dest_gpu,
               block=(nthreads_per_block, 1, 1),
               grid=(blocks, 1))
    autoinit.context.synchronize()
    elapsed = time.time() - t0

    print('elapsed %f sec' % elapsed)

    r = rotate(a, t, w)

    assert np.allclose(r,
                       dest_gpu.get().view(np.float32).reshape((-1, 3)),
                       atol=1e-5)
示例#4
0
    def rotate_around_point(self, phi, n, point, redraw=True):
        self.axis1 = rotate(self.axis1, phi, n)
        self.axis2 = rotate(self.axis2, phi, n)

        if self.display3d:
            self.rays1.rotate_around_point(phi, n, point)
            self.rays2.rotate_around_point(phi, n, point)
            self.scope_rays.rotate_around_point(phi, n, point)
        else:
            self.rays.rotate_around_point(phi, n, point)

        if redraw:
            if self.hybrid_render:
                self.clear_image()

            self.update()
示例#5
0
    def rotate_around_point(self, phi, n, point, redraw=True):
        self.axis1 = rotate(self.axis1, phi, n)
        self.axis2 = rotate(self.axis2, phi, n)

        if self.display3d:
            self.rays1.rotate_around_point(phi, n, point)
            self.rays2.rotate_around_point(phi, n, point)
            self.scope_rays.rotate_around_point(phi, n, point)
        else:
            self.rays.rotate_around_point(phi, n, point)

        if redraw:
            if self.hybrid_render:
                self.clear_image()

            self.update()
示例#6
0
def rotate_extrude(x, y, nsteps=64):
    """
    Return the solid mesh formed by extruding the profile defined by the x and
    y points `x` and `y` around the y axis.

    .. note::
        The path traced by the points `x` and `y` should go counter-clockwise,
        otherwise the mesh will be inside out.

    Example:
        >>> # create a bipyramid
        >>> m = rotate_extrude([0,1,0], [-1,0,1], nsteps=4)
    """
    if len(x) != len(y):
        raise Exception('`x` and `y` arrays must have the same length.')

    points = np.array([x, y, np.zeros(len(x))]).transpose()

    steps = np.linspace(0, 2 * np.pi, nsteps, endpoint=False)
    vertices = np.vstack(
        [rotate(points, angle, (0, -1, 0)) for angle in steps])
    triangles = mesh_grid(
        np.arange(len(vertices)).reshape(
            (len(steps), len(points))).transpose()[::-1])

    return Mesh(vertices, triangles, remove_duplicate_vertices=True)
示例#7
0
    def rotate(self, phi, n):
        if self.display3d:
            self.rays1.rotate(phi, n)
            self.rays2.rotate(phi, n)
            self.scope_rays.rotate(phi, n)

            self.point1 = rotate(self.point1, phi, n)
            self.point2 = rotate(self.point2, phi, n)
        else:
            self.rays.rotate(phi, n)

        self.point = rotate(self.point, phi, n)
        self.axis1 = rotate(self.axis1, phi, n)
        self.axis2 = rotate(self.axis2, phi, n)

        if self.hybrid_render:
            self.clear_image()

        self.update()
示例#8
0
    def rotate(self, phi, n):
        if self.display3d:
            self.rays1.rotate(phi, n)
            self.rays2.rotate(phi, n)
            self.scope_rays.rotate(phi, n)

            self.point1 = rotate(self.point1, phi, n)
            self.point2 = rotate(self.point2, phi, n)
        else:
            self.rays.rotate(phi, n)

        self.point = rotate(self.point, phi, n)
        self.axis1 = rotate(self.axis1, phi, n)
        self.axis2 = rotate(self.axis2, phi, n)

        if self.hybrid_render:
            self.clear_image()

        self.update()
示例#9
0
文件: make.py 项目: BenLand100/chroma
def rotate_extrude(x, y, nsteps=64):
    """
    Return the solid mesh formed by extruding the profile defined by the x and
    y points `x` and `y` around the y axis.

    .. note::
        The path traced by the points `x` and `y` should go counter-clockwise,
        otherwise the mesh will be inside out.

    Example:
        >>> # create a bipyramid
        >>> m = rotate_extrude([0,1,0], [-1,0,1], nsteps=4)
    """
    if len(x) != len(y):
        raise Exception('`x` and `y` arrays must have the same length.')

    points = np.array([x,y,np.zeros(len(x))]).transpose()

    steps = np.linspace(0, 2*np.pi, nsteps, endpoint=False)
    vertices = np.vstack([rotate(points,angle,(0,-1,0)) for angle in steps])
    triangles = mesh_grid(np.arange(len(vertices)).reshape((len(steps),len(points))).transpose()[::-1])

    return Mesh(vertices, triangles, remove_duplicate_vertices=True)
示例#10
0
    def process_event(self, event):
        if event.type == MOUSEBUTTONDOWN:
            if event.button == 4:
                v = self.scale * np.cross(self.axis1, self.axis2) / 10.0
                self.translate(v)

            elif event.button == 5:
                v = -self.scale * np.cross(self.axis1, self.axis2) / 10.0
                self.translate(v)

            elif event.button == 1:
                mouse_position = pygame.mouse.get_rel()
                self.clicked = True

        elif event.type == MOUSEBUTTONUP:
            if event.button == 1:
                self.clicked = False

        elif event.type == MOUSEMOTION and self.clicked:
            movement = np.array(pygame.mouse.get_rel())

            if (movement == 0).all():
                return

            length = np.linalg.norm(movement)

            mouse_direction = movement[0] * self.axis2 - movement[
                1] * self.axis1
            mouse_direction /= np.linalg.norm(mouse_direction)

            if pygame.key.get_mods() & (KMOD_LSHIFT | KMOD_RSHIFT):
                v = -mouse_direction * self.scale * length / float(self.width)
                self.translate(v)
            else:
                phi = np.float32(2 * np.pi * length / float(self.width))
                n = rotate(mouse_direction, np.pi / 2,
                           np.cross(self.axis1, self.axis2))

                if pygame.key.get_mods() & KMOD_LCTRL:
                    self.rotate_around_point(phi, n, self.point)
                else:
                    self.rotate(phi, n)

        elif event.type == KEYDOWN:
            if event.key == K_LALT or event.key == K_RALT:
                if self.motion == 'coarse':
                    self.scale = self.mesh_diagonal_norm / 20.0
                    self.motion = 'fine'
                elif self.motion == 'fine':
                    self.scale = self.mesh_diagonal_norm / 400.0
                    self.motion = 'superfine'
                elif self.motion == 'superfine':
                    self.scale = self.mesh_diagonal_norm
                    self.motion = 'coarse'

            elif event.key == K_F6:
                self.clear_xyz_lookup()
                self.clear_image()
                self.source_position = self.point

            elif event.key == K_F7:
                for i in range(100):
                    self.update_xyz_lookup(self.point)
                self.source_position = self.point

            elif event.key == K_F11:
                pygame.display.toggle_fullscreen()

            elif event.key == K_ESCAPE:
                self.done = True
                return

            elif event.key == K_EQUALS:
                if self.alpha_depth < self.max_alpha_depth:
                    self.alpha_depth += 1
                self.update()

            elif event.key == K_MINUS:
                if self.alpha_depth > 1:
                    self.alpha_depth -= 1
                    self.update()

            elif event.key == K_PAGEDOWN:
                if self.currentlayer is None:
                    self.currentlayer = None
                else:
                    if self.currentlayer > 0:
                        self.currentlayer -= 1
                    else:
                        self.currentlayer = None

                self.loadlayer(self.currentlayer)

            elif event.key == K_PAGEUP:
                if self.currentlayer is None:
                    self.currentlayer = 0
                else:
                    if self.currentlayer < self.bvh_layer_count:
                        self.currentlayer += 1
                    else:
                        self.currentlayer = None

                self.loadlayer(self.currentlayer)

            elif event.key == K_3:
                if self.display3d:
                    self.disable3d()
                else:
                    self.enable3d()
                self.update()

            elif event.key == K_g:
                self.green_magenta = not self.green_magenta
                self.update()

            elif event.key == K_F12:
                self.screenshot()

            elif event.key == K_F5:
                if not hasattr(self, 'rng_states_gpu'):
                    self.initialize_render()

                self.hybrid_render = not self.hybrid_render
                self.clear_image()
                self.update()

            elif event.key == K_m:
                if self.movie:
                    encode_movie(self.movie_dir)
                    self.movie_dir = None
                    self.movie = False
                else:
                    self.movie_index = 0
                    self.movie_dir = tempfile.mkdtemp()
                    self.movie = True

        elif event.type == pygame.SYSWMEVENT and self.spnav:
            # Space Navigator controls
            spnav_event = self.spnav_module.spnav_x11_event(event.event)
            if spnav_event is None:
                return

            if spnav_event.ev_type == self.spnav_module.SPNAV_EVENT_MOTION:
                if pygame.key.get_mods() & (KMOD_LSHIFT | KMOD_RSHIFT):
                    accelerate_factor = 2.0
                else:
                    accelerate_factor = 1.0

                v1 = self.axis1
                v2 = self.axis2
                v3 = np.cross(self.axis1, self.axis2)

                x, y, z = spnav_event.translation
                rx, ry, rz = spnav_event.rotation

                v = v2 * x + v1 * y + v3 * z
                v *= self.scale / 5000.0 * accelerate_factor

                self.translate(v, redraw=False)

                axis = -v2 * rx - v1 * ry - v3 * rz

                if (axis != 0).any():
                    axis = axis.astype(float)
                    length = np.linalg.norm(axis)
                    angle = length * 0.0001 * accelerate_factor
                    axis /= length
                    self.rotate_around_point(angle,
                                             axis,
                                             self.point,
                                             redraw=False)

                if self.hybrid_render:
                    self.clear_image()

                self.update()
                pygame.event.clear(pygame.SYSWMEVENT)

            elif spnav_event.ev_type == self.spnav_module.SPNAV_EVENT_BUTTON:
                if spnav_event.bnum == 0 and spnav_event.press:
                    if not hasattr(self, 'rng_states_gpu'):
                        self.initialize_render()

                    self.hybrid_render = not self.hybrid_render
                    self.clear_image()
                    self.update()
                    pygame.event.clear(pygame.SYSWMEVENT)

        elif event.type == pygame.QUIT:
            self.done = True
            return
示例#11
0
    def process_event(self, event):
        if event.type == MOUSEBUTTONDOWN:
            if event.button == 4:
                v = self.scale*np.cross(self.axis1,self.axis2)/10.0
                self.translate(v)

            elif event.button == 5:
                v = -self.scale*np.cross(self.axis1,self.axis2)/10.0
                self.translate(v)

            elif event.button == 1:
                mouse_position = pygame.mouse.get_rel()
                self.clicked = True

        elif event.type == MOUSEBUTTONUP:
            if event.button == 1:
                self.clicked = False

        elif event.type == MOUSEMOTION and self.clicked:
            movement = np.array(pygame.mouse.get_rel())

            if (movement == 0).all():
                return

            length = np.linalg.norm(movement)

            mouse_direction = movement[0]*self.axis2 - movement[1]*self.axis1
            mouse_direction /= np.linalg.norm(mouse_direction)

            if pygame.key.get_mods() & (KMOD_LSHIFT | KMOD_RSHIFT):
                v = -mouse_direction*self.scale*length/float(self.width)
                self.translate(v)
            else:
                phi = np.float32(2*np.pi*length/float(self.width))
                n = rotate(mouse_direction, np.pi/2,
                           np.cross(self.axis1,self.axis2))

                if pygame.key.get_mods() & KMOD_LCTRL:
                    self.rotate_around_point(phi, n, self.point)
                else:
                    self.rotate(phi, n)

        elif event.type == KEYDOWN:
            if event.key == K_LALT or event.key == K_RALT:
                if self.motion == 'coarse':
                    self.scale = self.mesh_diagonal_norm/20.0
                    self.motion = 'fine'
                elif self.motion == 'fine':
                    self.scale = self.mesh_diagonal_norm/400.0
                    self.motion = 'superfine'
                elif self.motion == 'superfine':
                    self.scale = self.mesh_diagonal_norm
                    self.motion = 'coarse'

            elif event.key == K_F6:
                self.clear_xyz_lookup()
                self.clear_image()
                self.source_position = self.point

            elif event.key == K_F7:
                for i in range(100):
                    self.update_xyz_lookup(self.point)
                self.source_position = self.point

            elif event.key == K_F11:
                pygame.display.toggle_fullscreen()

            elif event.key == K_ESCAPE:
                self.done = True
                return

            elif event.key == K_EQUALS:
                if self.alpha_depth < self.max_alpha_depth:
                    self.alpha_depth += 1
                self.update()

            elif event.key == K_MINUS:
                if self.alpha_depth > 1:
                    self.alpha_depth -= 1
                    self.update()

            elif event.key == K_PAGEDOWN:
                if self.currentlayer is None:
                    self.currentlayer = self.bvh_layer_count - 1
                else:
                    if self.currentlayer > 0:
                        self.currentlayer -= 1
                    else:
                        self.currentlayer = None

                self.loadlayer(self.currentlayer)

            elif event.key == K_PAGEUP:
                if self.currentlayer is None:
                    self.currentlayer = 0
                else:
                    if self.currentlayer < self.bvh_layer_count:
                        self.currentlayer += 1
                    else:
                        self.currentlayer = None

                self.loadlayer(self.currentlayer)                    

            elif event.key == K_3:
                if self.display3d:
                    self.disable3d()
                else:
                    self.enable3d()
                self.update()

            elif event.key == K_g:
                self.green_magenta = not self.green_magenta
                self.update()

            elif event.key == K_F12:
                self.screenshot()

            elif event.key == K_F5:
                if not hasattr(self, 'rng_states_gpu'):
                    self.initialize_render()

                self.hybrid_render = not self.hybrid_render
                self.clear_image()
                self.update()

            elif event.key == K_m:
                if self.movie:
                    encode_movie(self.movie_dir)
                    self.movie_dir = None
                    self.movie = False
                else:
                    self.movie_index = 0
                    self.movie_dir = tempfile.mkdtemp()
                    self.movie = True

        elif event.type == pygame.SYSWMEVENT and self.spnav:
            # Space Navigator controls
            spnav_event = self.spnav_module.spnav_x11_event(event.event)
            if spnav_event is None:
                return

            if spnav_event.ev_type == self.spnav_module.SPNAV_EVENT_MOTION:
                if pygame.key.get_mods() & (KMOD_LSHIFT | KMOD_RSHIFT):
                    accelerate_factor = 2.0
                else:
                    accelerate_factor = 1.0

                v1 = self.axis1
                v2 = self.axis2
                v3 = np.cross(self.axis1,self.axis2)
                
                x, y, z = spnav_event.translation
                rx, ry, rz = spnav_event.rotation

                v = v2*x + v1*y + v3*z
                v *= self.scale / 5000.0 * accelerate_factor

                self.translate(v, redraw=False)                    

                axis = -v2*rx - v1*ry - v3*rz

                if (axis != 0).any():
                    axis = axis.astype(float)
                    length = np.linalg.norm(axis)
                    angle = length * 0.0001 * accelerate_factor
                    axis /= length
                    self.rotate_around_point(angle, axis, self.point,
                                             redraw=False)

                if self.hybrid_render:
                    self.clear_image()

                self.update()
                pygame.event.clear(pygame.SYSWMEVENT)

            elif spnav_event.ev_type == self.spnav_module.SPNAV_EVENT_BUTTON:
                if spnav_event.bnum == 0 and spnav_event.press:
                    if not hasattr(self, 'rng_states_gpu'):
                        self.initialize_render()

                    self.hybrid_render = not self.hybrid_render
                    self.clear_image()
                    self.update()
                    pygame.event.clear(pygame.SYSWMEVENT)

        elif event.type == pygame.QUIT:
            self.done = True
            return