/*- * 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; } }