rendered paste body public void gatherNewPoints(int points)
throws InterruptedException
{
int tolerances[][] = getToleraces();
boolean filterThoseNearBy = true;
long start = System.currentTimeMillis();
short colorMap[][][] = theScript.getColorArray2d();
int counts[][][] = new int[theNumberOfHorizontalSearchZones][theNumberOfVerticalSearchZones][theRGBs.length];
int totalColorCounts[] = new int[theRGBs.length];
for(int x = 0; x < theNumberOfHorizontalSearchZones; x++)
{
for(int y = 0; y < theNumberOfVerticalSearchZones; y++)
{
int xS = bounds.x + x * (int)zoneDx;
int yS = bounds.y + y * (int)zoneDy;
for(int k = 0; k < theRGBs.length; k++)
{
int count = StaticColorMethods.numRGBs(colorMap, theRGBs[k], xS, yS, xS + (int)zoneDx, yS + (int)zoneDy, tolerances[k][0], tolerances[k][1], tolerances[k][2]);
counts[x][y][k] = count;
totalColorCounts[k] += count;
}
}
}
float actualZones[][] = new float[theNumberOfHorizontalSearchZones - 1][theNumberOfVerticalSearchZones - 1];
float rgbWeight = 1.0F / (float)theRGBs.length;
for(int x = 0; x < theNumberOfHorizontalSearchZones - 1; x++)
{
for(int y = 0; y < theNumberOfVerticalSearchZones - 1; y++)
{
for(int k = 0; k < theRGBs.length; k++)
if(totalColorCounts[k] > 0)
{
int colorCount = 0;
colorCount += counts[x][y][k];
colorCount += counts[x + 1][y][k];
colorCount += counts[x][y + 1][k];
colorCount += counts[x + 1][y + 1][k];
if(colorCount >= minPixleCountInBox)
actualZones[x][y] += (rgbWeight * (float)colorCount) / (float)totalColorCounts[k];
}
}
}
boolean selected[][] = new boolean[theNumberOfHorizontalSearchZones - 1][theNumberOfVerticalSearchZones - 1];
XY result[] = new XY[points];
matchesAtAPoint = new int[points];
hasPointBeenCompleted = new boolean[points];
for(int i = 0; i < points; i++)
{
int winnerX = -1;
int winnerY = -1;
double winner = 0.0D;
for(int x = 0; x < theNumberOfHorizontalSearchZones - 1; x++)
{
for(int y = 0; y < theNumberOfVerticalSearchZones - 1; y++)
if(!selected[x][y] && (double)actualZones[x][y] > winner)
{
winnerX = x;
winnerY = y;
winner = actualZones[x][y];
}
}
if(winnerX == -1 || winnerY == -1 || winner == 0.0D)
{
XY newResult[] = new XY[i];
System.arraycopy(result, 0, newResult, 0, i);
result = newResult;
break;
}
selected[winnerX][winnerY] = true;
if(filterThoseNearBy)
{
boolean innerXinRange = winnerX - 1 != -1;
boolean outerXinRange = winnerX + 1 != theNumberOfHorizontalSearchZones - 1;
boolean outerYinRange = winnerY + 1 != theNumberOfVerticalSearchZones - 1;
boolean innerYinRange = winnerY - 1 != -1;
if(outerXinRange)
selected[winnerX + 1][winnerY] = true;
if(innerXinRange)
selected[winnerX - 1][winnerY] = true;
if(outerYinRange)
selected[winnerX][winnerY + 1] = true;
if(innerYinRange)
selected[winnerX][winnerY - 1] = true;
}
int minX = bounds.x + (int)(zoneDx * (float)winnerX);
int minY = bounds.y + (int)(zoneDy * (float)winnerY);
int maxX = bounds.x + (int)(zoneDx * (float)(winnerX + 2));
int maxY = bounds.y + (int)(zoneDy * (float)(winnerY + 2));
int interval = 6;
int smallerWinnerX = -1;
int smallerWinnerY = -1;
int smallerWinnerCount = -1;
for(int x = minX; x < maxX; x += 6)
{
for(int y = minY; y < maxY; y += 6)
{
int count = 0;
for(int k = 0; k < theRGBs.length; k++)
count += StaticColorMethods.numRGBs(colorMap, theRGBs[k], x, y, x + 6, y + 6, tolerances[k][0], tolerances[k][1], tolerances[k][2]);
if(count > smallerWinnerCount)
{
smallerWinnerX = x + 3;
smallerWinnerY = y + 3;
smallerWinnerCount = count;
}
}
}
if(paintSearchZones)
theScript.paintRectangle(new Rectangle(minX, minY, maxX - minX, maxY - minY), new Color(0, 0, 0, 63), 3000);
result[i] = new XY(smallerWinnerX, smallerWinnerY);
matchesAtAPoint[i] = smallerWinnerCount;
}
thePoints = result;
if(paintSearchZones)
paintPoints(4000, Color.red, 1);
theScript.debug((new StringBuilder("findRGBsCluster() took")).append(System.currentTimeMillis() - start).toString());
}