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

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

off999 2024-10-14 12:06 42 浏览 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 : 保存图片

相关推荐

免费mv视频歌曲下载(高清mv视频车载音乐下载)

安装一个MTV下载精灵,就可以了。里边的格式是高清的VCD格式,转换成MP4和RM后特别清楚。。。。。1280*720?这么高的分辨率在大陆你是找不到的,一般只有国外有这类高清视频下载服务不过可以...

google earth下载(google earth下载地图)

首先,在GoogleEarth中画一个多边形存成kml文件,如例子中的china.kml。本例中下载的是我们村的卫星图,保存为xz.kml,并将其放到上述的目录中。然后,右键打开下载批处理文件d_ch...

腾讯手机游戏排行榜(腾讯所有手游排行榜)

腾讯最早的那批游戏可以追溯到2013年,包括对对碰和QQ麻将,它们的发行时间都是2003年1月1日。拿QQ麻将来说,这是一款四人游戏,发牌后,轮流抓牌、出牌、吃、碰、杠,最先和牌的为胜利者,相信大家没...

真正免费的音乐播放器(真正免费的音乐播放器下载)

永久免费听歌软件有酷狗音乐和天猫精灵,以前要跳舞经常要下载舞曲,我从QQ上找不到舞曲下载就从酷狗音乐上找,大多都可找到,有的可以加入歌单分类,有的缓存到本地音乐。虾米音乐。虾米音乐(无线音乐解决方案)...

免费下载cad看图王(cad看图王软件下载)

如果不需要测量距离,只是看图纸的话推荐cad看图王,比较适合设计类的人员使用。如果需要拍照,测量距离等功能,建议使用cad快速看图软件,能够拍照,还能够测量距离,保存之后可以导出来,使用非常方便。希望...

手机exe文件解压器(如何用手机解压exe文件)

手机无法直接解压exe格式的文件。因为exe格式通常是Windows操作系统下的可执行文件,而手机采用的是Android或iOS操作系统,无法直接运行Windows下的可执行文件。需要先在电脑上解压或...

lightroom官方下载(lightroom安卓免费版)

不,Lightroom可以下载到C盘以外的目录,根据您的个人设置和选择,您可以选择安装在任何一个可用的硬盘或分区中。在安装程序中,您可以选择安装路径,并选择Lightroom安装位置。仅需在安装过程中...

免费聊天(免费聊天交友软件 全免费有哪些)
免费聊天(免费聊天交友软件 全免费有哪些)

免费的交友软件:1、Falofalo里面的小哥哥小姐姐颜值不要太高,随机冒泡匹配到的人也很有趣,后台还是人工审核,用起来就很放心了。喜欢当成我的pyq使用,有很多陌生人来给你点赞评论,就有满满的成就感。2、Soul好多人比较喜欢里面的语音聊...

2026-01-23 11:43 off999

k歌软件下载(屁颠虫k歌软件下载)
k歌软件下载(屁颠虫k歌软件下载)

这个简单,直接在“应用市场”软件搜索“全民K歌”就能找到这款APP,然后下载安装就可以了在你的手机搜索全民K歌这个软件下载就可以了!可以在应用宝里面下载这个软件的你可以直接点击上方的搜索框按钮然后在里面搜下想要找的软件或者游戏类型,然后点击...

2026-01-23 11:15 off999

微信android平板版(安卓市场(平板版))

华为平板没有微信是因为美国政府禁令导致谷歌取消对华为的服务支持,包括谷歌应用商店和谷歌服务框架。微信是谷歌服务框架下的应用程序,华为平板无法正常访问谷歌服务框架,因此也无法使用微信。另外,华为也推出了...

手机迅雷ios老版本直装(手机迅雷ios旧版下载beta)

IOS用很多软件都能替代迅雷,就算迅雷不能使用的话,也可以使用其他的软件来代替,软件的种类也是非常多的。可以先下载一个第三方助手,然后尝试一下能不能把迅雷下载下来,大多数情况下,下载一个第三方助手就可...

可以和虚拟人物聊天的软件(可以和虚拟人物聊天的软件,用QQ直接登陆)

在火星App中与多个虚拟人物对话,其实是一个相当有趣且简单的体验。首先,你需要确保已经下载并安装了火星App,并打开它。接着,在App的界面中,你可以找到虚拟人物的选项。点击进去后,你会看到多个虚拟人...

三年片在线观看免费大全电影

第一位:极限影音这是中国第一家免费电影网站。虽然域名有点难记,但它在很多免费电影网站上都有很好的服务。这是个好名声。你可以在这里得到最快和最新的免费电影。第二位:007免费在线电影这个网站是一个很好的...

旧版qq(旧版qq豌豆荚)

手机QQ软件好多更新都不好用,可能是刚开始不稳定。建议用回旧版本先。你可以打开QQ主页,然后按软件QQ下载,里面有个链接是旧版本下载的,点开下载你以前的版本就可以了    一、检查qq版本是否过于陈旧...

湖南卫视直播在线观看高清电视台

1.解锁手机,找到桌面上的央视频APP,打开。2.进入主页面后,点击页面底部的“电视”选项。3.进入电视页面后,默认显示的是CCTV的频道,上方切换到“卫视”频道。4.在打开的卫视图标中我们就...

取消回复欢迎 发表评论: