提交 067aa09d 编写于 作者: 小康2022's avatar 小康2022 👍

version 0.6

上级 e88b1753
......@@ -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]
......@@ -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()
......@@ -2,7 +2,7 @@
程序入口
"""
__version__ = '0.5'
__version__ = '0.6'
__author__ = '小康2022'
__update__ = '2023/02/10'
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册