我自己尝试过使用“直线方程之间”的方法,但我需要执行以下操作:
我有一个 n x n 矩阵,它存储 2D 直方图计数。我需要能够按顺序指定点,并让程序计算这些点之间的所有内容。
至少现在,我对一个简单的矩形最满意(但是,矩形可以旋转任意度数)。
从我的 Paint.exe 的直方图图片中,您可以看到我希望能够在蓝色框中进行计数。计算水平(右上角)矩形不是问题(将 For 循环中的边界指定为矩阵的开始/结束 bin)。
我被困在如何定义代码中的边界以在另一个(最左边的)蓝色框中进行计数。我正在使用 Igor Pro(来自 WaveMetrics)来执行此操作,因此在大多数情况下,这不是特定于语言的。
基本上,这是用于分析这些图表中感兴趣的区域。有一些工具可以分析带有“多边形/自由形式”类型的东西的图像,但它们无法准确地从该矩阵中获取计数(它们基于图像颜色而不是计数进行分析)。此外,我无法根据“此垃圾箱中是否有超过 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