【教学类-50-08】20240501“数一数”图片样式06:数一数(几何图案——等边三角形、2:1椭圆形)

作品展示:

背景需求:

【教学类-50-01】20240407“数一数”图片样式01:纯色图形与边框不相交,纯色图形和其他纯色图形不相交-CSDN博客文章浏览阅读807次,点赞33次,收藏14次。【教学类-50-01】20240407“数一数”图片样式01:纯色图形与边框不相交,纯色图形和其他纯色图形不相交https://blog.csdn.net/reasonsummer/article/details/137511583

前期制作数一数几何图形时

1、椭圆形和圆形混淆:不仅是幼儿,连老师也会把椭圆形看成圆形

——这款椭圆形的代码是随机生成椭圆形的长宽直径,长轴与宽轴是10:9,基本看不出差异,默认是正圆形。

我希望固定椭圆形的外形:长轴与宽轴2:1,方向是横排、竖排

2、等腰直角三角形,都是“”的样式。

我觉得平时用的最多的还是等边三角形(45度角)

代码展示:

'''
01数一数图形(等腰三角形、椭圆2:1)
作者:AI对话大师、阿夏
时间:2024年4月28日 20:00
'''
import matplotlib.pyplot as plt
import matplotlib.patches as patches
import numpy as np
import os
import random
import time
from shapely.geometry import Polygon
from shapely.ops import cascaded_union

c = int(input('画布大小(15)\n'))
num=int(input('多少张\n'))
alp=1.0
# float(input('透明度(1.0=分开纯色)\n'))

# 创建目录
output_dir = r'C:\Users\jg2yXRZ\OneDrive\桌面\数一数2\01几何框内不连接'
end=output_dir+r'\01无框线'
os.makedirs(output_dir, exist_ok=True)
os.makedirs(end, exist_ok=True)

