Example #1
0
class SolutionGallery:
    def __init__(self, initial_state, solve_moves, i_start=0):
        self.i = 0
        self.n_moves = len(solve_moves)
        self.c = Cube()
        self.c.set_state(initial_state)
        self.solve_moves = solve_moves

        # Put cube in state after i_start moves.
        while self.i < i_start:
            self.c.perform_move(self.solve_moves[self.i])
            self.i += 1

        # Figure and axes. Place in initial state
        self.fig, _ = plt.subplots(figsize=(6, 6))
        plt.axis('off')
        self.ax1 = self.fig.add_subplot(111, projection='3d')
        self.ax1 = self.c.cube_plot(
            ax=self.ax1,
            title_str='Initial State\n Use left/right arrow keys to navigate')

        # Set up connection to detect keys
        self.mpl_id = self.fig.canvas.mpl_connect('key_press_event',
                                                  self.handle_keypress)

    def show(self):
        plt.show()

    def handle_keypress(self, event):

        if event.key == 'right':
            if self.i < self.n_moves:
                move = self.solve_moves[self.i]
                self.c.cube_plot(ax=self.ax1, title_str=move.replace('1', ''))
                add_move_annotation(self.ax1, move)
                self.c.perform_move(move)
                self.i = self.i + 1
            else:
                self.c.cube_plot(ax=self.ax1,
                                 title_str='Final State\n(press q to quit)')
            plt.draw()

        if event.key == 'left':
            if self.i > 0:
                self.i = self.i - 1

                # Undo the last move to put cube in previous state
                self.c.perform_move(opposite_move(self.solve_moves[self.i]))

                # Display the next move
                move = self.solve_moves[self.i]
                self.c.cube_plot(ax=self.ax1, title_str=move.replace('1', ''))
                add_move_annotation(self.ax1, move)
            else:
                self.c.cube_plot(ax=self.ax1, title_str='Initial State')
            plt.draw()

        return event
Example #2
0
            X_tri, Y_tri, Z_tri = Y_tri, Z_tri, X_tri
            X, Y, Z = Y, Z, X
            if orientation == 'CCW':
                X = -X
                X_tri = -X_tri
            ax.plot_surface(X, Y, Z, color='b', edgecolor='none')
            ax.plot_surface(X_tri, Y_tri, Z_tri, color='b', edgecolor='none')
            ax.plot_surface(X, Y, -Z, color='b', edgecolor='none')
            ax.plot_surface(X_tri, Y_tri, -Z_tri, color='b', edgecolor='none')

    #add_arrow(ax, move)


if __name__ == '__main__':
    c = Cube()
    initial_state = c.export_state()

    for move_type in ['U', 'D', 'R', 'L', 'F', 'B', 'X', 'Y', 'Z']:
        for orientation in ['1', '-1']:
            move = orientation + move_type
            fig, ax = plt.subplots(figsize=(8, 4))
            plt.axis('off')
            ax = fig.add_subplot(121, projection='3d')
            c.set_state(initial_state)
            c.cube_plot(ax=ax, title_str=move)
            add_move_annotation(ax, move)
            ax = fig.add_subplot(122, projection='3d')
            c.perform_move(move)
            c.cube_plot(ax=ax)
    plt.show()