web-dev-qa-db-ja.com

図形の回転を効率的に計算する方法は?

Picture 1Picture 2

バイトのマトリックス(ビットマップのようなマトリックス)で表されるがあります。例Picture 1

目標は、与えられたいくつかの最適な回転角度を見つけることです。図を最適な角度で回転すると、X軸とY軸に平行でを内接する長方形の面積が最小になります。

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

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

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

これは一種のブルートフォースメソッドであり、小さな数字に対しては適切に機能します。ただし、最大1000万点を含む数値を処理する必要があり、アルゴリズムが遅くなります。

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

13
Dusan

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

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

20
Dan Pichelman

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

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

  • 凸包の外側のエッジによって与えられた有限(!)の角度のループ

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

これは、最小の囲み長方形が凸包の外縁の1つに接触する必要があることを示すことができるため機能します。

12
Doc Brown