Pythonでいろいろやってみる

Pythonを使った画像処理や機械学習などの簡単なプログラムを載せています。

四角の中に円を充てんする

四角の中に大きさの異なる円を重ならないようにできるだけ多く描画します。すでに描画した円の座標および半径をリストに記録しておいて、新しく描こうとする円と重ならないかをチェックし、重ならない場合描画します。これを繰り返し試行することで円の充てん率を上げます。

環境
  • windows10 home
  • jupyter notebook 6.3.0
  • Python 3.8.8
  • OpenCV 4.0.1
コード
import cv2
import numpy as np
import random
import math

# 描画用の画像の作成
img = np.zeros((600, 600, 3), np.uint8)
img[:, :, :] = 200

# 座標と半径を記録するリスト
x_list = []
y_list = []
r_list = []


for i in range(400000):
    # 新規の円のx, y, 半径をランダムで設定
    x = random.randint(1, 600)
    y = random.randint(1, 600)
    r = random.randint(8, 32)
    
    # 円の重なりチェック用変数
    check = 0            
    # 既存の円の座標、半径のリストを順に読み出し、新規の円と重なるかをチェック。重なった場合はcheck = 1
    for j in range(len(x_list)):
        dx = x_list[j] - x
        dy = y_list[j] - y        
        if math.sqrt(dx**2 + dy**2) < r_list[j] + r:
            check = 1
            break
    # 既存の円に新規の円が重ならない(check = 0)場合に円を描いて座標と半径を記録するリストに追記            
    if check == 0:
        cv2.circle(img, (x, y), r, (20, 20, random.randint(190, 250)), -1, cv2.LINE_AA)
        x_list.append(x)  
        y_list.append(y)  
        r_list.append(r)  
    
# 画像の保存
cv2.imwrite('circles.jpg', img)
実行結果

四角形が大きさの異なる円で充てんされました。
f:id:T_A_T:20211031214725j:plain

ブログランキングに参加しています

にほんブログ村 IT技術ブログへ
にほんブログ村