pygame用自己函数旋转三角形 填充纹理

本文介绍了如何使用Python的pygame库创建一个动态的三角形,通过计算并应用三维变换,实现三角形在屏幕上的旋转,并进行像素级操作,如填充颜色和获取图像像素值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述

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()  # 更新全部显示

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值