百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

Python 教学案例:镜像图案生成器(镜像下载python)

off999 2024-10-14 12:06 31 浏览 0 评论

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

核心代码,就是根据原始坐标点,沿屏幕中心,旋转 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 : 保存图片

相关推荐

戴尔官网保修查询入口(戴尔售后保质期查询)

可以按照以下步骤查询戴尔笔记本电脑的保修期:1.打开戴尔官网:https://www.戴尔.com/zh-cn/售后服务/保修政策.html2.点击页面上方的“服务与支持”按钮,进入戴尔的服务支持...

手机号邮箱登录入口(手机号邮箱官网)

手机163邮箱登录入口如下:163邮箱官网入口:https://smart.mail.163.com/login.htm点击进入登录或者注册邮箱即可。手机浏览器访问进入官网http://www.123...

sd卡(sd卡无法读取怎么修复)

  SD卡是大卡,相机用的;普通的手机内存卡,是小卡,正规的名称是macrosd卡,也就是微型SD卡。可以通过卡套转为普通的SD卡的大小。  其实就是大小不同。但手机上的内存卡,人们经常也俗称为SD...

路由器连接图(网络路由器连接图)
  • 路由器连接图(网络路由器连接图)
  • 路由器连接图(网络路由器连接图)
  • 路由器连接图(网络路由器连接图)
  • 路由器连接图(网络路由器连接图)
windows7蓝牙功能在哪里打开

点击搜索框在windows7系统主界面点击开始菜单,点击打开搜索框。输入命令输入services.msc后回车,在列表中找到并右击BluetoothSupportS...点击属性选择进入属性菜单,...

2010激活密钥(microsoft2010激活密钥)
2010激活密钥(microsoft2010激活密钥)

步骤/方式1officeprofessionalplus2010:(office专业版)6QFdx-pYH2G-ppYFd-C7RJM-BBKQ8Bdd3G-xM7FB-Bd2HM-YK63V-VQFdKVYBBJ-TRJpB-QFQ...

2025-11-19 04:03 off999

联想官方刷新bios工具(联想电脑刷新bios)

刷新BIOS需要使用联想的官方网站或授权维修中心来进行操作。以下是一些基本步骤:1.访问联想的官方网站,找到BIOS更新程序并下载。在下载过程中,请确保选择与您计算机型号匹配的版本。2.将下载的B...

苹果ios14系统下载(苹果ios14.1下载)
苹果ios14系统下载(苹果ios14.1下载)

1方法一步骤/方式一打开Appstore。步骤/方式二在搜索栏点击搜索框。步骤/方式三搜索并点击需要下载的软件。步骤/方式四点击获取。步骤/方式五最后验证ID密码即可。1.在应用商店搜索你要下载的应用名称。2.点击下载按钮,如果要求登...

2025-11-19 03:03 off999

office2010怎么免费永久激活密钥

用这个试试,一个KMS激活工具可以激活2010到2019的Office自家的目前用的就是这个microsoft6477.moe/1716.html直接使用这个Microsoftoffice2010...

类似爱加速的国内ip(类似爱加速的app)
类似爱加速的国内ip(类似爱加速的app)

推荐“V8盒子”。这一款免费无广告的模拟器,不同于其它软件盒子,而是类似于X8沙箱,满足游戏多开,画中画,悬浮球操作,熄屏后台运行等多功能的沙箱盒子.支持一键root,一键安装xposed框架,能在安卓/苹果手机上运行多个安卓/ios虚拟系...

2025-11-19 02:03 off999

阿里旺旺手机客户端(阿里旺旺手机app)

手机淘宝的旺旺在打开商品后,会看到左下角有个旺旺的图标,点击就可以联系了。  阿里旺旺是将原先的淘宝旺旺与阿里巴巴贸易通整合在一起的一个新品牌。它是淘宝和阿里巴巴为商人量身定做的免费网上商务沟通软件,...

最纯净的pe装机工具(pe工具哪个纯净)

U盘装系统步骤:1.制作U盘启动盘。这里推荐大白菜U盘启动盘制作工具,在网上一搜便是。2.U盘启动盘做好了,我们还需要一个GHOST文件,可以从网上下载一个ghost版的XP/WIN7/WIN8系统,...

装一个erp系统多少钱(wms仓库管理软件)

现在主流有客户端ERP和云端ERP两种客户端通常一次买断,价格在万元左右,但是还有隐性费用,你需要支付服务器、数据管理员,此外如果系统需要更新维护,你还需要支付另外一笔不菲的费用。云端ERP:优势...

cad2014序列号和密钥永久(autocad2014序列号和密钥)

1在cad2014中修改标注样式后,需要将其保存2单击“样式管理器”按钮,在弹出的窗口中选择修改后的标注样式,然后单击“设置为当前”按钮,再单击“保存当前样式”按钮,将其保存为新的样式名称3为了...

qq修改密保手机号(qq修改密保手机号是什么意思)

QQ更改绑定的手机号码操作步骤如下:1、打开手机主界面,找到“QQ”软件点击打开。2、输入正确的QQ账户和密码登录到qq主界面。3、点击左上角的头像“图片”,进入到个人中心界面。4、进入到个人中心界面...

取消回复欢迎 发表评论: