import sys
import time,sched
from threading import Timer
import datetime
import numpy as np
import pygame
from pygame import surface
from pygame._sprite import Group
import threading
import math
class lu:
def __init__(self):
self.x = self
self.y = self
self.z = self
self.x1 = self
self.y1 = self
self.color = self
self.screen = self
self.p = self
def zhuanhuan(self, x, y, z):
shiju = 300
self.x1 = shiju * x / z
self.y1 = shiju * y / z
# p3.append((self.x1, self.y1))
# pygame.draw.polygon(screen, (0, 244, 0), self.p)
# return (self.x1,self.y1)
pygame.init() # 初始化pygame
size = width, height = 1100, 900 # 设置窗口大小
screen = pygame.display.set_mode(size) # 显示窗口
color = (255, 255, 255)
f = False
fcclock = pygame.time.Clock()
# for i in range(6):
h1 = lu()
h1.x = 0
h1.y = 0
h1.width = 662
h1.height = 35
h1.screen = screen
p3 = []
z = [{'x1': 100, 'y1': 200, 'z1': 1}, {'x1': 200, 'y1': 100, 'z1': 1}, {'x1': 170, 'y1': 200, 'z1': 1},
]
#最好是瓶底三角形,z保持在一个平面
#ax=70
#ay=580
#bx=160
#by=300
#cx=200
#cy=580
image = pygame.image.load("1.png")
img=pygame.image.load("1.png").convert_alpha()
def huizhi(x, y, z):
shiju = 300
x1 = x
y1 = y
# p.append((x1,y1))
return x1, y1
zhuan=False
ax=0
ay=0
by=0
bx=0
cx=0
cy=0
linshi=0
a=1
while True: # 死循环确保窗口一直显示
s = sched.scheduler(time.time, time.sleep)
screen.fill(color)
fcclock.tick(9) # 设置图像刷新率,如果刷新率太高,图像闪5的太厉害
for event in pygame.event.get(): # 遍历所有事件
if event.type == pygame.QUIT: # 如果单击关闭窗口,则退出
sys.exit()
pygame.quit()
exit()
keys = pygame.key.get_pressed()
if keys[pygame.K_UP]:
f = True
if event.type == pygame.KEYUP:
f = False
if f==True:
a=a+1
for c in range(len(z)):
z[c]['x1'] = z[c]['x1'] * math.cos(math.radians(a)) - z[c]['z1'] * math.sin(math.radians(a))
z[c]['z1'] = z[c]['x1'] * math.sin(math.radians(a)) + z[c]['z1'] * math.sin(math.radians(a))
#new_x = x * math.cos(math.radians(angle)) - z * math.sin(math.radians(angle))
#new_z = x * math.sin(math.radians(angle)) + z * math.sin(math.radians(angle))
#xiugaihou
# z[c]['y1'] = z[c]['y1'] * math.cos(math.radians(a)) - z[c]['z1'] * math.sin(math.radians(a))
#z[c]['z1'] = z[c]['z1'] * math.sin(math.radians(a)) + z[c]['y1'] * math.cos(math.radians(a))
#new_y = y * math.cos(math.radians(angle)) - z * math.sin(math.radians(angle))
#new_z = y * math.sin(math.radians(angle)) + z * math.cos(math.radians(angle))
#z[c]['x1'] = z[c]['x1'] + 9
'''x轴炫转
x=y*cos(a)+z*sin(a)
y=z*cos(a)-y*sin(a)
旋转需要中心点
x=y中+(当前y-y中)*cos(角度)+(当前z-z中)*sin(角度)
y=z中+(当前z-z中)*cos(角度)-(当前y-y中)*sin(角度)
减去y中的意思是,减去y轴中心点离远点0,0的距离。好计算旋转坐标,然后再加回这个距离
'''
if c == 0:
linshi=huizhi(z[c]['x1'], z[c]['y1'], z[c]['z1'])
ax = int(linshi[0])
ay = int(linshi[1])
#print(c,ax,ay,"...")
if c == 1:
linshi = huizhi(z[c]['x1'], z[c]['y1'], z[c]['z1'])
bx = int(linshi[0])
by = int(linshi[1])
#print(c, bx, by,"...")
if c == 2:
linshi = huizhi(z[c]['x1'], z[c]['y1'], z[c]['z1'])
cx = int(linshi[0])
cy = int(linshi[1])
#print(c, cx, cy,"...")
p3.append((huizhi(z[c]['x1'], z[c]['y1'], z[c]['z1'])))
#pygame.draw.polygon(screen, (0, 244, 0), p3)
#pygame.display.update()#控制背景后移
# update会导致画面频闪
print(ax-bx)
ab=(ax-bx)
if(ab==0):
zk=(ay-by)/1
else:
zk = (ay - by) / (ax - bx) # 左边斜率
bc=(bx-cx)
if(bc==0):
yk=(by-cy)/1
else:
yk = (by - cy) / (bx - cx)
# y=kx+b -b=kx-y 但是没法用-b当变量,下面就-abs手动转负数
jiejuz = (bx * zk) - by # 截距
jz = 0
if jiejuz < 0:
jz = abs(jiejuz)
else:
jz = -abs(jiejuz)
# print(jiejuz,jz)
'''yz=zk*(70+0.5)+jz
#y1 = zk * 90 + jieju
#print(int(46600/90),int(y1), int(yz))
pygame.Surface.set_at(screen, (90, int(46600/90)), (255,0,0))
pygame.Surface.set_at(screen, (int(70+0.5), int(yz)), (255,0, 0))
'''
# (70, 580), (160, 300), (200, 580)
#yk = (by - cy) / (bx - cx)
jiejuy = (bx * yk) - by # 截距
jy = 0
if jiejuy < 0:
jy = abs(jiejuy)
else:
jy = -abs(jiejuy)
# yy = yk * 200 + jy
# pygame.Surface.set_at(screen, (200, int(yy)), (0, 255, 0))
#
# yz = zk * (70 + 0.5) + jz
# #y=kx+b -kx=b-y
# #xz=((5/3)-(8/3))/(1/3)
# xz = (jz - 300) /zk
# zuoxianx=abs(xz)
# xy=(jy-300)/yk
# youxianx=abs(xy)
# # y1 = zk * 90 + jieju
# # print(int(46600/90),int(y1), int(yz))
# pygame.Surface.set_at(screen, (int(youxianx), 300), (255, 0, 0))
# pygame.Surface.set_at(screen, (int(zuoxianx), 300), (255, 0, 0))
# starx=int(zuoxianx)
# endx=int(youxianx)
# print(yk,"截距左", jz, jy, "右扫描线y", yy, "左边扫描线y", yz,"左扫描线x",zuoxianx,"左扫描线x",youxianx)
# dong=0
# stary=300
# endy=580
for gao in range(380):
xz1 = (jz - (gao + by)) / zk
sx = abs(xz1)
xy1 = (jy - (gao + by)) / yk
ex = abs(xy1) + 2 # 加2是为了填补空白
xcishu = ex - sx
#print("gao==", gao, "第一次循环", int(sx), int(ex))
for i in range(int(xcishu)):
#print("i==", i, "第二次循环", int(sx), int(ex))
# pygame.Surface.set_at(screen, (i, int(580)), (0, 255, 0))
pygame.Surface.set_at(screen, (int(sx) + i, by + gao), (0,40,40))#(img.get_at((int(i/10),int(gao/10)))))
#pygame.Surface.set_at(screen, (int(sx) + i, by + gao), (img.get_at((int(i%380),int((gao%380))))))#(img.get_at((int(i/10),int(gao/10)))))
for c in range(len(z)):
for c in range(len(z)):
# z[c]['z1'] = z[c]['z1'] - 30
#z[c]['y1'] = z[c]['y1'] + 30
# z[c]['x1'] = z[c]['x1'] + 9
if c == 0:
linshi = huizhi(z[c]['x1'], z[c]['y1'], z[c]['z1'])
ax = abs(int(linshi[0]))
ay = abs(int(linshi[1]))
#print(c, ax, ay, "...")
if c == 1:
linshi = huizhi(z[c]['x1'], z[c]['y1'], z[c]['z1'])
bx = abs(int(linshi[0]))
by = abs(int(linshi[1]))
#print(c, bx, by, "...")
if c == 2:
linshi = huizhi(z[c]['x1'], z[c]['y1'], z[c]['z1'])
cx = int(linshi[0])
cy = int(linshi[1])
#print(c, cx, cy, "...")
p3.append((huizhi(z[c]['x1'], z[c]['y1'], z[c]['z1'])))
# pygame.draw.polygon(screen, (0, 244, 0), p3)
# pygame.display.update()#控制背景后移
# update会导致画面频闪
#print(ax, ay, bx, by, cx, cy)
zk = (ay - by) / (ax - bx) # 左边斜率
yk = (by - cy) / (bx - cx)
# y=kx+b -b=kx-y 但是没法用-b当变量,下面就-abs手动转负数
jiejuz = (bx * zk) - by # 截距
jz = 0
if jiejuz < 0:
jz = abs(jiejuz)
else:
jz = -abs(jiejuz)
# print(jiejuz,jz)
'''yz=zk*(70+0.5)+jz
#y1 = zk * 90 + jieju
#print(int(46600/90),int(y1), int(yz))
pygame.Surface.set_at(screen, (90, int(46600/90)), (255,0,0))
pygame.Surface.set_at(screen, (int(70+0.5), int(yz)), (255,0, 0))
'''
# (70, 580), (160, 300), (200, 580)
yk = (by - cy) / (bx - cx)
jiejuy = (bx * yk) - by # 截距
jy = 0
if jiejuy < 0:
jy = abs(jiejuy)
else:
jy = -abs(jiejuy)
# yy = yk * 200 + jy
# pygame.Surface.set_at(screen, (200, int(yy)), (0, 255, 0))
#
# yz = zk * (70 + 0.5) + jz
# #y=kx+b -kx=b-y
# #xz=((5/3)-(8/3))/(1/3)
# xz = (jz - 300) /zk
# zuoxianx=abs(xz)
# xy=(jy-300)/yk
# youxianx=abs(xy)
# # y1 = zk * 90 + jieju
# # print(int(46600/90),int(y1), int(yz))
# pygame.Surface.set_at(screen, (int(youxianx), 300), (255, 0, 0))
# pygame.Surface.set_at(screen, (int(zuoxianx), 300), (255, 0, 0))
# starx=int(zuoxianx)
# endx=int(youxianx)
# print(yk,"截距左", jz, jy, "右扫描线y", yy, "左边扫描线y", yz,"左扫描线x",zuoxianx,"左扫描线x",youxianx)
# dong=0
# stary=300
# endy=580
for gao in range(380):
xz1 = (jz - (gao + by)) / zk
sx = abs(xz1)
xy1 = (jy - (gao + by)) / yk
ex = abs(xy1) + 2 # 加2是为了填补空白
xcishu = ex - sx
# print("gao==", gao, "第一次循环", int(sx), int(ex))
for i in range(int(xcishu)):
# print("i==", i, "第二次循环", int(sx), int(ex))
# pygame.Surface.set_at(screen, (i, int(580)), (0, 255, 0))
pygame.Surface.set_at(screen, (int(sx) + i, by + gao), (img.get_at((int(i%64),int(gao%64))))) # (img.get_at((int(i/10),int(gao/10)))))
pygame.display.update()
p3.clear()
pygame.display.flip() # 更新全部显示
pygame用自己函数旋转三角形 填充纹理
最新推荐文章于 2025-08-03 11:35:19 发布