16224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala/* 26224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala * Copyright 2012 AndroidPlot.com 36224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala * 46224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala * Licensed under the Apache License, Version 2.0 (the "License"); 56224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala * you may not use this file except in compliance with the License. 66224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala * You may obtain a copy of the License at 76224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala * 86224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala * http://www.apache.org/licenses/LICENSE-2.0 96224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala * 106224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala * Unless required by applicable law or agreed to in writing, software 116224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala * distributed under the License is distributed on an "AS IS" BASIS, 126224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 136224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala * See the License for the specific language governing permissions and 146224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala * limitations under the License. 156224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala */ 166224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala 176224eda509d436a575f801942337da92a6c18767Eino-Ville Talvalapackage com.androidplot.xy; 186224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala 196224eda509d436a575f801942337da92a6c18767Eino-Ville Talvalaimport android.graphics.PointF; 206224eda509d436a575f801942337da92a6c18767Eino-Ville Talvalaimport android.graphics.RectF; 216224eda509d436a575f801942337da92a6c18767Eino-Ville Talvalaimport com.androidplot.LineRegion; 226224eda509d436a575f801942337da92a6c18767Eino-Ville Talvalaimport com.androidplot.util.ValPixConverter; 236224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala 246224eda509d436a575f801942337da92a6c18767Eino-Ville Talvalaimport java.util.ArrayList; 256224eda509d436a575f801942337da92a6c18767Eino-Ville Talvalaimport java.util.List; 266224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala 276224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala/** 286224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala * RectRegion is just a rectangle with additional methods for determining 296224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala * intersections with other RectRegion instances. 306224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala */ 316224eda509d436a575f801942337da92a6c18767Eino-Ville Talvalapublic class RectRegion { 326224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala 336224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala LineRegion xLineRegion; 346224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala LineRegion yLineRegion; 356224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala private String label; 366224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala 376224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala /** 386224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala * 396224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala * @param minX 406224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala * @param maxX 416224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala * @param minY 426224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala * @param maxY 436224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala */ 446224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala public RectRegion(Number minX, Number maxX, Number minY, Number maxY, String label) { 456224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala xLineRegion = new LineRegion(minX, maxX); 466224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala yLineRegion = new LineRegion(minY, maxY); 476224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala this.setLabel(label); 486224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala } 496224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala 506224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala @SuppressWarnings("SameParameterValue") 516224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala public RectRegion(Number minX, Number maxX, Number minY, Number maxY) { 526224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala this(minX, maxX, minY, maxY, null); 536224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala } 546224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala 556224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala public boolean containsPoint(PointF point) { 566224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala throw new UnsupportedOperationException("Not yet implemented."); 576224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala } 586224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala 596224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala public boolean containsValue(Number x, Number y) { 606224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala throw new UnsupportedOperationException("Not yet implemented."); 616224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala } 626224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala 636224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala public boolean containsDomainValue(Number value) { 646224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala //return RectRegion.isBetween(value, minX, maxX); 656224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala return xLineRegion.contains(value); 666224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala } 676224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala 686224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala public boolean containsRangeValue(Number value) { 696224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala //return RectRegion.isBetween(value, minY, maxY); 706224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala return yLineRegion.contains(value); 716224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala } 726224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala 736224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala public boolean intersects(RectRegion region) { 746224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala return intersects(region.getMinX(), region.getMaxX(), region.getMinY(), region.getMaxY()); 756224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala } 766224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala 776224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala 786224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala /** 796224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala * Tests whether this region intersects the region defined by params. Use 806224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala * null to represent infinity. Negative and positive infinity is implied by 816224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala * the boundary edge, ie. a maxX of null equals positive infinity while a 826224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala * minX of null equals negative infinity. 836224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala * @param minX 846224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala * @param maxX 856224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala * @param minY 866224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala * @param maxY 876224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala * @return 886224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala */ 896224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala public boolean intersects(Number minX, Number maxX, Number minY, Number maxY) { 906224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala return xLineRegion.intersects(minX, maxX) && yLineRegion.intersects(minY, maxY); 916224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala } 926224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala 936224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala public boolean intersects(RectF region, Number visMinX, Number visMaxX, Number visMinY, Number visMaxY) { 946224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala 956224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala RectF thisRegion = getRectF(region, visMinX.doubleValue(), visMaxX.doubleValue(), 966224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala visMinY.doubleValue(), visMaxY.doubleValue()); 976224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala return RectF.intersects(thisRegion, region); 986224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala } 996224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala 1006224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala public RectF getRectF(RectF plotRect, Number visMinX, Number visMaxX, Number visMinY, Number visMaxY) { 1016224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala PointF topLeftPoint = ValPixConverter.valToPix( 1026224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala xLineRegion.getMinVal().doubleValue() != Double.NEGATIVE_INFINITY ? xLineRegion.getMinVal() : visMinX, 1036224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala yLineRegion.getMaxVal().doubleValue() != Double.POSITIVE_INFINITY ? yLineRegion.getMaxVal() : visMaxY, 1046224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala plotRect, 1056224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala visMinX, 1066224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala visMaxX, 1076224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala visMinY, 1086224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala visMaxY); 1096224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala PointF bottomRightPoint = ValPixConverter.valToPix( 1106224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala xLineRegion.getMaxVal().doubleValue() != Double.POSITIVE_INFINITY ? xLineRegion.getMaxVal() : visMaxX, 1116224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala yLineRegion.getMinVal().doubleValue() != Double.NEGATIVE_INFINITY ? yLineRegion.getMinVal() : visMinY, 1126224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala plotRect, 1136224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala visMinX, 1146224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala visMaxX, 1156224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala visMinY, 1166224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala visMaxY); 1176224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala // TODO: figure out why the y-values are inverted 1186224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala return new RectF(topLeftPoint.x, topLeftPoint.y, bottomRightPoint.x, bottomRightPoint.y); 1196224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala } 1206224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala 1216224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala /** 1226224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala * Returns a list of XYRegions that either completely or partially intersect the area 1236224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala * defined by params. A null value for any parameter represents infinity / no boundary. 1246224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala * @param regions The list of regions to search through 1256224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala * @param minX 1266224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala * @param maxX 1276224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala * @param minY 1286224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala * @param maxY 1296224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala * @return 1306224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala */ 1316224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala public static List<RectRegion> regionsWithin(List<RectRegion> regions, Number minX, Number maxX, Number minY, Number maxY) { 1326224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala ArrayList<RectRegion> intersectingRegions = new ArrayList<RectRegion>(); 1336224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala for(RectRegion r : regions) { 1346224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala if(r.intersects(minX, maxX, minY, maxY)) { 1356224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala intersectingRegions.add(r); 1366224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala } 1376224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala } 1386224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala return intersectingRegions; 1396224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala } 1406224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala 1416224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala 1426224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala public Number getMinX() { 1436224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala return xLineRegion.getMinVal(); 1446224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala } 1456224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala 1466224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala public void setMinX(double minX) { 1476224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala xLineRegion.setMinVal(minX); 1486224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala } 1496224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala 1506224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala public Number getMaxX() { 1516224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala return xLineRegion.getMaxVal(); 1526224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala } 1536224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala 1546224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala public void setMaxX(Number maxX) { 1556224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala xLineRegion.setMaxVal(maxX); 1566224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala } 1576224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala 1586224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala public Number getMinY() { 1596224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala return yLineRegion.getMinVal(); 1606224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala } 1616224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala 1626224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala public void setMinY(Number minY) { 1636224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala yLineRegion.setMinVal(minY); 1646224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala } 1656224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala 1666224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala public Number getMaxY() { 1676224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala return yLineRegion.getMaxVal(); 1686224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala } 1696224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala 1706224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala public void setMaxY(Number maxY) { 1716224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala yLineRegion.setMaxVal(maxY); 1726224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala } 1736224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala 1746224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala public String getLabel() { 1756224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala return label; 1766224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala } 1776224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala 1786224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala public void setLabel(String label) { 1796224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala this.label = label; 1806224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala } 1816224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala} 182