# 随机生成多个等腰直角三角形
for i in range(num):
    # 创建画布
    fig, ax = plt.subplots(figsize=(c, c))
    ax.set_xlim([0, c])
    ax.set_ylim([0, c])

    # 随机几个图形
    num_triangles = random.randint(1, 5)
    num_square =random.randint(1, 5)
    num_cicle = random.randint(1, 5)
    num_ellipse = random.randint(1, 5)
    num_rectangle = random.randint(1, 5)

    colors = ['red', 'yellow', 'blue']
    shapes = []
    # 等腰三角形
    # for _ in range(num_triangles):
    #     while True:
    #         # 随机生成等腰三角形的顶点坐标
    #         base_point = np.random.rand(2) * c
    #         side_length = np.random.rand() * 2 + 1

    #         # 计算等腰三角形的顶点坐标
    #         top_point = base_point + np.array([side_length / 2, np.sqrt(3) * side_length / 2])
    #         height_point = base_point + np.array([side_length, 0])

    #         # 检查三角形是否在画布内部
        
    #         triangle = Polygon([base_point, top_point, height_point])
    #         if np.all(base_point >= 0) and np.all(top_point <= c) and np.all(height_point <= c) and not any(shape.intersects(triangle) for shape in shapes):
    #             break

    # # 随机选择颜色
    # color = np.random.choice(colors)

    # # 创建并填充等腰三角形
    # triangle_vertices = np.array([base_point, top_point, height_point])
    # triangle = Polygon(triangle_vertices)
    # triangle_patch = patches.Polygon(triangle_vertices, closed=True, alpha=alp, color=color)
    # ax.add_patch(triangle_patch)
    # shapes.append(triangle)

    # 直角三角形
    # for _ in range(num_triangles):
    #     while True:
    #         # 随机生成等腰直角三角形的顶点坐标
    #         base_point = np.random.rand(2) * c
    #         side_length = np.random.rand() * 2 + 1

    #         # 计算等腰直角三角形的顶点坐标
    #         top_point = base_point + np.array([side_length, 0])
    #         height_point = base_point + np.array([0, side_length])

    #         # 检查三角形是否在画布内部
        
    #         triangle = Polygon([base_point, top_point, height_point])
    #         if np.all(base_point >= 0) and np.all(top_point <= c) and np.all(height_point <= c) and not any(shape.intersects(triangle) for shape in shapes):
    #             break

    #     # 随机选择颜色
    #     color = np.random.choice(colors)

    #     # 创建并填充等腰直角三角形
    #     triangle_vertices = np.array([base_point, top_point, height_point])
    #     triangle = Polygon(triangle_vertices)
    #     triangle_patch = patches.Polygon(triangle_vertices, closed=True, alpha=alp, color=color)
    #     ax.add_patch(triangle_patch)
    #     shapes.append(triangle)


    # 倒置的直角三角形
    # import math
    # for _ in range(num_triangles):
    #     while True:
    #         # 随机生成等边三角形的顶点坐标
    #         base_point = np.random.rand(2) * c
    #         side_length = np.random.rand() * 2 + 1

    #         # 计算等边三角形的顶点坐标
    #         height = (math.sqrt(3) / 2) * side_length
    #         top_point = base_point + np.array([side_length / 2, height])
    #         left_point = base_point + np.array([0, height])
    #         right_point = base_point + np.array([side_length, height])

    #         # 检查三角形是否在画布内部

    #         triangle = Polygon([base_point, top_point, left_point])
    #         if np.all(base_point >= 0) and np.all(top_point <= c) and np.all(left_point <= c) and np.all(right_point <= c) and not any(shape.intersects(triangle) for shape in shapes):
    #             break

    #     # 随机选择颜色
    #     color = np.random.choice(colors)

    #     # 创建并填充等边三角形
    #     triangle_vertices = np.array([base_point, top_point, left_point])
    #     triangle = Polygon(triangle_vertices)
    #     triangle_patch = patches.Polygon(triangle_vertices, closed=True, alpha=alp, color=color)
    #     ax.add_patch(triangle_patch)
    #     shapes.append(triangle)


    # 等边三角形
    import math

    for _ in range(num_triangles):
        while True:
            # 随机生成等边三角形的顶点坐标
            base_point = np.random.rand(2) * c
            side_length = np.random.rand() * 2 + 1

            # 计算等边三角形的顶点坐标
            height = side_length * math.sqrt(3) / 2
            top_point = base_point + np.array([side_length / 2, height])
            left_point = base_point + np.array([0, 0])
            right_point = base_point + np.array([side_length, 0])

            # 检查三角形是否在画布内部
            triangle = Polygon([left_point, right_point, top_point])
            if np.all(base_point >= 0) and np.all(top_point <= c) and np.all(left_point >= 0) and np.all(right_point <= c) and not any(shape.intersects(triangle) for shape in shapes):
                break

        # 随机选择颜色
        color = np.random.choice(colors)
        print(color)

        # 创建并填充等边三角形
        triangle_vertices = np.array([left_point, right_point, top_point])
        triangle = Polygon(triangle_vertices)
        triangle_patch = patches.Polygon(triangle_vertices, closed=True, alpha=alp, color=color)
        ax.add_patch(triangle_patch)
        shapes.append(triangle)
        


    # 随机生成正方形
    for _ in range(num_square):
        while True:
            # 随机生成正方形的中心点坐标
            center = np.random.rand(2) * c

            # 随机生成正方形的边长
            side_length = np.random.rand() * 2 + 1

            # 检查正方形是否在画布内部
            square = Polygon([(center[0]-side_length/2, center[1]-side_length/2), (center[0]+side_length/2, center[1]-side_length/2),
                              (center[0]+side_length/2, center[1]+side_length/2), (center[0]-side_length/2, center[1]+side_length/2)])
            if np.all(center - side_length/2 >= 0) and np.all(center + side_length/2 <= c) and not any(shape.intersects(square) for shape in shapes):
                break

        # 随机选择颜色
        color = np.random.choice(colors)

        # 创建并填充正方形
        square_patch = patches.Rectangle((center[0]-side_length/2, center[1]-side_length/2), side_length, side_length, alpha=alp, color=color)
        ax.add_patch(square_patch)
        shapes.append(square)

    # 随机生成圆形
    for _ in range(num_cicle):
        while True:
            # 随机生成圆形的中心点坐标
            center = np.random.rand(2) * c

            # 随机生成圆形的半径
            radius = np.random.rand() * 2 + 1

            # 检查圆形是否在画布内部
            circle = Polygon([(center[0]-radius, center[1]-radius), (center[0]+radius, center[1]-radius),
                              (center[0]+radius, center[1]+radius), (center[0]-radius, center[1]+radius)])
            if np.all(center - radius >= 0) and np.all(center + radius <= c) and not any(shape.intersects(circle) for shape in shapes):
                break

        # 随机选择颜色
        color = np.random.choice(colors)

        # 创建并填充圆形
        circle_patch = patches.Circle((center[0], center[1]), radius, alpha=alp, color=color)
        ax.add_patch(circle_patch)
        shapes.append(circle)

    # # 随机生成椭圆形(随意长宽,很容易被认为圆形)
    # for _ in range(num_ellipse):
    #     while True:
    #         # 随机生成椭圆形的中心点坐标
    #         center = np.random.rand(2) * c

    #         # 随机生成椭圆形的长轴和短轴
    #         major_axis = np.random.rand() * 2 + 1
    #         minor_axis = np.random.rand() * 2 + 1

    #         # 检查椭圆形是否在画布内部
    #         ellipse_vertices = []
    #         num_points = 100
    #         angle = np.linspace(0, 2 * np.pi, num_points)
    #         for a in angle:
    #             x = center[0] + major_axis / 2 * np.cos(a)
    #             y = center[1] + minor_axis / 2 * np.sin(a)
    #             ellipse_vertices.append([x, y])
    #         ellipse = Polygon(ellipse_vertices)
    #         if np.all(center - np.array([major_axis, minor_axis]) / 2 >= 0) and np.all(
    #                 center + np.array([major_axis, minor_axis]) / 2 <= c) and not any(
    #             shape.intersects(ellipse) for shape in shapes):
    #             break

    #     # 随机选择颜色
    #     color = np.random.choice(colors)

    #     # 创建并填充椭圆形
    #     ellipse_patch = patches.Ellipse((center[0], center[1]), major_axis, minor_axis, alpha=alp, color=color)
    #     ax.add_patch(ellipse_patch)
    #     shapes.append(ellipse)

    # # # 随机生成椭圆形水平的
    # for _ in range(num_ellipse):
    #     while True:
    #         # 随机生成椭圆形的中心点坐标
    #         center = np.random.rand(2) * c

    #         # 随机生成椭圆形的长轴和短轴
    #         major_axis = np.random.rand() * 2 + 1
    #         minor_axis = major_axis / 2  # 将短轴设为长轴的一半,以满足2:1的长宽比

    #         # 检查椭圆形是否在画布内部
    #         ellipse_vertices = []
    #         num_points = 100
    #         angle = np.linspace(0, 2 * np.pi, num_points)
    #         for a in angle:
    #             x = center[0] + major_axis / 2 * np.cos(a)
    #             y = center[1] + minor_axis / 2 * np.sin(a)
    #             ellipse_vertices.append([x, y])
    #         ellipse = Polygon(ellipse_vertices)
    #         if np.all(center - np.array([major_axis, minor_axis]) / 2 >= 0) and np.all(
    #                 center + np.array([major_axis, minor_axis]) / 2 <= c) and not any(
    #             shape.intersects(ellipse) for shape in shapes):
    #             break

    #     # 随机选择颜色
    #     color = np.random.choice(colors)

    #     # 创建并填充椭圆形
    #     ellipse_patch = patches.Ellipse((center[0], center[1]), major_axis, minor_axis, alpha=alp, color=color)
    #     ax.add_patch(ellipse_patch)
    #     shapes.append(ellipse)

