【教学类-56-02】数感训练——数字02(控制指定数字出现的数量)

作品展示:控制数字出现的次数大于10次

背景需求:
【教学类-56-01】数感训练——数字01(同样的数字涂色)-CSDN博客文章浏览阅读535次,点赞16次,收藏8次。【教学类-56-01】数感训练——数字01(同样的数字涂色)https://blog.csdn.net/reasonsummer/article/details/139016672?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22139016672%22%2C%22source%22%3A%22reasonsummer%22%7D

500次生成图片,纸上大约80个圆圈,但数字12只有7张,数量少,得幼儿找数字会很快了。

所以我需要控制数字12出现的次数,比如数字12至少出现10次

'''
数感训练-0-10数字,指定数字至少出现10次
AI对话大师,阿夏
2024年5月22日

'''

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

path = r'C:\Users\jg2yXRZ\OneDrive\桌面\数字数感训练\jpg'
canvas_width, canvas_height = 3000, 4000  # 调整画布的宽度和高度

numbers = [i for i in range(10, 20)]
print(numbers)

# 指定数字至少出现几次
cs=10

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

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

        # 字体设置
        font_path = r"C:\Windows\Fonts\simhei.ttf"  # 黑体字体路径,请根据实际情况修改
        font_size = 500
        font = ImageFont.truetype(font_path, font_size)

        # 在左上角绘制阴影效果
        shadow_color = (100, 100, 100)
        shadow_offset = (8, 8)
        draw.text((100 + shadow_offset[0], 100 + shadow_offset[1]), f'{i}', font=font, fill=shadow_color)

        # 在左上角绘制数字1
        text_color = (0, 0, 0)
        draw.text((100, 100), f'{i}', font=font, fill=text_color)

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

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

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

        circle_positions = []
        numbers_written = []

        for _ in range(5000):
            # 生成圆心位置
            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 <= 800 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.ellipse(outer_circle_bbox, fill=circle_border_color)

                # 绘制内圆,填充为白色
                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.ellipse(inner_circle_bbox, fill=circle_fill_color)

                # 在圆圈内绘制随机生成的阿拉伯数字
                number = random.choice(numbers)
                number_width, number_height = draw.textsize(str(number), font=number_font)
                number_x = x - number_width // 2
                number_y = y - number_height // 2
                draw.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)

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

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

结果展示:

数字随机出现次数>10

如果改成15次

因为是随机抽取,所以很难保证指定数字大于15,需要反复抽取很多次

这样就可以控制数字出现的数量了。

教学实践:

时间:2024年5月24日

班级:中4

人数:5人(百日咳隔离)

数字:打印10-19,每张数字都在15个以上

教学反思:

1、中班下学期孩子辨认指定数字都没问题。15为幼儿完成太快了,都是正确的。我让他们点数“数字”出现了几次。只有16号统计了总数,并且做了3张数感练习。

2、幼儿用彩色笔圈画方式找数字(我一直以为这个数感训练是圆圈涂色,那样容易遮挡数字)

3、幼儿把指定数字当做学号“我没有找到我的学号!”

后续:

1、生成1-31个代表学号的数字,每位孩子选自己的学号纸,进行数感练习。

2、每张纸上可以有所有孩子的名字,让幼儿圈出自己的名字或者认识的汉字

3、对指定数字出现的频率进行数量统计,如数字11出现了15次

4、为了让孩子多圈一会儿,可能要把圆圈大小和文字都变小

  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿夏reasonsummer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值