前提・実現したいこと
現在、Pythonを用いた円のRandom Packingに取り組んでいます。
現時点では、指定個数かつ半径が異なる円を重ならないように配置するプログラムまでは書くことはできました。
下記にコードを示します。
Python
1import cvxpy as cvx 2import numpy as np 3import matplotlib.pyplot as plt 4import dccp 5 6n = 40 7r = np.linspace(1,5,n) 8 9c = cvx.Variable((n,2)) 10constr = [] 11for i in range(n-1): 12 for j in range(i+1,n): 13 constr.append(cvx.norm(c[i,:]-c[j,:])>=r[i]+r[j]) 14prob = cvx.Problem(cvx.Minimize(cvx.max(cvx.norm(c, axis=1)+r)), constr) 15# prob = cvx.Problem(cvx.Minimize(cvx.max(cvx.max(cvx.abs(c),axis=1)+r)), constr) 16prob.solve(method = 'dccp', ccp_times = 1) 17 18l = cvx.max(cvx.max(cvx.abs(c),axis=1)+r).value*2 19pi = np.pi 20ratio = pi*cvx.sum(cvx.square(r)).value/cvx.square(l).value 21print("ratio =", ratio) 22print(prob.status)
次の画像はmatplotlibで結果を描画したものです。
この図から以下の情報を抽出したいと考えています。
- 接点の位置
- 2円の接点と中心を通る線の方向ベクトル
なお上記のコードで求めた円は厳密には接していないため、ここでの「接点」は(2円の中心間距離)-(2円の半径の和)<(ある閾値)を満たすものとしたいです。
発生している問題
現在考えた手法としては以下のようなものがあります
- 各円とそれ以外の円の中心を結ぶ直線の方程式を抽出
- 1で抽出した直線の方程式に対して、2円を除くすべての円について交差判定を実施
- 交差しなかった直線のみから方向ベクトルと接点位置を計算
しかしながらこの方法の問題点は計算量がO(n^3)と大きくなってしまうことです。
質問
以上を踏まえまして、下記が質問となります。
- 上記の計算量を減らすアルゴリズムなどは存在しますでしょうか?
- 1.につきまして参考文献などがありましたら、教えていただけますでしょうか?
追記
今回は円の直径が異なるため、閾値よりも小さい半径を持つ円が存在した場合、(2円の中心間距離)-(2円の半径の和)<(ある閾値)のみで判定を行うと、図のような間違った結果が出てきてしまいます。
これを避けるために交差判定が必要と考え、上記の手法に加えております。。
何卒よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/09/14 03:25
2020/09/14 03:50
2020/09/14 03:58
2020/09/14 04:02
2020/09/14 04:18
2020/09/14 04:28 編集
2020/09/14 04:34 編集
2020/09/14 05:06
2021/03/29 01:55