public static final XY findDTM(short[][][] colorMap, DTM dtms[], double theata, Rectangle bounds) { if (dtms.length == 1) { int size = dtms[0].areaSize; int iW = colorMap.length; int iL = colorMap[0].length; // search zone int minX = bounds.x + size; int maxX = minX + bounds.width - iW + 1 - size; int minY = bounds.y + size; int maxY = minY + bounds.height - iL + 1 - size; for (int x = minX; x < maxX; x++) { for (int y = minY; y < maxY; y++) { if (isDTMAt(colorMap, dtms[0], x, y)) { return new XY(x, y); } } } } else { DTM parent = null; for (DTM dtm : dtms) { if (dtm.parent) { parent = dtm; break; } } if (parent != null) { int x0 = parent.xy.x - parent.areaSize; int x1 = parent.xy.x + parent.areaSize; int y0 = parent.xy.y - parent.areaSize; int y1 = parent.xy.y + parent.areaSize; for (DTM dtm : dtms) { int xn0 = dtm.xy.x - dtm.areaSize; int xn1 = dtm.xy.x + dtm.areaSize; int yn0 = dtm.xy.y - dtm.areaSize; int yn1 = dtm.xy.y + dtm.areaSize; if (xn0 < x0) { x0 = xn0; } if (xn1 < x1) { x1 = xn1; } if (yn0 < y0) { y0 = yn0; } if (yn1 < y1) { y1 = yn1; } } int minX = bounds.x; int maxX = minX + bounds.width - (x1 - x0); int minY = bounds.y; int maxY = minY + bounds.height - (y1 - y0); int centerX = (maxX - minX) / 2; int centerY = (maxY - minY) / 2; for (int x = minX; x < maxX; x++) { for (int y = minY; y < maxY; y++) { boolean valid = true; for (DTM dtm : dtms) { int relX = dtm.xy.x - x0; int relY = dtm.xy.y - y0; XY rotated = rotate( new XY(x - centerX, y - centerY), theata); if (valid = isDTMAt(colorMap, dtm, rotated.x + relX, rotated.y + relY)) { break; } } if (valid) { return new XY(x, y); } } } } } return null; } /* * Searchs for a dtm in the bounds. The entire dtm has to be in the bounds * just for your info */ public static final XY findDTM(short[][][] colorMap, DTM dtms[], Rectangle bounds) { if (dtms.length == 1) { int size = dtms[0].areaSize; int iW = colorMap.length; int iL = colorMap[0].length; // search zone int minX = bounds.x + size; int maxX = minX + bounds.width - iW + 1 - size; int minY = bounds.y + size; int maxY = minY + bounds.height - iL + 1 - size; for (int x = minX; x < maxX; x++) { for (int y = minY; y < maxY; y++) { if (isDTMAt(colorMap, dtms[0], x, y)) { return new XY(x, y); } } } } else { DTM parent = null; for (DTM dtm : dtms) { if (dtm.parent) { parent = dtm; break; } } if (parent != null) { int x0 = parent.xy.x - parent.areaSize; int x1 = parent.xy.x + parent.areaSize; int y0 = parent.xy.y - parent.areaSize; int y1 = parent.xy.y + parent.areaSize; for (DTM dtm : dtms) { int xn0 = dtm.xy.x - dtm.areaSize; int xn1 = dtm.xy.x + dtm.areaSize; int yn0 = dtm.xy.y - dtm.areaSize; int yn1 = dtm.xy.y + dtm.areaSize; if (xn0 < x0) { x0 = xn0; } if (xn1 < x1) { x1 = xn1; } if (yn0 < y0) { y0 = yn0; } if (yn1 < y1) { y1 = yn1; } } int minX = bounds.x; int maxX = minX + bounds.width - (x1 - x0); int minY = bounds.y; int maxY = minY + bounds.height - (y1 - y0); for (int x = minX; x < maxX; x++) { for (int y = minY; y < maxY; y++) { boolean valid = true; for (DTM dtm : dtms) { int relX = dtm.xy.x - x0; int relY = dtm.xy.y - y0; if (valid = isDTMAt(colorMap, dtm, x + relX, y + relY)) { break; } } if (valid) { return new XY(x, y); } } } } } return null; }