「線の方程式の間」アプローチを使用して自分で試しましたが、次のことを行う必要があります。
2D ヒストグラム カウントを格納する n 行 n 列の行列があります。ポイントを順番に指定し、プログラムにこれらのポイント間のすべてをカウントさせる必要があります。
少なくとも今のところ、私は単純な四角形で満足しています (ただし、四角形は何度でも回転できます)。
Paint.exe で作成したヒストグラムの図から、青色のボックス内でカウントできるようにしたいことがわかります。水平 (右上) の四角形を数えることは問題ではありません (行列の開始/終了ビンとして For ループ内の境界を指定します)。
コード内の境界を定義して、他の (左端の) 青いボックス内でカウントする方法に行き詰まっています。私はこれを行うために (WaveMetrics の) Igor Pro を使用しているため、ほとんどの場合、これは言語に固有のものではありません。
基本的に、これはこれらのグラフで関心のある領域を分析するためのものです。「ポリゴン/フリーフォーム内」タイプのものに付属する画像を分析するツールがありますが、このマトリックスから正確にカウントを取得することはできません (カウントではなく、画像の色に基づいて分析します)。また、「このビンには X 以上ありますか?」に基づいてフィルタリングすることはできません。同じ長方形をベースラインの「ノイズ」マトリックスに適用する必要があるためです。
アイデア?私は、これがどのように機能するかについてのコアコンセプトを得るのに本当に行き詰まっています..
編集: 正しく動作していないように見える私の試みは、上の右の青いボックスと同様に、「ボックス」に入れたときに特に空になりました。歪んだ長方形を必ずしも検証することもできません (実際にそれを数える方法がないため..)
// Find polygon boundaries
s1 = (y2-y1)/(x2-x1)
o1 = s1==inf || s1==-inf ? 0 : y2 - (s1*x2)
s2 = (y3-y2)/(x3-x2)
o2 = s2==inf || s2==-inf ? 0 : y3 - (s2*x3)
s3 = (y4-y3)/(x4-x3)
o3 = s3==inf || s3==-inf ? 0 : y4 - (s3*x4)
s4 = (y1-y4)/(x1-x4)
o4 = s4==inf || s4==-inf ? 0 : y1 - (s4*x1)
// Get highest/lowest points (used in For loop)
maxX = max(max(max(x1, x2), x3), x4)
maxY = max(max(max(y1, y2), y3), y4)
minX = min(min(min(x1, x2), x3), x4)
minY = min(min(min(y1, y2), y3), y4)
For (i=minX; i<=maxX; i+=1) // Iterate over each X bin
For (j=minY; j<=maxY; j+=1) // Iterate over each Y bin
// | BETWEEN LINE 1 AND LINE 3? | | BETWEEN LINE 2 AND LINE 4? |
If ( ( ((s1*i + o1) > j && j > (s3*i + o3)) || ((s1*i + o1) < j && j < (s3*i +o3)) ) && ( ((s2*i + o2) > j && j > (s4*i + o4)) || ((s2*i + o2) < j && j < (s4*i +o4)) ) )
totalCount += matrixRef[i][j] // Add the count of this bin to the total count
EndIf
EndFor // End Y iteration
EndFor // End X iteration