作品展示:
背景需求:
【教学类-54-01】20240510超级对对碰(圆点拼图)(9*5、0-255随机)-CSDN博客文章浏览阅读770次,点赞21次,收藏22次。【教学类-54-01】20240510超级对对碰(圆点拼图)(9*5、0-255随机)https://blog.csdn.net/reasonsummer/article/details/138725919
我想把圆点子变成三角点子(等边三角形)
代码展示
from PIL import Image, ImageDraw
import random, os
import math
print('--------1、制作图片-----------')
path = r'C:\Users\jg2yXRZ\OneDrive\桌面\超级对对碰三角形'
folder_path = path + r'\jpg'
os.makedirs(folder_path, exist_ok=True)
r = 100
colors = ['red', 'yellow', 'green', 'cyan', 'blue', 'purple', 'black', 'gray', 'brown', 'pink', 'magenta']
for ii in range(3):
# 创建画布
canvas_width = 2100
canvas_height = 2970
canvas_color = (255, 255, 255) # 白色背景
line_color = (0, 0, 0) # 黑色线条
line_width = 10
margin = 150 # 边距
canvas = Image.new('RGB', (canvas_width, canvas_height), canvas_color)
draw = ImageDraw.Draw(canvas)
# 计算单元格大小和绘制区域
num_rows = 5
num_cols = 4
cell_size = min((canvas_width - 2 * margin) // num_cols, (canvas_height - 2 * margin) // num_rows)
start_x = (canvas_width - cell_size * num_cols) // 2
start_y = (canvas_height - cell_size * num_rows) // 2
# 绘制单元格和圆形
for row in range(num_rows + 1):
y = start_y + row * cell_size
draw.line([(start_x, y), (start_x + cell_size * num_cols, y)], fill=line_color, width=line_width)
for col in range(num_cols + 1):
x = start_x + col * cell_size
draw.line([(x, start_y), (x, start_y + cell_size * num_rows)], fill=line_color, width=line_width)
# 保存图像
canvas.save(folder_path+fr'\{ii:02d}底图.png')
# 上边的圆
for row in range(num_rows):
for col in range(num_cols):
center_x = start_x + (col + 0.5) * cell_size
center_y = start_y + row * cell_size
triangle_side = 2 * r # 等边三角形的边长
triangle_height = triangle_side * math.sqrt(3) / 2 # 等边三角形的高度
triangle_color = random.choice(colors)
triangle_top = (center_x, center_y - triangle_height / 2)
triangle_left = (center_x - triangle_side / 2, center_y + triangle_height / 2)
triangle_right = (center_x + triangle_side / 2, center_y + triangle_height / 2)
draw.polygon([triangle_top, triangle_left, triangle_right], fill=triangle_color)
# 下边的等边三角形(垂直排列)
for row in range(num_rows):
for col in range(num_cols):
center_x = start_x + (col + 0.5) * cell_size
center_y = start_y + (row + 1) * cell_size
triangle_side = 2 * r # 等边三角形的边长
triangle_height = triangle_side * math.sqrt(3) / 2 # 等边三角形的高度
triangle_color = random.choice(colors)
triangle_top = (center_x, center_y - triangle_height / 2)
triangle_left = (center_x - triangle_side / 2, center_y + triangle_height / 2)
triangle_right = (center_x + triangle_side / 2, center_y + triangle_height / 2)
draw.polygon([triangle_top, triangle_left, triangle_right], fill=triangle_color)
# 左边的等边三角形向左旋转90度并调整方向
for row in range(num_rows):
for col in range(num_cols):
center_x = start_x + col * cell_size
center_y = start_y + (row + 0.5) * cell_size
triangle_side = 2 * r # 等边三角形的边长
triangle_height = triangle_side * math.sqrt(3) / 2 # 等边三角形的高度
triangle_color = random.choice(colors)
triangle_top = (center_x, center_y - triangle_height / 2)
triangle_left = (center_x - triangle_side / 2, center_y + triangle_height / 2)
triangle_right = (center_x + triangle_side / 2, center_y + triangle_height / 2)
draw.polygon([triangle_top, triangle_left, triangle_right], fill=triangle_color)
# 右边的等边三角形向右旋转90度并调整方向
for row in range(num_rows):
for col in range(num_cols):
center_x = start_x + (col + 1) * cell_size
center_y = start_y + (row + 0.5) * cell_size
triangle_side = 2 * r # 等边三角形的边长
triangle_height = triangle_side * math.sqrt(3) / 2 # 等边三角形的高度
triangle_color = random.choice(colors)
triangle_top = (center_x, center_y - triangle_height / 2)
triangle_left = (center_x - triangle_side / 2, center_y + triangle_height / 2)
triangle_right = (center_x + triangle_side / 2, center_y + triangle_height / 2)
draw.polygon([triangle_top, triangle_left, triangle_right], fill=triangle_color)
# 左边的等边三角形向左旋转90度并调整方向
# 重新绘制单元格和等边三角形(加入黑色框线,便于裁剪)
for row in range(num_rows + 1):
y = start_y + row * cell_size
draw.line([(start_x, y), (start_x + cell_size * num_cols, y)], fill=line_color, width=line_width)
for col in range(num_cols + 1):
x = start_x + col * cell_size
draw.line([(x, start_y), (x, start_y + cell_size * num_rows)], fill=line_color, width=line_width)
# 保存彩色图像
canvas.save(folder_path + fr'\{ii:02d}.png')
print('--------2、png 合并pdf-----------')
import os
from PIL import Image
from reportlab.lib.pagesizes import A4
from reportlab.lib.utils import ImageReader
from reportlab.pdfgen import canvas
# 获取文件夹中的所有PNG图片文件
image_files = [file for file in os.listdir(folder_path) if file.endswith('.png')]
# 创建一个新的PDF文件
pdf_file = path + r'\超级对对碰底图.pdf' # 替换为实际的输出PDF文件路径
c = canvas.Canvas(pdf_file, pagesize=A4)
# 遍历每个PNG图片文件并将其添加到PDF中
for image_file in image_files:
image_path = os.path.join(folder_path, image_file)
image = Image.open(image_path)
image_reader = ImageReader(image)
c.setPageSize(A4)
c.drawImage(image_reader, 0, 0, width=A4[0], height=A4[1])
c.showPage()
# 保存并关闭PDF文件
c.save()
# print(f"合并完成,PDF文件保存在:{pdf_file}")
因为是等边三角形,所以AI的顶边出现的正立的三角形,AI底边是倒置的三角形。所以反复问了AI才让三角形都是正立的。