【教学类-56-04】数感训练——数字04(中2班寻找自己的学号数字,1号-29号,出现5-10\10-15\15-20次)

news2024/9/20 0:51:09

背景需求:

今天有个客户购买“学号版的数感训练”

我找到文件夹,发现里面没有1-40号的学号数感,只有上学期为重4班制作的1-31号(其中缺了1和7号)的数感训练模版

于是用代码重新生成

【教学类-56-03】数感训练——数字03(寻找自己的学号数字,1号-31号,出现15-20次)-CSDN博客文章浏览阅读614次,点赞12次,收藏9次。【教学类-56-03】数感训练——数字03(寻找自己的学号数字,1号-31号,出现15-20次)https://blog.csdn.net/reasonsummer/article/details/139186744

然后我发现需要生成几百次,才可能会出现一次超过15的可能性

所以查询后,把循环次数从10000增加到15000,提高获取率

代码展示

'''
数感训练-学号1-31,指定数字至少出现10次,学号数字,左上角有灰色的答案
AI对话大师,阿夏
2024年5月22日

'''

import random
import math
from PIL import Image, ImageDraw, ImageFont
from collections import Counter
import os

# 指定数字至少出现几次15-20之间
cs = 10
cs2 = 25
start=1
end=40

# 班级没有1号和7号(转学了)
# numbers = [i for i in range(start, end+1) if i not in [1, 7]]
numbers = [i for i in range(start,end+1) ]
print(numbers)

path = r'C:\Users\jg2yXRZ\OneDrive\桌面\数字数感训练'

input_folder=path+r'\jpg'
os.makedirs(input_folder,exist_ok=True)

# 创建画布
canvas_width, canvas_height = 3000, 4000
canvas = Image.new('RGB', (canvas_width, canvas_height), (255, 255, 255))
draw = ImageDraw.Draw(canvas)

# 绘制黑色方框
border_color = (0, 0, 0)
border_width = 10

gray_color = (200, 200, 200)

# 定义左上角数字方框的边界坐标
x1, y1, x2, y2 = 0, 0, 700, 700
draw.rectangle([(x1, y1), (x2, y2)], outline=border_color, width=border_width)

# 定义学号数字方框的边界坐标
x1, y1, x2, y2 = 700, 0, 1000, 700
draw.rectangle([(x1, y1), (x2, y2)], outline=border_color, width=border_width)

# 定义答案方框的边界坐标
x1, y1, x2, y2 = 700, 0, 1000, 350
draw.rectangle([(x1, y1), (x2, y2)], outline=border_color, width=border_width,)

x1, y1, x2, y2 = 700, 350, 1000, 700
draw.rectangle([(x1, y1), (x2, y2)], outline=border_color, width=border_width,fill=gray_color)





