作品展示:控制数字出现的次数大于10次
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、为了让孩子多圈一会儿,可能要把圆圈大小和文字都变小