Vertex.java 3.95 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
/*-
 *  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 <https://www.gnu.org/licenses/>.
 */
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<SerializablePair<Geometry, HashSet<LinearRing>>> adjacentRings = new ArrayList<>(2);

	public Vertex(double x, double y, double z) {
		super(x, y, z);
	}

	public Vertex(Vector3d vec) {
		super(vec);
	}

49
	private Set<LinearRing> getAdjacentRingsWithoutNeighbor(Geometry geom) {
50
51
52
53
54
55
56
57
58
		for (SerializablePair<Geometry, HashSet<LinearRing>> adjacency : adjacentRings) {
			if (adjacency.getValue0() == geom) {
				return adjacency.getValue1();
			}
		}
		throw new IllegalStateException("Requested adjacent rings with Geometry not containing this vertex");
	}

	public Set<LinearRing> getAdjacentRings(Geometry geom) {
59
		return getAdjacentRingsWithoutNeighbor(geom);
60
61
	}

62
	void addAdjacentRing(LinearRing ring, Geometry geom) {
Matthias Betz's avatar
Matthias Betz committed
63
64
65
		if (adjacentRings == null) {
			adjacentRings = new ArrayList<>(2);
		}
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
		findAdjacentRingsForGeometry(geom).add(ring);
	}

	private Set<LinearRing> findAdjacentRingsForGeometry(Geometry geom) {
		HashSet<LinearRing> adjacendRingsSet = null;
		for (SerializablePair<Geometry, HashSet<LinearRing>> adjacency : adjacentRings) {
			if (adjacency.getValue0() == geom) {
				adjacendRingsSet = adjacency.getValue1();
			}
		}
		if (adjacendRingsSet == null) {
			adjacendRingsSet = new HashSet<>(4);
			adjacentRings.add(new SerializablePair<>(geom, adjacendRingsSet));
		}
		return adjacendRingsSet;
	}

83
84
	private Set<Polygon> getAdjacentPolygonsWithoutNeighbor(Geometry geom) {
		for (SerializablePair<Geometry, HashSet<LinearRing>> adjacency : adjacentRings) {
85
			if (adjacency.getValue0() == geom) {
86
87
88
89
90
				Set<Polygon> polygons = new HashSet<>();
				for (LinearRing lr : adjacency.getValue1()) {
					polygons.add(lr.getParent());
				}
				return polygons;
91
92
93
94
95
96
			}
		}
		throw new IllegalStateException("Requested adjacent polygons with Geometry not containing this vertex");
	}

	public Set<Polygon> getAdjacentPolygons(Geometry geom) {
97
		return getAdjacentPolygonsWithoutNeighbor(geom);
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
	}

	@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) {
Matthias Betz's avatar
Matthias Betz committed
124
125
126
		if (adjacentRings == null) {
			return;
		}
127
128
129
		findAdjacentRingsForGeometry(geometry).clear();
	}

130
	void removeAdjacency(LinearRing lr, Geometry geom) {
131
132
133
		findAdjacentRingsForGeometry(geom).remove(lr);
	}

134
135
136
137
	/**
	 * Remove all adjacent rings from this vertex, ignoring geometry association
	 */
	void clearAdjacentRings() {
Matthias Betz's avatar
Matthias Betz committed
138
		adjacentRings = null;
139
	}
140
}