抖音资讯

douyinzx

python网页版编辑器ad镜像(菜鸟教程python在线编程)

iseeyu2年前 (2024-05-08)抖音资讯128

画镜像图,是上编程课时,孩子们比较喜欢的一个案例,虽然数学公式可能不懂,但程序的设计意图,理解起来没什么困难,一句“万花筒”,就什么都解决了。。

核心代码,就是根据原始坐标点,沿屏幕中心,旋转 n-1 次,获取 n-1 个镜像点。

def add_point(point):
    '''添加当前点,并计算所有镜像点,添加到 m_lines 里'''
    if points ==[] or point != points[-1]:      # 加一个判断,避免加入重复的点,浪费空间
        points.append(point)
        for i in range(1,n):    # 计算所有镜像点坐标
            mp = get_mirror_point(point,m_angle * i)    # 第 i 个镜像点
            m_lines[i][-1].append(mp)

def get_mirror_point(p,angle):
    '''计算 p 点 沿屏幕中心(cx,cy)旋转 angle 后的坐标值'''
    cx,cy = W/2,  H/2    # 以屏幕中心点为坐标原点
    angle = math.radians(angle) # 角度转化为弧度
    x,y = p[0] - cx, cy - p[1]
    # 用到旋转公式
    mx  = round( x * math.cos(angle) - y * math.sin(angle))   
    my = round( x * math.sin(angle) + y * math.cos(angle))
    nx =  mx + cx
    ny =  cy - my

    return nx,ny

上面代码用到了三角函数,其实用向量来计算的话,会更简单一些。

没时间解释了,下面贴出完整代码(mirror.py):

import pygame
from pygame.locals import *
import os,random,sys,math
import time

# 常量 
W , H = 1280,800     
n = 5 # 镜像次数
GREEN = (0,255,0)

# 初始化游戏窗口
pygame.init()
# screen = pygame.display.set_mode((0,0),FULLSCREEN)
screen = pygame.display.set_mode((W,H))
W,H = screen.get_size()
pygame.display.set_caption("极坐标")

# 全局变量

lines = []   # 用户画的原始线段
points = []  # 当前画的线段的点集合(从鼠标落下到鼠标抬起,鼠标经过的所有坐标点)
''' m_lines 是个三维数组,分三个层次: 第一层:所有线段集合,用户线段集合 + (n-1)个镜像线段集合 第二层:一个用户线段集合里,包含多个分开的线段,每次落笔抬笔之间,即构成一个线段 第三层:每个线段,包含的点的集合 '''
m_lines = [] # 镜像线段 mirror lines,由用户绘制线段,生成的所有镜像线段,包含了用户线段
colors = []

def init():
    '''初始化'''
    global lines,points,m_angle
    m_angle = 360 / n   # 镜像单位角度
    m_lines.clear()     # 清空
    for i in range(n):
        m_lines.append([[]])        # 根据镜像数量,先分配好空间
        colors.append(random_rainbow_color())     # 随机颜色
    lines = m_lines[0]  # 线段
    points = lines[0] # 点

def random_rainbow_color():
        '''随机生成饱和度最大的颜色'''
        h = random.randint(0,360)
        color = pygame.Color((0,0,0))
        color.hsla = (h,100,50,100)
        return color

def get_mirror_point(p,angle):
    '''计算 p 点 沿屏幕中心(cx,cy)旋转 angle 后的坐标值'''
    cx,cy = W/2,  H/2    # 以屏幕中心点为坐标原点
    angle = math.radians(angle) # 角度转化为弧度
    x,y = p[0] - cx, cy - p[1]
    # 用到旋转公式
    mx  = round( x * math.cos(angle) - y * math.sin(angle))   
    my = round( x * math.sin(angle) + y * math.cos(angle))
    nx =  mx + cx
    ny =  cy - my
    # print(p,(x,y),(mx,my),(nx,ny))
    return nx,ny

def new_line():
    '''分配新的线段空间'''
    global points
    lines.append([])
    points = lines[-1]
    for i in range(1,n):
            m_lines[i].append([])

def add_point(point):
    '''添加当前点,并计算所有镜像点,添加到 m_lines 里'''
    if points ==[] or point != points[-1]:      # 加一个判断,避免加入重复的点,浪费空间
        points.append(point)
        for i in range(1,n):    # 计算所有镜像点坐标
            mp = get_mirror_point(point,m_angle * i)    # 第 i 个镜像点
            m_lines[i][-1].append(mp)

def save_image():
    '''保存图片'''
    filename = 'mirror-'+ time.strftime("%Y%m%d%H%M%S", time.localtime()) +'.png'
    pygame.image.save(screen,filename)

init()

