例えば、1がAの範囲内にあったとして、最初のループで1は範囲内OKと判断できますが、
続くループのB,C,Dで範囲外と判定されると、最後のループ結果がNG
となり、最終的にNG判定結果が反映されてしまいます。
ひとつでも範囲内が見つかれば、ループを抜けて結果を返せばよいのでは
python
1for point in point_list:
2 retval = None
3 for polygon in polygon_list:
4 retval = cv2.pointPolygonTest(polygon, point, False)
5 if retval >= 0: # 範囲内が見つかった時にループを打ち切る
6 break # 結果が上書きされると、常に最後の結果が反映されます
7 print(point, retval)
一括でという事なので、
組み込み関数のany()とジェネレータ等を組み合わせて使うと、
Trueの値を見つけた時にループを途中で打ち切ることができます。
(内部で行われてるのはループなのですが、
ソースコードの見かけ上for文を使わない => インデントが深くならないのは利点)
polygon_list = [A, B, C, D, E]
に対して、それぞれ範囲内かどうかを判定 map(hasPoint, polygon_list)
範囲内かどうかのリストを得る。
=> [False, True, False, True, False] (※ 仮の結果です
これを any() に渡すと、Trueが一つでもあれば True と判定されます。
ジェネレータを渡すようにすると、最初のTrueが見つかった以降の範囲チェックは
不要なので中断することができます。
ちなみに、filter(hasPoint, polygon_list) とすると
そのポイントを含むポリゴン(上記の仮の結果であれば) [B, D] が得られます。
python
1for point in point_list:
2 hasPoint = lambda polygon: cv2.pointPolygonTest(polygon, point, False) >= 0
3 retval = any(map(hasPoint, polygon_list))
4 print(point, retval)
※ point_list
, polygon_list
は、
それぞれポイントとポリゴンのリストを想定
コードは試してないので、実際のコードに合わせて適宜調整してください。