blob: bee4a4f0d51c30685ccecc2e4abbfce5d1e7fbee [file] [log] [blame]
/*
* Copyright 2012 AndroidPlot.com
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.androidplot.xy;
import android.graphics.PointF;
import android.graphics.RectF;
import com.androidplot.LineRegion;
import com.androidplot.util.ValPixConverter;
import java.util.ArrayList;
import java.util.List;
/**
* RectRegion is just a rectangle with additional methods for determining
* intersections with other RectRegion instances.
*/
public class RectRegion {
LineRegion xLineRegion;
LineRegion yLineRegion;
private String label;
/**
*
* @param minX
* @param maxX
* @param minY
* @param maxY
*/
public RectRegion(Number minX, Number maxX, Number minY, Number maxY, String label) {
xLineRegion = new LineRegion(minX, maxX);
yLineRegion = new LineRegion(minY, maxY);
this.setLabel(label);
}
@SuppressWarnings("SameParameterValue")
public RectRegion(Number minX, Number maxX, Number minY, Number maxY) {
this(minX, maxX, minY, maxY, null);
}
public boolean containsPoint(PointF point) {
throw new UnsupportedOperationException("Not yet implemented.");
}
public boolean containsValue(Number x, Number y) {
throw new UnsupportedOperationException("Not yet implemented.");
}
public boolean containsDomainValue(Number value) {
//return RectRegion.isBetween(value, minX, maxX);
return xLineRegion.contains(value);
}
public boolean containsRangeValue(Number value) {
//return RectRegion.isBetween(value, minY, maxY);
return yLineRegion.contains(value);
}
public boolean intersects(RectRegion region) {
return intersects(region.getMinX(), region.getMaxX(), region.getMinY(), region.getMaxY());
}
/**
* Tests whether this region intersects the region defined by params. Use
* null to represent infinity. Negative and positive infinity is implied by
* the boundary edge, ie. a maxX of null equals positive infinity while a
* minX of null equals negative infinity.
* @param minX
* @param maxX
* @param minY
* @param maxY
* @return
*/
public boolean intersects(Number minX, Number maxX, Number minY, Number maxY) {
return xLineRegion.intersects(minX, maxX) && yLineRegion.intersects(minY, maxY);
}
public boolean intersects(RectF region, Number visMinX, Number visMaxX, Number visMinY, Number visMaxY) {
RectF thisRegion = getRectF(region, visMinX.doubleValue(), visMaxX.doubleValue(),
visMinY.doubleValue(), visMaxY.doubleValue());
return RectF.intersects(thisRegion, region);
}
public RectF getRectF(RectF plotRect, Number visMinX, Number visMaxX, Number visMinY, Number visMaxY) {
PointF topLeftPoint = ValPixConverter.valToPix(
xLineRegion.getMinVal().doubleValue() != Double.NEGATIVE_INFINITY ? xLineRegion.getMinVal() : visMinX,
yLineRegion.getMaxVal().doubleValue() != Double.POSITIVE_INFINITY ? yLineRegion.getMaxVal() : visMaxY,
plotRect,
visMinX,
visMaxX,
visMinY,
visMaxY);
PointF bottomRightPoint = ValPixConverter.valToPix(
xLineRegion.getMaxVal().doubleValue() != Double.POSITIVE_INFINITY ? xLineRegion.getMaxVal() : visMaxX,
yLineRegion.getMinVal().doubleValue() != Double.NEGATIVE_INFINITY ? yLineRegion.getMinVal() : visMinY,
plotRect,
visMinX,
visMaxX,
visMinY,
visMaxY);
// TODO: figure out why the y-values are inverted
return new RectF(topLeftPoint.x, topLeftPoint.y, bottomRightPoint.x, bottomRightPoint.y);
}
/**
* Returns a list of XYRegions that either completely or partially intersect the area
* defined by params. A null value for any parameter represents infinity / no boundary.
* @param regions The list of regions to search through
* @param minX
* @param maxX
* @param minY
* @param maxY
* @return
*/
public static List<RectRegion> regionsWithin(List<RectRegion> regions, Number minX, Number maxX, Number minY, Number maxY) {
ArrayList<RectRegion> intersectingRegions = new ArrayList<RectRegion>();
for(RectRegion r : regions) {
if(r.intersects(minX, maxX, minY, maxY)) {
intersectingRegions.add(r);
}
}
return intersectingRegions;
}
public Number getMinX() {
return xLineRegion.getMinVal();
}
public void setMinX(double minX) {
xLineRegion.setMinVal(minX);
}
public Number getMaxX() {
return xLineRegion.getMaxVal();
}
public void setMaxX(Number maxX) {
xLineRegion.setMaxVal(maxX);
}
public Number getMinY() {
return yLineRegion.getMinVal();
}
public void setMinY(Number minY) {
yLineRegion.setMinVal(minY);
}
public Number getMaxY() {
return yLineRegion.getMaxVal();
}
public void setMaxY(Number maxY) {
yLineRegion.setMaxVal(maxY);
}
public String getLabel() {
return label;
}
public void setLabel(String label) {
this.label = label;
}
}