/*-
* Copyright 2020 Beuth Hochschule für Technik Berlin, Hochschule für Technik Stuttgart
*
* This file is part of CityDoctor2.
*
* CityDoctor2 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 3 of the License, or
* (at your option) any later version.
*
* CityDoctor2 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 CityDoctor2. If not, see .
*/
package de.hft.stuttgart.citydoctor2.datastructure;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import de.hft.stuttgart.citydoctor2.math.Vector3d;
import de.hft.stuttgart.citydoctor2.utils.SerializablePair;
/**
* Contains the vertex information of a point in a linear ring
*
* @author Matthias Betz
*
*/
public class Vertex extends Vector3d {
private static final long serialVersionUID = -5525361920397934892L;
private List>> adjacentRings = new ArrayList<>(2);
public Vertex(double x, double y, double z) {
super(x, y, z);
}
public Vertex(Vector3d vec) {
super(vec);
}
private Set getAdjacentRingsWithoutNeighbor(Geometry geom) {
for (SerializablePair> adjacency : adjacentRings) {
if (adjacency.getValue0() == geom) {
return adjacency.getValue1();
}
}
throw new IllegalStateException("Requested adjacent rings with Geometry not containing this vertex");
}
public Set getAdjacentRings(Geometry geom) {
return getAdjacentRingsWithoutNeighbor(geom);
}
void addAdjacentRing(LinearRing ring, Geometry geom) {
if (adjacentRings == null) {
adjacentRings = new ArrayList<>(2);
}
findAdjacentRingsForGeometry(geom).add(ring);
}
private Set findAdjacentRingsForGeometry(Geometry geom) {
HashSet adjacendRingsSet = null;
for (SerializablePair> adjacency : adjacentRings) {
if (adjacency.getValue0() == geom) {
adjacendRingsSet = adjacency.getValue1();
}
}
if (adjacendRingsSet == null) {
adjacendRingsSet = new HashSet<>(4);
adjacentRings.add(new SerializablePair<>(geom, adjacendRingsSet));
}
return adjacendRingsSet;
}
private Set getAdjacentPolygonsWithoutNeighbor(Geometry geom) {
for (SerializablePair> adjacency : adjacentRings) {
if (adjacency.getValue0() == geom) {
Set polygons = new HashSet<>();
for (LinearRing lr : adjacency.getValue1()) {
polygons.add(lr.getParent());
}
return polygons;
}
}
throw new IllegalStateException("Requested adjacent polygons with Geometry not containing this vertex");
}
public Set getAdjacentPolygons(Geometry geom) {
return getAdjacentPolygonsWithoutNeighbor(geom);
}
@Override
public int hashCode() {
final int prime = 31;
int result = super.hashCode();
return prime * result;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (!super.equals(obj)) {
return false;
}
return getClass() == obj.getClass();
}
@Override
public String toString() {
return "Vertex [x=" + getX() + ", y=" + getY() + ", z=" + getZ() + "]";
}
public void clearAdjacentRings(Geometry geometry) {
if (adjacentRings == null) {
return;
}
findAdjacentRingsForGeometry(geometry).clear();
}
void removeAdjacency(LinearRing lr, Geometry geom) {
findAdjacentRingsForGeometry(geom).remove(lr);
}
/**
* Remove all adjacent rings from this vertex, ignoring geometry association
*/
void clearAdjacentRings() {
adjacentRings = null;
}
}