blob: 52d0eee7e05afc841d1cb242c5c4bc2f5ba5088b [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.commons.geometry.core.partitioning;
import org.apache.commons.geometry.core.Point;
/** This interface is used to visit {@link BSPTree BSP tree} nodes.
* <p>Navigation through {@link BSPTree BSP trees} can be done using
* two different point of views:</p>
* <ul>
* <li>
* the first one is in a node-oriented way using the {@link
* BSPTree#getPlus}, {@link BSPTree#getMinus} and {@link
* BSPTree#getParent} methods. Terminal nodes without associated
* {@link SubHyperplane sub-hyperplanes} can be visited this way,
* there is no constraint in the visit order, and it is possible
* to visit either all nodes or only a subset of the nodes
* </li>
* <li>
* the second one is in a sub-hyperplane-oriented way using
* classes implementing this interface which obeys the visitor
* design pattern. The visit order is provided by the visitor as
* each node is first encountered. Each node is visited exactly
* once.
* </li>
* </ul>
* @param <P> Point type defining the space
* @see BSPTree
* @see SubHyperplane
*/
public interface BSPTreeVisitor<P extends Point<P>> {
/** Enumerate for visit order with respect to plus sub-tree, minus sub-tree and cut sub-hyperplane. */
enum Order {
/** Indicator for visit order plus sub-tree, then minus sub-tree,
* and last cut sub-hyperplane.
*/
PLUS_MINUS_SUB,
/** Indicator for visit order plus sub-tree, then cut sub-hyperplane,
* and last minus sub-tree.
*/
PLUS_SUB_MINUS,
/** Indicator for visit order minus sub-tree, then plus sub-tree,
* and last cut sub-hyperplane.
*/
MINUS_PLUS_SUB,
/** Indicator for visit order minus sub-tree, then cut sub-hyperplane,
* and last plus sub-tree.
*/
MINUS_SUB_PLUS,
/** Indicator for visit order cut sub-hyperplane, then plus sub-tree,
* and last minus sub-tree.
*/
SUB_PLUS_MINUS,
/** Indicator for visit order cut sub-hyperplane, then minus sub-tree,
* and last plus sub-tree.
*/
SUB_MINUS_PLUS;
}
/** Determine the visit order for this node.
* <p>Before attempting to visit an internal node, this method is
* called to determine the desired ordering of the visit. It is
* guaranteed that this method will be called before {@link
* #visitInternalNode visitInternalNode} for a given node, it will be
* called exactly once for each internal node.</p>
* @param node BSP node guaranteed to have a non null cut sub-hyperplane
* @return desired visit order, must be one of
* {@link Order#PLUS_MINUS_SUB}, {@link Order#PLUS_SUB_MINUS},
* {@link Order#MINUS_PLUS_SUB}, {@link Order#MINUS_SUB_PLUS},
* {@link Order#SUB_PLUS_MINUS}, {@link Order#SUB_MINUS_PLUS}
*/
Order visitOrder(BSPTree<P> node);
/** Visit a BSP tree node node having a non-null sub-hyperplane.
* <p>It is guaranteed that this method will be called after {@link
* #visitOrder visitOrder} has been called for a given node,
* it wil be called exactly once for each internal node.</p>
* @param node BSP node guaranteed to have a non null cut sub-hyperplane
* @see #visitLeafNode
*/
void visitInternalNode(BSPTree<P> node);
/** Visit a leaf BSP tree node node having a null sub-hyperplane.
* @param node leaf BSP node having a null sub-hyperplane
* @see #visitInternalNode
*/
void visitLeafNode(BSPTree<P> node);
}