前提
矩形模様の最短手順での塗りつぶし
矩形模様の最短手順での塗りつぶし。その2
の続きです。
「スキャンライン法」「最小矩形分割問題」「連結成分ラベリング」以外での解決方法を探しています。
問題
二次元の矩形領域を塗りつぶして、色の模様を描きます。
矩形領域の塗りつぶしという操作では、始点(xs,ys)と終点(xe,ye)と色の名前(color)を指定することで、その矩形範囲を塗りつぶします。
なお、領域上の同じ位置に複数回の塗りつぶしが行われると、後で実行した色で塗りつぶされます。
実現したいこと
このとき、任意で指定された模様を描くために、できるだけ少ない回数で塗りつぶすための操作データ(始点、終点、色)のリストを求めたい。
回答してほしいこと
- 上記を実現するために利用できるアルゴリズム、もしそれに名前があればそのアルゴリズムの名称
- そのアルゴリズムの概要の説明
- そのアルゴリズムを利用して問題をとく、単純な例での具体的な手順
- 具体的に実行可能なPythonコード
ただし、以下の手法以外を提示ください。
- 最小矩形分割問題
- スキャンライン法 (Scanline Algorithm)
- 連結成分ラベリング (Connected Component Labeling)
調べたこと・考えたこと
ChatGPTにたずねたところ「グラフ理論に基づくアプローチ」が利用できるかもしれないと提案されましたが、詳細は確認していません。
また、塗りつぶしは後の操作結果で上書き(重ね合わされる)ことから、レイヤー(層)を意識した手法が必要だと思われます。
たとえば3次元上で複数の矩形の板(ポリゴン)を水平面に層状に重ね合わせ、それを真上から見た場合を考えます。
任意の指定された模様を最小の板の数で実現する問題と等価だと思われます。
模様の具体例
Python
1pat = [['R','G','G','R'], 2 ['R','G','G','R']]
幅4x高さ2の領域に上の模様を描きたい場合は、左上を原点とすると
Python
1instructions = [((0,0),(0,1),'R'), # 左端の赤い矩形 2 ((1,0),(2,1),'G'), # 中央の緑の矩形 3 ((3,0),(3,1),'R')] # 右端の赤い矩形
という3回の操作で描けますが
Python
1instructions = [((0,0),(3,1),'R'), # 全体を赤い矩形で塗りつぶし 2 ((1,0),(2,1),'G')] # 中央に緑の矩形で塗りつぶし
という、より少ない2回の操作で描けます。
問題の制限
指定される色の模様の全体領域サイズは幅と高さともに1024以下。色の種類の数は256色以下です。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2023/06/22 08:59