#  # # 随机生成椭圆形水平的垂直的(任意角度倾斜)
#     import random

#     for _ in range(num_ellipse):
#         while True:
#             # 随机生成椭圆形的中心点坐标
#             center = np.random.rand(2) * c

#             # 随机生成椭圆形的长轴和短轴
#             major_axis = np.random.rand() * 2 + 1
#             minor_axis = major_axis / 2  # 将短轴设为长轴的一半,以满足2:1的长宽比

#             # 随机生成椭圆形的旋转角度
#             angle = np.random.rand() * 2 * np.pi

#             # 检查椭圆形是否在画布内部
#             ellipse_vertices = []
#             num_points = 100
#             angle_points = np.linspace(0, 2 * np.pi, num_points)
#             for a in angle_points:
#                 x = center[0] + major_axis / 2 * np.cos(a) * np.cos(angle) - minor_axis / 2 * np.sin(a) * np.sin(angle)
#                 y = center[1] + major_axis / 2 * np.cos(a) * np.sin(angle) + minor_axis / 2 * np.sin(a) * np.cos(angle)
#                 ellipse_vertices.append([x, y])
#             ellipse = Polygon(ellipse_vertices)
#             if np.all(center - np.array([major_axis, minor_axis]) / 2 >= 0) and np.all(
#                     center + np.array([major_axis, minor_axis]) / 2 <= c) and not any(
#                 shape.intersects(ellipse) for shape in shapes):
#                 break

