フリーフォーム ゲートは、事実上、ゲートの作成中にマウスが移動したすべてのポイントに頂点を持つポリゴン ゲートです。ポリゴン ゲートを作成できる場合は、フリーフォーム ゲートを作成できます。十分な頂点があれば。他のゲートタイプの作成方法も尋ねられたので、本当の質問はゲーティングの実行方法だと思います。
ゲーティングを実行するには、指定された領域内にあるイベントを特定する必要があります。長方形の領域が最も扱いやすいです。イベントが長方形の領域にあるかどうかを識別する疑似コードは、次のようになります。
EventInRectRegion (event e, region r)
return (((e[r.xParam] >= r.xMin) && (e[r.xParam] < r.xMax)) &&
((e[r.yParam] >= r.yMin) && (e[r.yParam] < r.yMax)))
イベントが長方形の中にあるかどうかを判断することは、点が幾何学的形状の内側にあるかどうかを判断するために使用されるのと同じタイプのコードであることがわかるはずです。このタイプのコードは、マウス ヒット テストやその他の関連タスクに使用されます。
これを円、多角形、およびその他の形状に拡張するには、同じパスをたどる必要があります。例として、 Point in Polygonなどのアルゴリズムを見てください。円の場合、円を多角形として表現してからそのアルゴリズムを使用するか、代わりに円内の点アルゴリズムを見つけることができます。
これにさらに取り組むと、パフォーマンスが懸念されることがわかると思います。私がリンクした Point in Polygon の記事には、主な関心事が速度とパフォーマンスのトレードオフであるいくつかの異なるアルゴリズムが示されています。このヒット テストをどのように実行したいか、どのようなトレードオフを行いたいかについて、いくつかの決定を行う必要があります。
たとえば、各イベントを正確にテストできます (疑似コードで行ったように)。これは正確ですが、毎回境界を評価する必要があります。別のアルゴリズムは、ビットマップ解像度を選択し、その中の領域をレンダリングすることです。次に、特定のビットマップ ピクセルがオンかオフかをテストすることで、イベントが領域内にあるかどうかをテストできます。これにより、領域レンダリングの計算を 1 回だけ評価できますが、ビットマップ用のメモリとヒット テストの精度が犠牲になります。