n = 10
nn = []
for i in numbers:
    while True:
        numbers_written = []  # 存储成功绘制的圆圈内的数字

        # 创建白色画布
        canvas_color = (255, 255, 255)
        canvas_inner = Image.new('RGB', (canvas_width, canvas_height), canvas_color)
        draw_inner = ImageDraw.Draw(canvas_inner)

        # 将黑色方框复制到白色画布中
        canvas_inner.paste(canvas, (0, 0))

        # 在左上角绘制数字
        text_color = (0, 0, 0)
        font_path = r"C:\Windows\Fonts\simhei.ttf"  # 黑体字体路径,请根据实际情况修改
        font_size = 500
        font = ImageFont.truetype(font_path, font_size)
        if len(str(i))==1:
            draw_inner.text((230, 100), f'{i}', font=font, fill=text_color)
        else:
            draw_inner.text((90, 100), f'{i}', font=font, fill=text_color)

        

        # 生成10磅黑线白色圆圈
        circle_radius = 50
        circle_border_color = (0, 0, 0)
        circle_fill_color = (255, 255, 255)
        border_width = 5
        circle_distance = 60 + circle_radius * 2  # 圆圈之间的距离
        bj = 30  # 圆形与边框的距离

        # 存储圆圈的位置信息,用于检查是否相交
        circle_positions = []

        # 阿拉伯数字字体设置
        number_font_size = 80
        number_font = ImageFont.truetype(font_path, number_font_size)

        circle_positions = []
        numbers_written = []

        for _ in range(15000):
            # 数字越大,随机出现指定样式的速度回越快
            # 生成圆心位置
            x = random.randint(circle_radius + border_width + bj, canvas_width - circle_radius - border_width - bj)
            y = random.randint(circle_radius + border_width + bj, canvas_height - circle_radius - border_width - bj)

            # 排除左上角区域
            if x <= 1100 and y <= 800:
                continue

            # 检查与已有圆圈是否相交
            is_intersect = False
            for position in circle_positions:
                distance = math.sqrt((x - position[0]) ** 2 + (y - position[1]) ** 2)
                if distance < circle_distance:
                    is_intersect = True
                    break

            if not is_intersect:
                # 绘制外圆,边线粗细为10磅
                outer_circle_radius = circle_radius + border_width
                outer_circle_bbox = (
                    x - outer_circle_radius, y - outer_circle_radius, x + outer_circle_radius, y + outer_circle_radius)
                draw_inner.ellipse(outer_circle_bbox, outline=circle_border_color, width=border_width)

                # 绘制内圆,填充为白色
                inner_circle_radius = circle_radius
                inner_circle_bbox = (
                    x - inner_circle_radius, y - inner_circle_radius, x + inner_circle_radius, y + inner_circle_radius)
                draw_inner.ellipse(inner_circle_bbox, fill=circle_fill_color)

                # 在圆圈内绘制随机生成的阿拉伯数字
                number = random.choice(numbers)
                number_width, number_height = draw_inner.textsize(str(number), font=number_font)
                number_x = x - number_width // 2
                number_y = y - number_height // 2
                draw_inner.text((number_x, number_y), str(number), font=number_font, fill=(0, 0, 0))

                # 将圆圈位置添加至列表
                circle_positions.append((x, y))

                numbers_written.append(number)

        number_counts = Counter(numbers_written)
        count_10 = number_counts[i]

        print("实际生成的圆圈数量:", len(circle_positions))
        print("生成圆圈中的数字:", numbers_written)
        print("每种数字的数量:", number_counts)
        print(f"数字 {i} 的数量:", count_10)

         # 绘制数字 count_10
         # 在左上角绘制数字
        text_color = (0, 0, 0)
        font_path = r"C:\Windows\Fonts\simhei.ttf"  # 黑体字体路径,请根据实际情况修改
        font_size = 180
        font = ImageFont.truetype(font_path, font_size)

        if len(str(count_10))==1:
            draw_inner.text((800, 430), f'{count_10}', font=font, fill=text_color)
        else:
            draw_inner.text((760, 430), f'{count_10}', font=font, fill=text_color)
        

        if count_10 >= cs and count_10 <=cs2:
            # 保存为1.png
            image_path = input_folder + fr'\{i:02d}.png'
            canvas_inner.save(image_path)
            n += 1
            break
        else:
            print(f"数字 {i} 的数量小于 {cs} 次,重新生成圆圈。")

            # 删除未保存的图片
            image_path = input_folder + fr'\{i:02d}.png'
            if os.path.exists(image_path):
                os.remove(image_path)
            continue

       

        
# 合并
import os
from reportlab.lib.pagesizes import letter
from reportlab.pdfgen import canvas
from PyPDF2 import PdfWriter, PdfFileMerger
from PIL import Image
import img2pdf

def convert_images_to_pdf(image_folder, output_path):
    pdf_merger = PdfFileMerger()

    for image_file in os.listdir(image_folder):
        if image_file.endswith('.jpg') or image_file.endswith('.png'):
            image_path = os.path.join(image_folder, image_file)
            pdf_path = os.path.splitext(image_path)[0] + '.pdf'

            # 使用reportlab库将图片转换为单个PDF文件
            c = canvas.Canvas(pdf_path, pagesize=letter)
            c.drawImage(image_path, 0, 0, width=letter[0], height=letter[1])
            c.save()

            # 使用img2pdf库将图片转换为单个PDF文件
            # with open(pdf_path, "wb") as pdf_file, open(image_path, "rb") as image_file:
            #     pdf_file.write(img2pdf.convert(image_file))

            # 将单个PDF文件添加到PDF合并器中
            pdf_merger.append(pdf_path)

    # 合并所有单个PDF文件为一个最终的PDF文件
    with open(output_path, 'wb') as output_file:
        pdf_merger.write(output_file)

    print(f"PDF文件已生成:{output_path}")


# 使用示例
image_folder = input_folder  # 替换为你的图片文件夹路径
output_path = path + fr'\中2班 学号数感训练(学号{start}-{end}出现次数{cs}-{cs2}次).pdf'  # 替换为你的输出PDF文件路径

