/*
* CCVisu is a tool for visual graph clustering
* and general force-directed graph layout.
* This file is part of CCVisu.
*
* Copyright (C) 2005-2012 Dirk Beyer
*
* CCVisu is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* CCVisu 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with CCVisu; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* Please find the GNU Lesser General Public License in file
* license_lgpl.txt or http://www.gnu.org/licenses/lgpl.txt
*
* Dirk Beyer (firstname.lastname@uni-passau.de)
* University of Passau, Bavaria, Germany
*/
package org.sosy_lab.ccvisu.graph;
import java.util.Collection;
public class Position {
public float x = 0.0f;
public float y = 0.0f;
public float z = 0.0f;
public Position() {
}
public Position(float x, float y, float z) {
this.x = x;
this.y = y;
this.z = z;
}
public Position(Position position) {
this(position.x, position.y, position.z);
}
public float getX() {
return x;
}
public float getY() {
return y;
}
public float getZ() {
return z;
}
public boolean equals(Position position) {
return (x == position.x && y == position.y && z == position.z);
}
public boolean lessEq(Position position) {
return (x <= position.x && y <= position.y && z <= position.z);
}
public void add(Position position) {
x += position.x;
y += position.y;
z += position.z;
}
public void subtract(Position position) {
x -= position.x;
y -= position.y;
z -= position.z;
}
public void mult(Position position) {
x *= position.x;
y *= position.y;
z *= position.z;
}
public void div(Position position) {
x /= position.x;
y /= position.y;
z /= position.z;
}
public void mult(float scalar) {
x *= scalar;
y *= scalar;
z *= scalar;
}
public void div(float scalar) {
x /= scalar;
y /= scalar;
z /= scalar;
}
public static Position add(Position position, float scalar) {
Position result = new Position(position);
result.x += scalar;
result.y += scalar;
result.z += scalar;
return result;
}
public static Position subtract(Position position, float scalar) {
Position result = new Position(position);
result.x -= scalar;
result.y -= scalar;
result.z -= scalar;
return result;
}
public static Position mult(Position position, float scalar) {
Position result = new Position(position);
result.x *= scalar;
result.y *= scalar;
result.z *= scalar;
return result;
}
public static Position div(Position position, float scalar) {
Position result = new Position(position);
result.x /= scalar;
result.y /= scalar;
result.z /= scalar;
return result;
}
public static Position add(Position pos1, Position pos2) {
Position result = new Position(pos1);
result.x += pos2.x;
result.y += pos2.y;
result.z += pos2.z;
return result;
}
public static Position subtract(Position pos1, Position pos2) {
Position result = new Position(pos1);
result.x -= pos2.x;
result.y -= pos2.y;
result.z -= pos2.z;
return result;
}
public static Position mult(Position pos1, Position pos2) {
Position result = new Position(pos1);
result.x *= pos2.x;
result.y *= pos2.y;
result.z *= pos2.z;
return result;
}
public static Position div(Position pos1, Position pos2) {
Position result = new Position(pos1);
result.x /= pos2.x;
result.y /= pos2.y;
result.z /= pos2.z;
return result;
}
public static Position min(Collection<GraphVertex> collection,
boolean restrictToVisible, boolean includeAux) {
Position minPos = new Position(Float.MAX_VALUE, Float.MAX_VALUE, Float.MAX_VALUE);
for (GraphVertex vertex : collection) {
if ((!restrictToVisible || vertex.isShowVertex())
&& (includeAux || !vertex.isAuxiliary())) {
minPos.x = Math.min(minPos.x, vertex.getPosition().x);
minPos.y = Math.min(minPos.y, vertex.getPosition().y);
minPos.z = Math.min(minPos.z, vertex.getPosition().z);
}
}
return minPos;
}
public static Position min(Collection<GraphVertex> collection, boolean restrictToVisible) {
return min(collection, restrictToVisible, true);
}
public static Position max(Collection<GraphVertex> collection, boolean restrictToVisible, boolean includeAux) {
Position maxPos = new Position(-Float.MAX_VALUE, -Float.MAX_VALUE, -Float.MAX_VALUE);
for (GraphVertex vertex : collection) {
if ((!restrictToVisible || vertex.isShowVertex())
&& (includeAux || !vertex.isAuxiliary())) {
maxPos.x = Math.max(maxPos.x, vertex.getPosition().x);
maxPos.y = Math.max(maxPos.y, vertex.getPosition().y);
maxPos.z = Math.max(maxPos.z, vertex.getPosition().z);
}
}
return maxPos;
}
public static Position max(Collection<GraphVertex> collection, boolean restrictToVisible) {
return max(collection, restrictToVisible, true);
}
/**
* Returns the maximum over each dimension of the width of two points.
*
* @return Maximum over each dimension of the width of two points.
*/
public static float width(Position pos1, Position pos2) {
Position diffPos = Position.subtract(pos1, pos2);
float width = Math.max(diffPos.x, diffPos.y);
width = Math.max(diffPos.z, width);
return width;
}
/**
* Returns the Euclidean distance between the specified positions.
*
* @return Euclidean distance between the specified positions.
*/
public float distanceTo(Position position) {
float xDiff = this.x - position.x;
float yDiff = this.y - position.y;
float zDiff = this.z - position.z;
return (float) Math.sqrt(xDiff * xDiff
+ yDiff * yDiff
+ zDiff * zDiff);
}
}