from PIL import Image, ImageDraw, ImageFont
from IPython.display import display
from matplotlib import rcParams
import matplotlib.font_manager as fm
def create_dice_face(draw, x, y, size, number):
# 正方形を描画
draw.rectangle([x, y, x + size, y + size], outline="black", width=2, fill="white")
dot_positions = {
1: [(0.5, 0.5)],
2: [(0.25, 0.75), (0.75, 0.25)],
3: [(0.25, 0.75), (0.5, 0.5), (0.75, 0.25)],
4: [(0.25, 0.25), (0.25, 0.75), (0.75, 0.25), (0.75, 0.75)],
5: [(0.25, 0.25), (0.25, 0.75), (0.5, 0.5), (0.75, 0.25), (0.75, 0.75)],
6: [(0.25, 0.25), (0.25, 0.5), (0.25, 0.75), (0.75, 0.25), (0.75, 0.5), (0.75, 0.75)]
}
dot_size = int(size * 0.15) if number == 1 else int(size * 0.1)
dot_color = "red" if number == 1 else "black"
for px, py in dot_positions[number]:
cx, cy = int(x + px * size), int(y + py * size)
draw.ellipse([cx - dot_size//2, cy - dot_size//2, cx + dot_size//2, cy + dot_size//2], fill=dot_color)
def create_dice_net(draw, start_x, start_y, size, is_female):
# 展開図の配置:
# [4]
# [2][1][5][6]
# [3]
faces_female = [
(4, size, 0), # 上面
(2, 0, size), # 左面
(1, size, size), # 前面
(5, size * 2, size), # 右面
(6, size * 3, size), # 後面
(3, size, size * 2) # 下面
]
faces_male = [
(5, size, 0), # 上面(4と5を入れ替え)
(3, 0, size), # 左面
(1, size, size), # 前面
(4, size * 2, size), # 右面(4と5を入れ替え)
(6, size * 3, size), # 後面
(2, size, size * 2) # 下面
]
faces = faces_female if is_female else faces_male
for number, x, y in faces:
create_dice_face(draw, start_x + x, start_y + y, size, number)
def create_both_dice_nets(size=100):
# フォントの設定
font_path = '/System/Library/Fonts/ヒラギノ丸ゴ ProN W4.ttc' # 適切な日本語フォントファイルを指定してください
font_prop = fm.FontProperties(fname=font_path)
rcParams['font.family'] = font_prop.get_name()
# PILで使用するフォントを設定
pil_font = ImageFont.truetype(font_path, 20)
# 展開図の全体サイズを設定
img_width, img_height = size * 5, size * 7 # 高さを2倍+余白に
img = Image.new('RGB', (img_width, img_height), color='white')
draw = ImageDraw.Draw(img)
# 雌サイコロの展開図を描画
create_dice_net(draw, 50, 20, size, True)
draw.text((10, 10), "雌サイコロ", fill="black", font=pil_font)
# 雄サイコロの展開図を描画
create_dice_net(draw, 50, 20 + size * 3 + 50, size, False) # 50ピクセルの余白を追加
draw.text((10, size * 3 + 60), "雄サイコロ", fill="black", font=pil_font)
return img
# 画像を生成し、Jupyter Notebookに表示
both_dice_nets = create_both_dice_nets(size=100)
display(both_dice_nets)
# PNG画像として保存(オプション)
both_dice_nets.save("both_dice_nets.png")
print("both_dice_nets.png が生成されました。")
P. S. 上記の配置はサイコロキャラメルで確認した。実際には,2の目,3の目,6の目の配置がそれぞれ2パターンあるので,1つの性別に対して8パターンの配置がある。普通のサイコロは,1-2-3の頂点から見て,2や3の目が頂点から放射状に配列するのではなく,頂点のまわりを取り囲むように配列していることになる。