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