アプローチ
私はまったく新しいアプローチをとったので、これを別の答えとして投稿することにしました。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
画像