2016-04-01 16 views
2

私が取り組んでいるアプリケーションの一環として、ユーザーが画面上に描画したポリゴンの物理的な領域を特定しようとしています。iOSでポリゴンの物理領域を計算する方法は?

私はここでは詳述を用いる方法の点で、多角形の面積を計算しています:私は物理領域へのポイントでのエリアから取得する方法に引っかかって少し午前しかし、

http://www.mathopenref.com/coordpolygonarea.html

を平方インチのように。私がテストしているデバイスのDPI(iPad Pro、9.7インチ)は264であると信じています。インチでの面積を実際にはポイントエリア(/ dpi * dpi)と同じくらい簡単にする方法はありますか?ちょうどミックスにいくつかのマジックナンバーを投げずに大きなマージンによって正しい結果

次のように私はポイントの面積を計算するために使用していたコードは次のとおりです。

- (double)calculatePointsArea { 
    double localPointsArea = 0; 
    for (int x = 0; x < points.count; x++) { 
     if (x + 1 < points.count) { 
      localPointsArea += (points[x].imagePoint.x * points[x + 1].imagePoint.y) - (points[x].imagePoint.y * points[x + 1].imagePoint.x); 
     } 
     else { 
      localPointsArea += (points[x].imagePoint.x * points[0].imagePoint.y) - (points[x].imagePoint.y * points[0].imagePoint.x); 
     } 
    } 
    localPointsArea = localPointsArea/2; 
    return fabs(localPointsArea); 
} 

私はと遊ぶために使用していたコード

pointsArea = [self calculatePointsArea]; 
long dpi = [TSTDPIManager deviceDPI]; //this is a class to manage the dpi values for various devices. Right now it is set to return 264 for my device, which I believe is correct. 

double physicalAreaUsingPoints = ((pointsArea)/(dpi * dpi)); 
physicalAreaUsingPoints = physicalAreaUsingPoints * (7.2); 7.2 is completely arbitrary, but seems to yield the correct result on my device and the simulator. 

任意のマジックナンバーが送信されます私にはどこかのことを誤算しているという非常に強いシグナルがありますが、それが何であるかを理解するのは難しいです。非常に明白なことがあれば、事前にお詫び申し上げます。私はグーグルでこれを数日間ポンピングしており、私はそれについて多くの進歩を遂げているようには感じません。

答えて

0

推測するのは難しいですが、デバッグしたと仮定します。calculatePointsArea?私はピクセルではなくポイントで操作していると思います。 iPad ProのRetina画面の倍率を取得するには[UIScreen scale]を使用してください。

それ以外のアルゴリズムをデバッグする典型的な方法は、多くの一時変数を使用して、どこにでもそれらを出力することです。次に、私は非常に単純なテストデータを提供し、アルゴリズムのすべてのステップが期待される結果をもたらすことを確認します。したがって、(1,1)--(10,1)--(10,10)--(1,10)の長方形を作成して、81がサイズであることを確認してください。

+1

私はいくつかのテストセットでcalculatePointsAreaを検証しました。私はあなたが提案したものを差し込み、サイズとして81を返します。私はピクセルの代わりにポイントで作業しているというあなたの声明で正しいです、そして、私は自分の問題がポイントから物理的なサイズに移動しようとしていると信じています。 私はスケールを使って演奏しましたが、それでも期待される結果は得られませんでした。正しい数式が(pointsArea * scale)/(dpi^2)になることを示唆していますか? – bojangles

+0

3x3の長方形を描き、2倍に拡大しようとします。あなたが操作しているものがポイントであり、ピクセルを取得したいとします。 'scale'はポイントからピクセルにスケールされます。 **例**:3x6(p^2)ではなく、3x3pの長方形(9p^2)が6x6(36p^2)になります。 これから数式を求めることができます。 –

+1

もう一度ありがとうございます。私は助けに感謝します。どのように見落としたのか分かりません。私は現在、数式(pointsArea * scale^2)/(dpi^2)を使用しており、これはより一貫した結果をもたらすようです。私が得ている結果は、一貫して75-77%ほど短いと思われます。これはアスペクト比と一致しているようで、1.75-1.77を掛けても一貫して正確な結果が得られます。あなたに何か意味があるのですか? – bojangles

関連する問題