teichmann@5844: /* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde teichmann@5844: * Software engineering by Intevation GmbH teichmann@5844: * teichmann@5992: * This file is Free Software under the GNU AGPL (>=v3) teichmann@5844: * and comes with ABSOLUTELY NO WARRANTY! Check out the teichmann@5992: * documentation coming with Dive4Elements River for details. teichmann@5844: */ teichmann@5844: teichmann@5829: package org.dive4elements.river.importer; sascha@1204: felix@4707: felix@4707: /** Two doubles and an int index. */ sascha@1204: public class XY sascha@1204: implements Comparable sascha@1204: { sascha@1204: public static final double X_EPSILON = 1e-4; sascha@1204: sascha@1204: protected double x; sascha@1204: protected double y; sascha@1204: protected int index; sascha@1204: sascha@1204: public XY() { sascha@1204: } sascha@1204: teichmann@5083: public XY(XY other) { teichmann@5083: this(other.x, other.y, other.index); teichmann@5083: } teichmann@5083: sascha@1204: public XY(double x, double y, int index) { sascha@1204: this.x = x; sascha@1204: this.y = y; sascha@1204: this.index = index; sascha@1204: } sascha@1204: sascha@1204: @Override sascha@1204: public int compareTo(XY other) { sascha@1204: if (x + X_EPSILON < other.x) return -1; sascha@1204: if (x > other.x + X_EPSILON) return +1; sascha@1204: if (index < other.index) return -1; sascha@1204: if (index > other.index) return +1; sascha@1204: return 0; sascha@1204: } sascha@1204: sascha@1204: public double getX() { sascha@1204: return x; sascha@1204: } sascha@1204: sascha@1204: public void setX(double x) { sascha@1204: this.x = x; sascha@1204: } sascha@1204: sascha@1204: public double getY() { sascha@1204: return y; sascha@1204: } sascha@1204: sascha@1204: public void setY(double y) { sascha@1204: this.y = y; sascha@1204: } sascha@1204: sascha@1204: public int getIndex() { sascha@1204: return index; sascha@1204: } sascha@1204: sascha@1204: public void setIndex(int index) { sascha@1204: this.index = index; sascha@1204: } teichmann@5083: teichmann@5083: public double dot(double ox, double oy) { teichmann@5083: return x*ox + y*oy; teichmann@5083: } teichmann@5083: teichmann@5083: public double dot(XY other) { teichmann@5083: return dot(other.x, other.y); teichmann@5083: } teichmann@5083: teichmann@5083: public XY sub(XY other) { teichmann@5083: x -= other.x; teichmann@5083: y -= other.y; teichmann@5083: return this; teichmann@5083: } teichmann@5083: teichmann@5083: public XY ortho() { teichmann@5083: double z = x; teichmann@5083: x = y; teichmann@5083: y = -z; teichmann@5083: return this; teichmann@5083: } teichmann@5083: teichmann@5083: public XY normalize() { teichmann@5083: double len = dot(this); teichmann@5083: teichmann@5083: if (len > 1e-6) { teichmann@5083: len = 1d/Math.sqrt(len); teichmann@5083: x *= len; teichmann@5083: y *= len; teichmann@5083: } teichmann@5083: teichmann@5083: return this; teichmann@5083: } teichmann@5083: teichmann@5083: // x*nx + y*ny + d = 0 <=> d = -x*nx -y*ny teichmann@5083: public double lineOffset(XY p) { teichmann@5083: return -x*p.x -y*p.y; teichmann@5083: } sascha@1204: } sascha@1204: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :