我尝试使用“在线的方程式之间”方法,但我需要执行以下操作:
我有一个n乘n的矩阵,用于存储2D直方图计数。我需要能够按顺序指定点,并让程序计算这些点之间的所有内容。
至少现在,我最满意的是一个简单的矩形(但是,矩形可以旋转任意度数)。
从我的Paint.exe的直方图图片中,你可以看到我希望能够在蓝框内计算。计算水平(右上角)矩形不是问题(将For循环中的边界指定为矩阵的起始/结束区)。
我坚持如何在代码中定义边界以在另一个(最左边)蓝色框内计数。我正在使用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
答案 0 :(得分:2)
Igor有一个比当前解决方案更强大的工具
它将解释如何定义图形中任何形状的多边形并获取内部点的蒙版。然后你可以运行你想要的任何代码。
您也可以在代码中制作/更改多边形。
答案 1 :(得分:0)
您可以使用与水平矩形相同的方式计算对角线矩形中的值,您将只有一个更复杂的循环来确定边界的位置。您可以通过循环包含整个对角线矩形的水平矩形来实现此目的,并且只有在它们落入对角线内部时才计算值。
如果你知道构成对角矩形角的点,那么你可以得到每个边界的方程(斜率截距方程)。从那里你可以看到每个边界的哪一侧有点。如果它们位于与矩形内部相对应的边上,那么如果它们不包含它们,那么它们就不包含它们。
您将不得不为您正在处理的每个点找到边框的X和Y点。如果你只是检查左下角的边框,你会有类似的东西:
for(each point in the matrix){
if(point.x > border X value @ height Y && point.y > border Y value @ column X)
include this point
else
don't include it
}
如果你有边界的方程并且你知道你在分析什么点,你可以使用已知的X值(从点开始)来获得边界的Y值(你在那个列中的高度是多少)查看)和已知的Y值(再次,从您正在分析的点)获取边界的X值(边界中的点距离点的高度)。
对于完整的条件列表,您应该注意: