package com.baselet.control.basics; public class Line1D { private final Double low; private final Double high; public Line1D(double low, double high) { super(); this.low = low; this.high = high; } public double getLow() { return low; } public double getHigh() { return high; } /** * @return <code>high - low</code> */ public double getSpace() { return high - low; } /** * @return <code>(high + low) / 2</code> */ public double getCenter() { return (high + low) / 2; } public boolean contains(double value) { return low <= value && value <= high; } public boolean isIntersecting(Line1D other) { // first 2 return true if there is a partial overlap or this contains other // 3rd returns true if other contains this // therefore all 4 possibilities for an overlap are covered boolean isIntersecting = contains(other.getLow()) || contains(other.getHigh()) || other.contains(getLow()); return isIntersecting; } /** * returns the intersection of both points [eg: (2,5) intersect (1,4) = (2,4)] * @param nanPriority if true then NaN has priority over other values, otherwise other values have priority */ public Line1D intersect(Line1D other, boolean nanPriority) { Double maxLeft = low; Double minRight = high; if (nanPriority) { if (other.low.equals(Double.NaN) || other.low > low) { maxLeft = other.low; } if (other.high.equals(Double.NaN) || other.high < high) { minRight = other.high; } } else { if (low.equals(Double.NaN) || other.low > low) { maxLeft = other.low; } if (high.equals(Double.NaN) || other.high < high) { minRight = other.high; } } return new Line1D(maxLeft, minRight); } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + (high == null ? 0 : high.hashCode()); result = prime * result + (low == null ? 0 : low.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) { return true; } if (obj == null) { return false; } if (getClass() != obj.getClass()) { return false; } Line1D other = (Line1D) obj; if (high == null) { if (other.high != null) { return false; } } else if (!high.equals(other.high)) { return false; } if (low == null) { if (other.low != null) { return false; } } else if (!low.equals(other.low)) { return false; } return true; } @Override public String toString() { return "Line1D [low=" + low + ", high=" + high + "]"; } }