/* * Created on 22 juin 2005 * Created by Olivier Chalouhi * * Copyright (C) 2004, 2005, 2006 Aelitis SAS, All rights Reserved * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details ( see the LICENSE file ). * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * AELITIS, SAS au capital de 46,603.30 euros, * 8 Allee Lenotre, La Grille Royale, 78600 Le Mesnil le Roi, France. */ package com.aelitis.azureus.core.dht.netcoords.vivaldi.ver1.impl; import com.aelitis.azureus.core.dht.netcoords.vivaldi.ver1.*; public class HeightCoordinatesImpl implements Coordinates { protected float x,y,h; public HeightCoordinatesImpl(float x, float y, float h) { this.x = x; this.y = y; this.h = h; } public HeightCoordinatesImpl(HeightCoordinatesImpl copy) { this.x = copy.x; this.y = copy.y; this.h = copy.h; } public Coordinates add(Coordinates other) { HeightCoordinatesImpl o = (HeightCoordinatesImpl) other; return new HeightCoordinatesImpl(x+o.x,y+o.y,Math.abs(h+o.h)); } public Coordinates sub(Coordinates other) { HeightCoordinatesImpl o = (HeightCoordinatesImpl) other; return new HeightCoordinatesImpl(x-o.x,y-o.y,Math.abs(h+o.h)); } public Coordinates scale(float scale) { return new HeightCoordinatesImpl(scale * x,scale * y ,scale * h); } public float measure() { return (float) (Math.sqrt(x * x + y * y) + h); } public boolean atOrigin() { return( x==0&&y==0); } public boolean isValid() { return( valid(x) && valid(y) && valid(h) && Math.abs(x) <= MAX_X && Math.abs(y) <= MAX_Y && Math.abs(h) <= MAX_H); } private boolean valid( float f ) { return( !(Float.isInfinite( f ) || Float.isNaN( f ))); } public float distance(Coordinates other) { return this.sub(other).measure(); } public Coordinates unity() { float measure = this.measure(); if(measure == 0) { //Special Vivaldi Case, when u(0) = random unity vector float x = (float)Math.random(); float y = (float)Math.random(); float h = (float)Math.random(); return new HeightCoordinatesImpl(x,y,h).unity(); } return this.scale(1/measure); } public double[] getCoordinates() { return( new double[]{ x, y } ); } public String toString() { return (int)x + "," + (int)y + "," + (int)h; } /** * @return Returns the h. */ public float getH() { return h; } /** * @return Returns the x. */ public float getX() { return x; } /** * @return Returns the y. */ public float getY() { return y; } public boolean equals(Object arg0) { if(arg0 instanceof HeightCoordinatesImpl) { HeightCoordinatesImpl other = (HeightCoordinatesImpl) arg0; if(other.x != x || other.y != y || other.h != h) return false; return true; } return false; } }