フィギュアの回転を効率的に計算する方法は?


13

写真1 写真2

バイトの行列(ビットマップのような行列)で表されるFigureがあります。例のはに示されていPicture 1ます。

目標は、特定の図の最適な回転角度を見つけることです。Figureが最適な角度だけ回転すると、X軸とY軸に平行でFigureに内接する長方形の面積が最小になります。

図に内接する長方形は、写真上で薄い灰色で示されています。ではPicture 2、あなたは図の理想的な回転が時計回りに約30度であることがわかります。

今、私はこの角度を見つける方法をアルゴリズムを知っていますが、それは非常に効率が悪いようです。こんなふうになります:

  1. 0から45までの角度でループします。
  2. 現在の角度について、すべての図形ポイントについて、新しい、回転した、位置を計算します
  3. 数字(最小および最大x、y)を含む長方形の境界を見つけ、これまでで最良の一致である場合は登録します
  4. 次の角度

これは一種のブルートフォース方式であり、小さな人物に対してはうまく機能し、適度に高速です。ただし、最大1,000万ポイントを含む数値を使用する必要があり、アルゴリズムが遅くなります。

この問題に適したアルゴリズムは何でしょうか?

回答:


20

線形時間回転キャリパーアルゴリズムを使用して、任意に配置された最小境界ボックスを見つけることができるようです。

境界ボックスを作成したら、片方の側面の勾配を計算して回転角度を決定するだけです。


これは素晴らしい解決策であり、非常に良いものです。
通知14

素晴らしい、私はすでにxとyでポイントをソートしているので、このen.wikibooks.org/wiki/Algorithm_Implementation/Geometry/…で凸包を見つけ、既存のアルゴリズムをハルポイントで使用できます。
ドゥサン14

12

アプローチの最初のステップには欠陥があります-0から45の間の実際の値は無限にあるため、「それらをループする」ことは意味がありません。ただし、アルゴリズムは修復できます。

  • 多角形の凸包を見つける

  • 凸包の外縁によって与えられる角度の有限(!)数でループする

  • これらの角度を使用して、手順2〜4を適用します。

これは、最小の外接矩形が凸包の外縁の1つに接触する必要があることが示されるため、機能します。


はい、それはまさに私がやろうとしていることです、すでにダンの答えのウィットヘルプを見つけました。ありがとうございました。
ドゥサン14

@Dusan:他の答えが同じアプローチを説明しているのか確信が持てないので、解決策をより簡単な方法で説明しようとしました。ここで説明を見つけました:cgm.cs.mcgill.ca/~orm/maer.html
Doc Brown

はい、あなたは正しいです、あなたのアプローチははるかに具体的でシンプルで明確ですが、私はダンの答えに示されたヒントによって同じアプローチを自分で結論付けましたので、私は彼に受け入れました。あなたの答えがより多くの賛成票を獲得することを願っています。何恨みっこない。乾杯!
ドゥサン14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.