• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2012 AndroidPlot.com
3  *
4  *    Licensed under the Apache License, Version 2.0 (the "License");
5  *    you may not use this file except in compliance with the License.
6  *    You may obtain a copy of the License at
7  *
8  *        http://www.apache.org/licenses/LICENSE-2.0
9  *
10  *    Unless required by applicable law or agreed to in writing, software
11  *    distributed under the License is distributed on an "AS IS" BASIS,
12  *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  *    See the License for the specific language governing permissions and
14  *    limitations under the License.
15  */
16 
17 package com.androidplot.xy;
18 
19 import android.graphics.PointF;
20 import android.graphics.RectF;
21 import com.androidplot.LineRegion;
22 import com.androidplot.util.ValPixConverter;
23 
24 import java.util.ArrayList;
25 import java.util.List;
26 
27 /**
28  * RectRegion is just a rectangle with additional methods for determining
29  * intersections with other RectRegion instances.
30  */
31 public class RectRegion {
32 
33     LineRegion xLineRegion;
34     LineRegion yLineRegion;
35     private String label;
36 
37     /**
38      *
39      * @param minX
40      * @param maxX
41      * @param minY
42      * @param maxY
43      */
RectRegion(Number minX, Number maxX, Number minY, Number maxY, String label)44     public RectRegion(Number minX, Number maxX, Number minY, Number maxY, String label) {
45         xLineRegion = new LineRegion(minX, maxX);
46         yLineRegion = new LineRegion(minY, maxY);
47         this.setLabel(label);
48     }
49 
50     @SuppressWarnings("SameParameterValue")
RectRegion(Number minX, Number maxX, Number minY, Number maxY)51     public RectRegion(Number minX, Number maxX, Number minY, Number maxY) {
52         this(minX, maxX, minY, maxY, null);
53     }
54 
containsPoint(PointF point)55     public boolean containsPoint(PointF point) {
56         throw new UnsupportedOperationException("Not yet implemented.");
57     }
58 
containsValue(Number x, Number y)59     public boolean containsValue(Number x, Number y) {
60         throw new UnsupportedOperationException("Not yet implemented.");
61     }
62 
containsDomainValue(Number value)63     public boolean containsDomainValue(Number value) {
64         //return RectRegion.isBetween(value, minX, maxX);
65         return xLineRegion.contains(value);
66     }
67 
containsRangeValue(Number value)68     public boolean containsRangeValue(Number value) {
69         //return RectRegion.isBetween(value, minY, maxY);
70         return yLineRegion.contains(value);
71     }
72 
intersects(RectRegion region)73     public boolean intersects(RectRegion region) {
74         return intersects(region.getMinX(), region.getMaxX(), region.getMinY(), region.getMaxY());
75     }
76 
77 
78     /**
79      * Tests whether this region intersects the region defined by params.  Use
80      * null to represent infinity.  Negative and positive infinity is implied by
81      * the boundary edge, ie. a maxX of null equals positive infinity while a
82      * minX of null equals negative infinity.
83      * @param minX
84      * @param maxX
85      * @param minY
86      * @param maxY
87      * @return
88      */
intersects(Number minX, Number maxX, Number minY, Number maxY)89     public boolean intersects(Number minX, Number maxX, Number minY, Number maxY) {
90         return xLineRegion.intersects(minX, maxX) && yLineRegion.intersects(minY, maxY);
91     }
92 
intersects(RectF region, Number visMinX, Number visMaxX, Number visMinY, Number visMaxY)93     public boolean intersects(RectF region, Number visMinX, Number visMaxX, Number visMinY, Number visMaxY) {
94 
95         RectF thisRegion = getRectF(region, visMinX.doubleValue(), visMaxX.doubleValue(),
96                 visMinY.doubleValue(), visMaxY.doubleValue());
97         return RectF.intersects(thisRegion, region);
98     }
99 
getRectF(RectF plotRect, Number visMinX, Number visMaxX, Number visMinY, Number visMaxY)100     public RectF getRectF(RectF plotRect, Number visMinX, Number visMaxX, Number visMinY, Number visMaxY) {
101         PointF topLeftPoint = ValPixConverter.valToPix(
102                 xLineRegion.getMinVal().doubleValue() != Double.NEGATIVE_INFINITY ? xLineRegion.getMinVal() : visMinX,
103                 yLineRegion.getMaxVal().doubleValue() != Double.POSITIVE_INFINITY ? yLineRegion.getMaxVal() : visMaxY,
104                 plotRect,
105                 visMinX,
106                 visMaxX,
107                 visMinY,
108                 visMaxY);
109         PointF bottomRightPoint = ValPixConverter.valToPix(
110                 xLineRegion.getMaxVal().doubleValue() != Double.POSITIVE_INFINITY ? xLineRegion.getMaxVal() : visMaxX,
111                 yLineRegion.getMinVal().doubleValue() != Double.NEGATIVE_INFINITY ? yLineRegion.getMinVal() : visMinY,
112                 plotRect,
113                 visMinX,
114                 visMaxX,
115                 visMinY,
116                 visMaxY);
117         // TODO: figure out why the y-values are inverted
118         return new RectF(topLeftPoint.x, topLeftPoint.y, bottomRightPoint.x, bottomRightPoint.y);
119     }
120 
121     /**
122      * Returns a list of XYRegions that either completely or partially intersect the area
123      * defined by params. A null value for any parameter represents infinity / no boundary.
124      * @param regions The list of regions to search through
125      * @param minX
126      * @param maxX
127      * @param minY
128      * @param maxY
129      * @return
130      */
regionsWithin(List<RectRegion> regions, Number minX, Number maxX, Number minY, Number maxY)131     public static List<RectRegion> regionsWithin(List<RectRegion> regions, Number minX, Number maxX, Number minY, Number maxY) {
132         ArrayList<RectRegion> intersectingRegions = new ArrayList<RectRegion>();
133         for(RectRegion r : regions) {
134             if(r.intersects(minX, maxX, minY, maxY)) {
135                 intersectingRegions.add(r);
136             }
137         }
138         return intersectingRegions;
139     }
140 
141 
getMinX()142     public Number getMinX() {
143         return xLineRegion.getMinVal();
144     }
145 
setMinX(double minX)146     public void setMinX(double minX) {
147         xLineRegion.setMinVal(minX);
148     }
149 
getMaxX()150     public Number getMaxX() {
151         return xLineRegion.getMaxVal();
152     }
153 
setMaxX(Number maxX)154     public void setMaxX(Number maxX) {
155         xLineRegion.setMaxVal(maxX);
156     }
157 
getMinY()158     public Number getMinY() {
159         return yLineRegion.getMinVal();
160     }
161 
setMinY(Number minY)162     public void setMinY(Number minY) {
163         yLineRegion.setMinVal(minY);
164     }
165 
getMaxY()166     public Number getMaxY() {
167         return yLineRegion.getMaxVal();
168     }
169 
setMaxY(Number maxY)170     public void setMaxY(Number maxY) {
171         yLineRegion.setMaxVal(maxY);
172     }
173 
getLabel()174     public String getLabel() {
175         return label;
176     }
177 
setLabel(String label)178     public void setLabel(String label) {
179         this.label = label;
180     }
181 }
182