From 067aa09d70dfbc4e802f685dcc271a8e67c79ec6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E5=BA=B72022?= <392126563@qq.com> Date: Fri, 10 Feb 2023 01:27:38 +0800 Subject: [PATCH] version 0.6 --- GUI.py | 9 +++---- cube.py | 80 ++++++++++++++++++++++++++++++++++++++++++++------------- main.py | 2 +- 3 files changed, 67 insertions(+), 24 deletions(-) diff --git a/GUI.py b/GUI.py index 2dac12d..b90e3b6 100644 --- a/GUI.py +++ b/GUI.py @@ -2,13 +2,12 @@ 图形界面部分 """ -from math import pi from tkinter import Event, Menu, messagebox import tkintertools as tkt from configure import config from constants import SIDE -from cube import Cube +from cube import MagicCube from main import __author__, __update__, __version__ @@ -27,7 +26,7 @@ class Window: self.init_bind() self.init_ui() self.event = [None, None] - self.cube = Cube(0, 0, 0, 100, self.canvas) + self.cube = MagicCube(self.canvas, 40) self.root.mainloop() def init_menu(self) -> None: @@ -50,7 +49,7 @@ class Window: def init_ui(self) -> None: """ UI初始化 """ self.info = self.canvas.create_text( - SIDE-10, 10, text='β: 0.000 γ: 0.000', anchor='e', font=('楷体', 12)) + SIDE-10, 10, text='x: 0.000 y: 0.000', anchor='e', font=('楷体', 12)) self.timer = self.canvas.create_text( SIDE/2, 20, text='00:00', font=('楷体', 20)) @@ -70,5 +69,5 @@ class Window: 0, r_y/config['sensitivity'], -r_x/config['sensitivity']) self.cube.update() self.canvas.itemconfigure( - self.info, text='β: %.3f γ: %.3f' % (self.cube.β/pi*180, self.cube.γ/pi*180)) + self.info, text='x: %.3f y: %.3f' % (self.cube.x, self.cube.y)) self.event = [event.x, event.y] diff --git a/cube.py b/cube.py index be65b4f..9a0149b 100644 --- a/cube.py +++ b/cube.py @@ -59,12 +59,15 @@ class Point: class Side: """ 面 """ - def __init__(self, canvas: tkt.tkinter.Canvas, color: str, *args: tuple[float, float, float]) -> None: + def __init__(self, canvas: tkt.tkinter.Canvas, color: str, dx: float, dy: float, *args: tuple[float, float, float]) -> None: self.points = [Point(x, y, z) for x, y, z in args] self.update_xs() + self.dx, self.dy = dx, dy self.canvas = canvas - p = [i+SIDE/2 for p in self.project(config['distance']) for i in p] - self.polygon = canvas.create_polygon(*p, fill=color, outline='black') + p = [i + (dy if p.index(i) & 1 else dx) + for p in self.project(config['distance']) for i in p] + self.polygon = canvas.create_polygon( + *p, fill=color, outline='black', width=2) def translate(self, dx: float, dy: float, dz: float) -> None: """ 三维平移 """ @@ -80,7 +83,7 @@ class Side: def update_xs(self) -> None: """ 更新self.xs """ - self.xs = [point.x for point in self.points] + self.xs = min(point.x for point in self.points) def project(self, dis: float) -> tuple[tuple[float, float]]: """ 二维投影 """ @@ -89,45 +92,86 @@ class Side: def update(self) -> None: """ 更新图像 """ self.update_xs() - p = [i+SIDE/2 for p in self.project(config['distance']) for i in p] + p = [i + (self.dy if p.index(i) & 1 else self.dx) + for p in self.project(config['distance']) for i in p] self.canvas.coords(self.polygon, *p) class Cube: """ 正方体 """ - def __init__(self, x: float, y: float, z: float, r: float, canvas: tkt.Canvas) -> None: - self.β, self.γ = 0, 0 # 旋转度 + def __init__(self, x: float, y: float, z: float, dx: float, dy: float, r: float, canvas: tkt.Canvas) -> None: self.canvas = canvas - p = [(x+a, y+b, z+c) - for a in (r, -r) for b in (r, -r) for c in (r, -r)] + p = [(x+a, y+b, z+c) for a in (r, -r) + for b in (r, -r) for c in (r, -r)] self.sides = [ - Side(canvas, 'orange', p[4], p[5], p[7], p[6]), # 后面 - Side(canvas, 'blue', p[2], p[3], p[7], p[6]), # 左侧 - Side(canvas, 'yellow', p[1], p[3], p[7], p[5]), # 上面 - Side(canvas, 'green', p[0], p[1], p[5], p[4]), # 右侧 - Side(canvas, 'white', p[0], p[4], p[6], p[2]), # 下面 - Side(canvas, 'red', p[0], p[1], p[3], p[2])] # 前面 + Side(canvas, 'orange', dx, dy, p[4], p[5], p[7], p[6]), # 后面 + Side(canvas, 'blue', dx, dy, p[2], p[3], p[7], p[6]), # 左侧 + Side(canvas, 'yellow', dx, dy, p[1], p[3], p[7], p[5]), # 上面 + Side(canvas, 'green', dx, dy, p[0], p[1], p[5], p[4]), # 右侧 + Side(canvas, 'white', dx, dy, p[0], p[4], p[6], p[2]), # 下面 + Side(canvas, 'red', dx, dy, p[0], p[1], p[3], p[2])] # 前面 + self.update_xs() def rotate(self, dx: float, dy: float, dz: float) -> None: """ 旋转 """ - self.β += dy - self.γ += dz for side in self.sides: side.rotate(dx, dy, dz) + self.update_xs() def translate(self, dx: float, dy: float, dz: float) -> None: """ 平移 """ for side in self.sides: side.translate(dx, dy, dz) + self.update_xs() def update(self) -> None: """ 更新立方体 """ + self.update_xs() for side in self.sides: side.update() self.lift() + def update_xs(self) -> None: + """ 更新self.xs """ + self.xs = min(side.xs for side in self.sides) + def lift(self) -> None: """ 前后关系 """ - for side in sorted(self.sides, key=lambda s: min(s.xs)): + for side in sorted(self.sides, key=lambda s: s.xs): self.canvas.lift(side.polygon) + + +class MagicCube: + """ 魔方类 """ + + def __init__(self, canvas: tkt.Canvas, r: float, n: int = 3) -> None: + self.n = n + self.r = r + k = (-2*r, 0, 2*r) + self.x, self.y = 0, 0 + self.cubes = [Cube(a, b, c, SIDE/2, SIDE/2, r, canvas) + for a in k for b in k for c in k] + + def rotate(self, dx: float, dy: float, dz: float) -> None: + """ 旋转 """ + self.x += dz/pi*180 + self.y += dy/pi*180 + for cube in self.cubes: + cube.rotate(dx, dy, dz) + + def translate(self, dx: float, dy: float, dz: float) -> None: + """ 平移 """ + for cube in self.cubes: + cube.translate(dx, dy, dz) + + def update(self) -> None: + """ 更新 """ + for cube in self.cubes: + cube.update() + self.lift() + + def lift(self) -> None: + """ 更新前后关系 """ + for cube in sorted(self.cubes, key=lambda c: c.xs): + cube.lift() diff --git a/main.py b/main.py index 96ddcc9..46708cf 100644 --- a/main.py +++ b/main.py @@ -2,7 +2,7 @@ 程序入口 """ -__version__ = '0.5' +__version__ = '0.6' __author__ = '小康2022' __update__ = '2023/02/10' -- GitLab