提交 2d60d163 编写于 作者: 小康2022's avatar 小康2022 👍

version 0.3

上级 96ff1f63
from math import atan, cos, hypot, pi, sin
from math import atan, cos, hypot, pi, sin,sqrt
import numpy as np
def arctan(n1: float, n2: float) -> float:
......@@ -45,13 +46,22 @@ class Point:
self.γ = arctan(self.y, self.x)
self.dis = hypot(self.x, self.y, self.z)
else:
self.x = self.dis * sin(self.β) * cos(self.γ)
self.y = self.dis * sin(self.γ) * cos(self.α)
self.z = self.dis * sin(self.α) * cos(self.β)
k = (self.dis / hypot(self.x, self.y, self.z))
self.x *= k
self.y *= k
self.z *= k
self.x = self.dis * sqrt(1 / (1/cos(self.γ)**2 + 1/sin(self.β)**2 - 1))
self.y = self.dis * sqrt(1 / (1/cos(self.α)**2 + 1/sin(self.γ)**2 - 1))
self.z = self.dis * sqrt(1 / (1/cos(self.β)**2 + 1/sin(self.α)**2 - 1))
if cos(self.γ) < 0 or sin(self.β) < 0:
self.x = -self.x
if cos(self.α) < 0 or sin(self.γ) < 0:
self.y = -self.y
if cos(self.β) < 0 or sin(self.α) < 0:
self.z = -self.z
# self.x = self.dis * sin(self.β) * cos(self.γ)
# self.y = self.dis * sin(self.γ) * cos(self.α)
# self.z = self.dis * sin(self.α) * cos(self.β)
# k = (self.dis / hypot(self.x, self.y, self.z))
# self.x *= k
# self.y *= k
# self.z *= k
def project(self, dis: float) -> tuple[float, float]:
""" 返回二维坐标 """
......@@ -69,7 +79,7 @@ class Cube:
""" 正方体 """
def __init__(self, x: float, y: float, z: float, r: float) -> None:
k = -r, r
k = r, -r
self.points = [Point(x+a, y+b, z+c) for a in k for b in k for c in k]
def translate(self, dx: float, dy: float, dz: float) -> None:
......
import tkintertools as tkt
from cube import Cube
__version__ = '0.2'
__version__ = '0.3'
__author__ = '小康2022'
__update__ = '2023/02/09'
COLOR = 'red', 'yellow', 'blue', 'green', 'orange', 'purple'
class Block(Cube):
""" 方块 """
def __init__(self, x: float, y: float, z: float, r: float) -> None:
def __init__(self, x: float, y: float, z: float, r: float, canvas: tkt.Canvas) -> None:
Cube.__init__(self, x, y, z, r)
self.canvas = canvas
p = [(p[0]+350, p[1]+350) for p in self.project(300)]
self.oval = [
canvas.create_polygon(*p[4], *p[5], *p[7], *p[6], fill=COLOR[0]),
canvas.create_polygon(*p[2], *p[3], *p[7], *p[6], fill=COLOR[1]),
canvas.create_polygon(*p[1], *p[3], *p[7], *p[5], fill=COLOR[2]),
canvas.create_polygon(*p[0], *p[1], *p[5], *p[4], fill=COLOR[3]),
canvas.create_polygon(*p[0], *p[4], *p[6], *p[2], fill=COLOR[4]),
canvas.create_polygon(*p[0], *p[1], *p[3], *p[2], fill=COLOR[5])
]
def update(self) -> None:
""" 更新图像 """
p = [(p[0]+350, p[1]+350) for p in self.project(300)]
# self.canvas.coords(self.oval[0], *p[4], *p[5], *p[7], *p[6]) # 背面
# self.canvas.coords(self.oval[1], *p[2], *p[3], *p[7], *p[6]) # 左侧
# self.canvas.coords(self.oval[2], *p[1], *p[3], *p[7], *p[5]) # 下面
# self.canvas.coords(self.oval[3], *p[0], *p[1], *p[5], *p[4]) # 右侧
# self.canvas.coords(self.oval[4], *p[0], *p[4], *p[6], *p[2]) # 上面
self.canvas.coords(self.oval[5], *p[0], *p[1], *p[3], *p[2]) # 正面
class Window:
......@@ -21,7 +43,16 @@ class Window:
canvas.place(x=0, y=0)
def __init__(self) -> None:
self.b = Block(0, 0, 0, 100, self.canvas)
self.timer()
self.root.mainloop()
def timer(self, ind: int = 0) -> None:
""" 计时器 """
self.b.rotate(0.01, 0, 0)
# self.b.translate(0, 0.1, 0)
self.b.update()
self.root.after(30, self.timer, ind+1)
Window()
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册