convert_images_to_pdf(image_folder, output_path)

import shutil

os.shutil(input_folder)

结果展示:

做完订单后,我决定用同样方法,制作中2的1-29学号的数感训练学号贴

由于出现15次以上的数感学具,数字圆圈很小,看起来头晕,

所以我考虑做3个难度分层。以适合不同月龄的中班孩子

一、低难度(出现5次-10次)

二、中难度(出现15次-20次)

三、高难度(出现20次-25次)

随着难度增加,获取图片的时间也边长了

现在做了三份,虽然自己学号出现的数量少了,但是圆圈还是一样多。密密麻麻看上去眼晕,

我希望最简单的一款,圆圈多,数字大,圆圈数量少。

需要手动选择那些学号要打印,那些学号跳过,也很不方便。

明天找到幼儿的月龄排序表,重新设计代码,将19年9-12月、20年1-4月,20年1-8月作为三个月龄段,孩子们拿到的是属于自己月龄的难度题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2102451.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HarmonyOS开发实战( Beta5版)Swiper高性能开发指南

背景 在应用开发中&#xff0c;Swiper 组件常用于翻页场景&#xff0c;比如&#xff1a;桌面、图库等应用。Swiper 组件滑动切换页面时&#xff0c;基于按需加载原则通常会在下一个页面将要显示时才对该页面进行加载和布局绘制&#xff0c;这个过程包括&#xff1a; 如果该页面…

学习算法需要数学知识吗?

目录 算法与数学:看似不可分割的关系常见算法中的数学元素案例分析:不需要高深数学知识的算法1. 二分查找2. 深度优先搜索 (DFS)3. 动态规划:斐波那契数列 如何在有限的数学背景下学习算法1. 专注于算法的逻辑和过程2. 可视化算法流程3. 从简单的实现开始,逐步优化4. 学习算法设…

centos7使用ifconfig查看IP,终端无ens33信息解决办法

1.问题描述 大概有十几天没用虚拟机&#xff0c;最后一次用忘记关闭虚拟机系统了&#xff1b;突然&#xff0c;发现我用远程连接工具&#xff0c;连接不上&#xff0c;去到虚拟机内部查看IP发现终端竟然没有输出enss33地址信息&#xff0c;额&#xff0c;就像下面这样。 2.解决…

android so的加载流程(Android 13~14)

序言 分析环境: Android 13~14 其实大佬 << 安卓so加载流程源码分析 >> 已经写得非常好了,我就没必要再写了 建议读者看看这篇文字,比较新,质量很高<< 安卓so加载流程源码分析 >> 为什么要分析 android so的加载流程 ??? 我想明白 so是怎么打…

无人机之反制系统篇

无人机的反制系统是一个复杂而精细的系统&#xff0c;旨在应对无人机的不当使用或潜在威胁。该系统通常由多个关键部分组成&#xff0c;包括搜索系统、光电跟踪系统、射频干扰系统及显控单元等&#xff0c;这些部分共同协作以实现对无人机的有效反制。以下是对无人机反制系统的…

SpringBoot开发——初步了解SpringBoot

文章目录 一、SpringBoot简介1、什么是Spring Boot2、Spring Boot的优点3、Spring Boot功能 二、Spring与Spring Boot对比三、Spring Boot与Spring MVC四、Spring Boot体系结构五、Springboot Initializr1、Spring Initializr2、Spring Initializr模块 一、SpringBoot简介 1、…

docker ps 得到的ports列的含义

前言 每次使用docker ps 查询容器运行情况的时候就很容易搞混ports列的含义&#xff0c;今天浅记一下 docker ps ports列含义 首先看docker ps的查询结果显示&#xff1a; CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 容器ID …

Axure中继器教程及案例详解

Axure RP 是一款强大的原型设计工具&#xff0c;广泛应用于产品设计、UI/UX 设计及交互设计中。中继器&#xff08;Repeater&#xff09;作为 Axure 中的一个重要元件&#xff0c;以其强大的数据处理和动态交互能力&#xff0c;成为设计师们不可或缺的工具。本文将从中继器基础…

LLM agentic模式之multi-agent: ChatDev,MetaGPT, AutoGen思路

文章目录 Multi-agentChatDev设计阶段编码阶段测试阶段文档编写 MetaGPTSOP模式下的Agent通信协议带执行反馈的迭代编程 AutoGenconversable agentsConversation ProgrammingAutoGen的应用 参考资料 Multi-agent ChatDev ChatDev出自2023年7月的论文《ChatDev: Communicative…

