1 /*
2 * Licensed to the Hipparchus project under one or more
3 * contributor license agreements. See the NOTICE file distributed with
4 * this work for additional information regarding copyright ownership.
5 * The Hipparchus project licenses this file to You under the Apache License, Version 2.0
6 * (the "License"); you may not use this file except in compliance with
7 * the License. You may obtain a copy of the License at
8 *
9 * https://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
18 package org.hipparchus.geometry.spherical.twod;
19
20 import org.hipparchus.geometry.euclidean.threed.Vector3D;
21 import org.hipparchus.geometry.partitioning.BSPTree;
22
23 /** Specialized version of {@link Edge} with tree node information.
24 * <p>
25 * The tree nodes information is used to set up connection between
26 * edges (i.e. combine the end vertex of an edge and the start vertex
27 * of the next edge) using topological information, thus avoiding
28 * inaccuracies due to angular distance only checks.
29 * </p>
30 * @since 1.4
31 */
32 class EdgeWithNodeInfo extends Edge {
33
34 /** Node containing edge. */
35 private final BSPTree<Sphere2D, S2Point, Circle, SubCircle> node;
36
37 /** Node whose intersection with current node defines start point. */
38 private final BSPTree<Sphere2D, S2Point, Circle, SubCircle> startNode;
39
40 /** Node whose intersection with current node defines end point. */
41 private final BSPTree<Sphere2D, S2Point, Circle, SubCircle> endNode;
42
43 /** Indicator for completely processed edge. */
44 private boolean processed;
45
46 /** Build an edge.
47 * @param start start point
48 * @param end end point
49 * @param length length of the arc (it can be greater than π)
50 * @param circle circle supporting the edge
51 * @param node node containing the edge
52 * @param startNode node whose intersection with current node defines start point
53 * @param endNode node whose intersection with current node defines end point
54 */
55 EdgeWithNodeInfo(final Vertex start, final Vertex end,
56 final double length, final Circle circle,
57 final BSPTree<Sphere2D, S2Point, Circle, SubCircle> node,
58 final BSPTree<Sphere2D, S2Point, Circle, SubCircle> startNode,
59 final BSPTree<Sphere2D, S2Point, Circle, SubCircle> endNode) {
60 super(start, end, length, circle);
61 this.node = node;
62 this.startNode = startNode;
63 this.endNode = endNode;
64 this.processed = false;
65 }
66
67 /** Check if two edges follow each other naturally.
68 * @param previous candidate previous edge
69 * @param next candidate next edge
70 * @return true if {@code edge} is a natural follower for instance
71 */
72 public static boolean areNaturalFollowers(final EdgeWithNodeInfo previous, final EdgeWithNodeInfo next) {
73 return next.getStart().getIncoming() == null &&
74 previous.endNode == next.node &&
75 previous.node == next.startNode &&
76 Vector3D.dotProduct(previous.getEnd().getLocation().getVector(),
77 next.getStart().getLocation().getVector()) > 0.0;
78 }
79
80 /** Check if two edges result from a single edged having been split by a circle.
81 * @param previous candidate previous edge
82 * @param next candidate next edge
83 * @return true if {@code edge} is a natural follower for instance
84 */
85 public static boolean resultFromASplit(final EdgeWithNodeInfo previous, final EdgeWithNodeInfo next) {
86 return next.getStart().getIncoming() == null &&
87 previous.node.getCut().getHyperplane() == next.node.getCut().getHyperplane() &&
88 previous.endNode == next.startNode &&
89 Vector3D.dotProduct(previous.getEnd().getLocation().getVector(),
90 next.getStart().getLocation().getVector()) > 0.0;
91 }
92
93 /** Set the processed flag.
94 * @param processed processed flag to set
95 */
96 public void setProcessed(final boolean processed) {
97 this.processed = processed;
98 }
99
100 /** Check if the edge has been processed.
101 * @return true if the edge has been processed
102 */
103 public boolean isProcessed() {
104 return processed;
105 }
106
107 }