2

2つの省略記号のオーバーラップ領域を計算するアルゴリズムの実装をテストしています。

テストの目的は、楕円の交点(存在する場合)が正しく計算されているかどうかを視覚的に確認することです。そうでない場合、計算された面積は正しくありません。

編集:私の実装の出力は、交点を持つファイルです。楕円と交点とsavefigそれらをプロットします。視覚的に結果を確認し、交点が正しいかどうかを確信します。

これが1つの例です:

ここに画像の説明を入力してください

私の問題は、この視覚的な方法がテストの数の増加(たとえば1000ケース)に比例しないことです。

このテストを自動化する方法はありますか?

4

3 に答える 3

1

だから私は少し研究をしました、そしてこれは私がお勧めするものです。できることは、別のPythonライブラリを使用して、2つの楕円の交点を計算し、その2つを実装が返すものと比較することです。テストを失敗させ、どちらが間違っていたかを調査できない場合は、2つは同一である必要があります。sympyライブラリは、サポートされている多数のエンティティEllipse、Circle、Polygon、RegularPolygon、Triangle間の交点を計算できます実際のテストを実行するには、標準ライブラリのユニットテストを使用することをお勧めします。次に、数千のランダムな楕円を作成し、それぞれの交点をチェックするテスト実行を実行できます。

交差点の計算を含むこのサンプルコードは、ドキュメントで確認できます。彼らのドキュメントにはこの驚くべき機能があり、例の横にあるSymPy Liveリンクのコードブロックを実行すると、ブラウザーでPythonセッションが開き、GoogleAppEngineサーバーでその例が実行されます。これにより、ライブラリをマシンにインストールしなくても、ライブラリをテストドライブに使用できます。彼らのウェブベースのインタラクティブなPythonシェルをチェックしてください。それは本当に素晴らしいです。

于 2012-11-25T14:38:14.987 に答える
1

アプローチ

私はまったく新しいアプローチをとったので、これを別の答えとして投稿することにしました。PythonImagingLibraryを使用しました赤と緑の色で異なる画像に2つの楕円を描画します。次に、2つの画像をブレンドし、画像内の黄色のピクセル数を数えました。黄色は緑と赤の合成であり、交差点の色になります。最初の楕円は赤、2番目の楕円は緑、交差点は黄色になります。デモンストレーションの目的で、2番目の楕円を円にし、最初の楕円に完全に含まれるようにして、その領域がそのサイズの円の領域であることを示すことができるようにしました。ピクセルがカウントされるため、正確な答えは得られませんが、この例では、解像度が500x500の場合、ピクセルカウント領域は正しい値から0.42%でした。もちろん、解像度を上げると、より高い精度が期待できますが、テストの目的では、+ /-1%の許容誤差を受け入れます。

パフォーマンス

関数を1,000回呼び出すテスト実行を実行したところ、13.4秒で終了しました。したがって、3つの画像を作成し、ピクセルカウントを実行するには、約13ミリ秒かかります。これは、目前のタスクのパフォーマンスに悪影響を与えるものではありません。

コード

from PIL import Image, ImageDraw
from math import pi

RED, GREEN, YELLOW = (255, 0, 0), (0, 255, 0), (127, 127, 0)
SIZE = (500, 500)

def overlap(ellipse1, ellipse2):
    im1 = Image.new("RGB", SIZE)
    ImageDraw.Draw(im1).ellipse(ellipse1, fill=RED)
    im2 = Image.new("RGB", SIZE)
    ImageDraw.Draw(im2).ellipse(ellipse2, fill=GREEN)
    im3 = Image.blend(im1, im2, 0.5)
    im3.show()
    im3.save('test.png', "png")
    return [count for count, color in im3.getcolors() if color == YELLOW][0]

area1 = overlap((0, 50, 500, 450), (50, 50, 450, 450))
area2 = pi * (200**2)
print "overlap calc:" , area1
print "exact area:  " , area2
print "percent diff:" , ((area1 - area2)/area2)*100

出力

overlap calc: 126196
exact area:   125663.706144
percent diff: 0.423585992124

画像

交差する楕円

于 2012-11-27T16:24:06.880 に答える
0

編集:申し訳ありませんが、私は質問を誤解したと思います。これを行うには、2つの楕円関数間の交差点を見つける必要があります。または、sympyhttp ://docs.sympy.org/dev/modules/geometry.htmlを使用できます。

于 2012-11-25T12:47:10.987 に答える