告别文档处理烦恼,PDF Guru Anki一键搞定所有

前言 知识就像烛光&#xff0c;能照亮一个人&#xff0c;也能照亮无数人&#xff0c;科技之光更是如此&#xff1b;这一理念深刻地影响了我们如何看待和应用新技术。正是在这样的背景下&#xff0c;一款集PDF处理与高效学习工具于一体的软件——PDF Guru Anki应运而生&#xf…

AI论文生成可靠吗?分享6款AI论文题目生成器网站

在当今学术研究和写作领域&#xff0c;AI论文题目生成器网站的出现极大地简化了学术写作流程。这些工具不仅能够帮助用户快速生成高质量的论文题目&#xff0c;还能提供文献推荐、论文润色等功能&#xff0c;从而提高写作效率和质量。以下是六款值得推荐的AI论文题目生成器网站…

glsl着色器学习(六)

准备工作已经做完&#xff0c;下面开始渲染 gl.viewport(0, 0, gl.canvas.width, gl.canvas.height);gl.clearColor(0.5, 0.7, 1.0, 1.0); gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);gl.enable(gl.DEPTH_TEST); gl.enable(gl.CULL_FACE);设置视口 gl.viewport(0,…

轻量级的git-server工具:docker部署gogs

背景 创建一个自己使用的git server&#xff0c;让平时使用的代码之类的可以直接传到自己的服务器上&#xff0c;进行远程管理。由于一个人使用&#xff0c;gitlab 太重&#xff0c;所以选择gogs来实现功能。 系统&#xff1a;openEuler 22.03 (LTS-SP3) ip: 192.168.100.31 …

【Linux】Linux项目自动化构建工具 - make/Makefile

目录 一、make/Makefile的背景二、make/Makefile的基本概念三、依赖关系四、依赖方法五、make/Makefile原理六、Makefile的伪目标七、Makefile的变量八、Makefile的推导能力结尾 一、make/Makefile的背景 一个工程中的源文件不计数&#xff0c;其按类型、功能、模块分别放在若…

【Java 基础】:三大特征之多态

✨ 杏花疏影里&#xff0c;吹笛到天明 &#x1f30f; &#x1f4c3;个人主页&#xff1a;island1314 &#x1f525;个人专栏&#xff1a;java学习 ⛺️ 欢迎关注&#xff1a;&#x1f44d;点赞 &#x1f442;&…

JVM参数有哪些?

JVM调优主要是通过定制JVM参数来提Java应用程序的运行速度 JVM参数大致可以分为三类&#xff1a; &#xff11;、标准指令&#xff1a;&#xff0d;开头&#xff0c;这些是所有的HotSPot都支持的参数。可以用java -help打印出来&#xff1b; 2、非标准指令&#xff1a;-X开头…

Mysql高级篇(上)—— Mysql架构介绍(二)

Mysql高级篇&#xff08;上&#xff09; MySQL架构介绍&#xff08;二&#xff09;逻辑架构逻辑架构剖析MySQL8.0中SQL执行流程Linux环境下MySQL8.0中SQL执行原理MySQL语法顺序Oracle中SQL执行流程&#xff08;了解&#xff09;数据库缓存池 buffer pool&#xff08;了解&#…

86、pod部署策略

一、集群的调度 集群的调度&#xff1a; 怎么把pod部署到节点的方法。 1.1、调度的过程&#xff1a; scheduler是集群的调度器&#xff0c;主要任务就是把pod部署到节点上。 1.2、自动调度&#xff1a; 1、公平&#xff0c;保证每个可用的节点都可以部署pod 2、资源的高…

什么是工控安全,产线工控安全加固的方法

一、工控安全概述 想要了解工控安全&#xff0c;首先要了解其资产对象本身&#xff0c;也就是工业控制系统。 1、什么是工控 关于工业控制系统的定义&#xff0c;网上有很多&#xff0c;我就不再赘述&#xff0c;下面这张图是我从csdn找到的&#xff0c;个人觉得还不错。对照…

【多线程】CountDownLatch的简单实现

通过上一篇对CountDownLatch的使用&#xff0c;我们也明白了他的基本原理&#xff0c;接下来我们一起来实现一个CountDownLatch的基础效果 新建一个抽象类&#xff0c;包含countDownLatch需要的参数和方法 package com.atguigu.signcenter.nosafe.chouxiang;/*** author: jd* …