drawing = False
running = True
clock = pygame.time.Clock()
while running:

    # 事件
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
        if event.type == KEYDOWN:
            if event.key == K_ESCAPE:
                pygame.quit()
                sys.exit()
            if event.key == K_SPACE:        # 按空格键清屏
                init()
            if event.key == K_s:
                key_pressed = pygame.key.get_pressed()
                if key_pressed[K_LCTRL] or key_pressed[K_RCTRL]:    # CTRL + s 组合键,保存图片 
                    save_image()
        if event.type == MOUSEBUTTONDOWN:   # 按下鼠标
            drawing = True      # 开始画线
        if event.type == MOUSEBUTTONUP:     # 放开鼠标
            drawing = False     # 画线结束
            new_line()  #分配新的线段空间
        if event.type == MOUSEMOTION:       # 移动鼠标
            if drawing: 
                point = pygame.mouse.get_pos()
                add_point(point)  # 添加当前坐标点和对应的镜像点
        

    screen.fill(0)  # 填充背景

    # 开始画图
    for i,m_line in enumerate(m_lines):
        for line in m_line:
            if len(line) >1:
                pygame.draw.lines(screen,colors[i],False,line,2)  # colors[i]
    # 结束画图

    pygame.display.update()
    clock.tick(30)

空格:清屏

CTRL + S : 保存图片

这个是我画的

扫描二维码推送至手机访问。

版权声明:本文由西安泽虎代运营发布,如需转载请注明出处。

转载请注明出处https://www.0291.com.cn/post/42497.html

相关文章

直播代运营合同避坑:报价、KPI、违约金一次说清

直播代运营合同避坑:报价、KPI、违约金一次说清

去年西安一家女装店老板拿着合同来找我看,就一页纸,上面写着“保证月销30万”。签的时候高高兴兴,三个月后只卖了8万,代运营公司一句“市场环境不好”就撒手不管了。老板想退钱,翻出合同才发现,什么叫销售额、含不含退款、考核多久、数据以谁为准,一个字都没写。这种坑我这两年见了不止十回。 直播代运营合同看...

抖音千川投放怎么投?2026新手起量避坑指南

抖音千川投放怎么投?2026新手起量避坑指南

西安一家做本地餐饮的老张,去年底听人说抖音能拉客,先充了3000块投DOU+。一个月下来,视频播放量是上去了,团购券没卖出几张。后来他才搞清楚,DOU+是给内容加热用的,真正能把团购券卖出去的工具叫巨量千川。2026年,在抖音上做生意的商家基本绕不开这两个东西:DOU+管内容热度,千川管成交转化。...

抖音短视频带货怎么做?2026年挂车出单实操指南

抖音短视频带货怎么做?2026年挂车出单实操指南

直播带货要开播、要人设、要话术,很多西安商家试了两次就放弃了。其实还有一条更轻的路:短视频带货。拍一条视频挂上商品链接,用户刷到直接下单,不用开播,不用连麦,一个人一部手机就能跑。我见过高新一家卖手工辣条的档口,老板就拍后厨炒料,一条视频爆了,挂车链接三天卖了四千多单。我自己也帮几个西安客户跑过这...

抖音矩阵号怎么做?2026年企业多账号布局实操

抖音矩阵号怎么做?2026年企业多账号布局实操

有个西安做门窗的老板跟我抱怨,说一个号发了大半年,播放量卡在一两千上不去,问我是不是号被限流了。我让他去搜搜本地同行,人家三个号轮着发,客户搜「西安封阳台」,翻两屏全是那一家。这不是玄学,就是矩阵。说白了,矩阵不是一个号发十遍,也不是开十个号复制粘贴,而是按客户会搜什么、信什么,把账号分工排好。尤...

抖音蹭热点总翻车?2026年商家追热点的正确姿势

抖音蹭热点总翻车?2026年商家追热点的正确姿势

上周有个做建材的老板问我:热搜上那个话题全网都在拍,我是不是也该跟一条?我反问他,拍完这条视频,客户凭什么找你买瓷砖?他愣了半天没答上来。这就是大多数商家蹭热点的真实状态——看见热点就冲,拍完发现除了播放量,什么都没留下。热点不是不能蹭,是大多数人都蹭错了。我盘过自己服务的客户数据:蹭热点视频的平...

企业抖音蓝V认证2026流程:材料准备与审核避坑

企业抖音蓝V认证2026流程:材料准备与审核避坑

企业号蓝V认证,现在几乎成了西安本地商家做抖音的起手式。不管是餐饮、装修、教育还是批发档口,想挂电话、想开团购、想投DOU+,基本都绕不开这一步。这篇文章把2026年最新的蓝V认证流程、要准备的材料、审核容易挂的地方一次讲清楚。蓝V认证到底有什么用?值不值600块蓝V说白了就是抖音给企业主体做的实...

现在,非常期待与您的又一次邂逅

我们努力让每一部企业宣传片和抖音短视频成为商业大片