#         # 随机选择颜色
#         color = np.random.choice(colors)

#         # 创建并填充椭圆形
#         ellipse_patch = patches.Ellipse((center[0], center[1]), major_axis, minor_axis, angle=np.rad2deg(angle), alpha=alp,
#                                         color=color)
#         ax.add_patch(ellipse_patch)
#         shapes.append(ellipse)

#  # # 随机生成椭圆形水平的垂直的(90和180)
#     import random

    for _ in range(num_ellipse):
        while True:
            # 随机生成椭圆形的中心点坐标
            center = np.random.rand(2) * c

            # 随机生成椭圆形的长轴和短轴
            major_axis = np.random.rand() * 2 + 1
            minor_axis = major_axis / 2  # 将短轴设为长轴的一半,以满足2:1的长宽比

            # 随机选择椭圆形的旋转角度(90度或180度)
            angle = np.random.choice([np.pi / 2, np.pi])

            # 检查椭圆形是否在画布内部
            ellipse_vertices = []
            num_points = 100
            angle_points = np.linspace(0, 2 * np.pi, num_points)
            for a in angle_points:
                x = center[0] + major_axis / 2 * np.cos(a) * np.cos(angle) - minor_axis / 2 * np.sin(a) * np.sin(angle)
                y = center[1] + major_axis / 2 * np.cos(a) * np.sin(angle) + minor_axis / 2 * np.sin(a) * np.cos(angle)
                ellipse_vertices.append([x, y])
            ellipse = Polygon(ellipse_vertices)
            if np.all(center - np.array([major_axis, minor_axis]) / 2 >= 0) and np.all(
                    center + np.array([major_axis, minor_axis]) / 2 <= c) and not any(
                shape.intersects(ellipse) for shape in shapes):
                break

        # 随机选择颜色
        color = np.random.choice(colors)

        # 创建并填充椭圆形
        ellipse_patch = patches.Ellipse((center[0], center[1]), major_axis, minor_axis, angle=np.rad2deg(angle), alpha=alp,
                                        color=color)
        ax.add_patch(ellipse_patch)
        shapes.append(ellipse)


    # # 随机生成长方形
    # for _ in range(num_rectangle):
    #     while True:
    #         # 随机生成长方形的中心点坐标
    #         center = np.random.rand(2) * c

    #         # 随机生成长方形的长和宽
    #         width = np.random.rand() * 2 + 1
    #         height = np.random.rand() * 2 + 1

    #         # 检查长方形是否在画布内部
    #         rectangle = Polygon([(center[0] - width / 2, center[1] - height / 2),
    #                              (center[0] + width / 2, center[1] - height / 2),
    #                              (center[0] + width / 2, center[1] + height / 2),
    #                              (center[0] - width / 2, center[1] + height / 2)])
    #         if np.all(center - np.array([width, height]) / 2 >= 0) and np.all(
    #                 center + np.array([width, height]) / 2 <= c) and not any(
    #             shape.intersects(rectangle) for shape in shapes):
    #             break

    #     # 随机选择颜色
    #     color = np.random.choice(colors)

    #     # 创建并填充长方形
    #     rectangle_patch = patches.Rectangle((center[0] - width / 2, center[1] - height / 2), width, height,
    #                                         alpha=alp, color=color)
    #     ax.add_patch(rectangle_patch)
    #     shapes.append(rectangle)

    # 隐藏坐标轴
    ax.axis('off')

    # 保存图形
    output_path = os.path.join(end, f'{i:02d}.png')
    plt.savefig(output_path, dpi=200, bbox_inches='tight')

    # 关闭画布
    plt.close(fig)

    # 暂停3秒
    time.sleep(3)

修改学具中的几何图案,把它们改成特征明显的样式(等边三角形、2:1椭圆形)这样,孩子们判断三角、椭圆形就不会错误了!

  • 14
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

阿夏reasonsummer

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

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

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

打赏作者

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

抵扣说明:

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

余额充值