// License: GPL. For details, see LICENSE file. package org.openstreetmap.josm.plugins.tracer2; import java.awt.geom.Point2D; public class StraightLine { private Double m_dm; // slope (gradient) private Double m_dc; // y-intercept private Double m_dx; // x-intercept (if y-intercept == NaN) private Double m_dAlpha; // alpha (-180 < alpha <= 180) public StraightLine(Double dm, Double dc, boolean bRevert) { this.m_dm = dm; this.m_dc = dc; this.m_dx = Double.NaN; if (this.m_dm.isNaN()) { this.m_dAlpha = Double.NaN; } else if (this.m_dm.isInfinite()) { this.m_dAlpha = CheckAlpha((Double.NEGATIVE_INFINITY == this.m_dm) ? -90.0 : 90.0); } else { this.m_dAlpha = CheckAlpha(Math.atan(dm) * 180 / Math.PI + (bRevert ? 180 : 0)); } } public StraightLine(Point2D.Double oP1, Point2D.Double oP2) { this.m_dm = (oP2.getY() - oP1.getY()) / (oP2.getX() - oP1.getX()); this.m_dc = oP1.getY() - (m_dm * oP1.getX()); if (this.m_dm.isInfinite() || this.m_dm.isNaN()) { this.m_dx = oP1.getX(); this.m_dAlpha = CheckAlpha(oP1.getY() > oP2.getY() ? -90.0 : 90.0); } else { this.m_dx = Double.NaN; this.m_dAlpha = CheckAlpha( Math.atan((oP2.getY() - oP1.getY()) / (oP2.getX() - oP1.getX())) * 180 / Math.PI + (oP1.getX() > oP2.getX() ? 180 : 0)); } } private static Double CheckAlpha(Double dAlpha) { if (dAlpha > 180) { return dAlpha - 360; } if (dAlpha <= -180) { return dAlpha + 360; } return dAlpha; } public Double getM() { return m_dm; } public Double getC() { return m_dc; } public Double getX() { return m_dx; } public Double getAlpha() { return m_dAlpha; } public boolean IsLine() { return !(m_dx.isNaN() || m_dx.isInfinite() || m_dAlpha.isNaN() || m_dAlpha.isInfinite()) || !(m_dm.isNaN() || m_dm.isInfinite() || m_dc.isNaN() || m_dc.isInfinite()); } public Point2D.Double GetIntersectionPoint(StraightLine oLine) { Double dx; Double dy; if (!this.IsLine() || !oLine.IsLine()) { // data missing return new Point2D.Double(Double.NaN, Double.NaN); } if (m_dm.isInfinite() || this.m_dm.isNaN()) { if (oLine.getM().isInfinite() || oLine.getM().isNaN()) { // no IntersectionPoint return new Point2D.Double(Double.NaN, Double.NaN); } else { dx = this.m_dx; dy = oLine.getM() * dx + oLine.getC(); } } else if (oLine.getM().isInfinite() || oLine.getM().isNaN()) { dx = oLine.getX(); dy = this.m_dm * dx + this.m_dc; } else { dx = (oLine.m_dc - this.m_dc) / (this.m_dm - oLine.m_dm); dy = this.m_dm * dx + this.m_dc; } return new Point2D.Double(dx, dy); } }