###はじめに
blenderのテクスチャマップで、模様の並びがランダムで、お互いに重ならないようにする必要があったので、指定した距離よりも近づかないように、ランダムに点を平面に並べるリストを作るスクリプトを書いてみた。
ランダムに点を取って、それと、既存の点の距離を計算して、距離が十分なら新たな点として採用、という仕組みなので、効率は悪い。
並べる模様が、指定した面積からはみ出さないように、変数出力をする際に、yohaku = round(distance/2)、を設定してある。
import random
dot_list = [] #点を入れるリスト。入っているのは、2次元のタプル。
distance = 70 #これ以上離れていれば良い距離。並べるものを円形としたら、その直径より大きな値にする
point_num = 20 #模様の個数
size_x = 1024 #下地の横のサイズ
size_y = 1024 #下地の縦のサイズ
#与えられた既存の点のリストと、新たに作った点に対して、新たな点が、既存の点の一覧と、離れているかの確認。
#近ければ、flagに1を足す。戻り値であるflagが0なら、離れているのでヨシ。メインプログラムで、点をリストに追加。
def dis_check(point_list,new_point):
flag = 0
for i in point_list:
if ((i[0] - new_point[0])**2 + (i[1] - new_point[1])**2) < distance**2:
flag = flag + 1
return flag
#point_numで指定された個数分のxy座標を作って、リストに追加
point_current_num = 0 #何個まで作ったか記録用
yohaku = round(distance/2) #並べるものが平面からはみ出さないよう、ランダム生成する整数の範囲を調整。
while point_current_num < point_num:
new_point = random.randint(yohaku,size_x - yohaku),random.randint(yohaku,size_y - yohaku)
if dis_check(dot_list,new_point) == 0:
dot_list.append(new_point)
point_current_num = point_current_num + 1
##作ったリストを元に図を描いて、散らばり具合を確認するスクリプト。実行フォルダに、texture.jpgを作る
from PIL import Image, ImageDraw
img = Image.new("RGB",(size_x,size_y),(255,255,255)) #下地
draw = ImageDraw.Draw(img)
for i in dot_list:
draw.ellipse((i[0] - yohaku, i[1] - yohaku, i[0] + yohaku, i[1] + yohaku),fill=(0,0,0))
img.save('texture.jpg')
img.show()
##模様を、外部ファイルから読み込む場合には、さきほどのスクリプトを以下のように変える
from PIL import Image
mark = Image.open('mark.jpg') #張り付ける画像。同じディレクトリに置いておく
img = Image.new("RGB",(size_x,size_y),(255,255,255))
for i in dot_list:
img.paste(mark,i)
img.save('texture_mark.jpg')
img