All pastes #400812 Raw Edit

Miscellany

public java v1 · immutable
·published 2007-03-18 22:32 UTC
rendered paste body
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;	}