1 /*
2 * Licensed to the Apache Software Foundation (ASF) 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 ASF 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 * http://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 package org.apache.commons.geometry.core.partitioning;
18
19 import org.apache.commons.geometry.core.Point;
20 import org.apache.commons.geometry.core.Transform;
21
22 /** Interface representing a hyperplane, which in a space of dimension {@code n} is
23 * a subspace of dimension {@code n - 1}. (A hyperplane in Euclidean 3D space,
24 * for example, is a 2 dimensional plane.)
25 *
26 * <p>
27 * Hyperplanes partition their surrounding space into 3 distinct sets: (1) points
28 * lying on one side of the hyperplane, (2) points lying on the opposite side, and
29 * (3) points lying on the hyperplane itself. One side of the hyperplane is labeled
30 * as the <em>plus</em> side and the other as the <em>minus</em> side. The
31 * {@link #offset(Point) offset} of a point in relation to a hyperplane is the distance
32 * from the point to the hyperplane combined with the sign of the side that the point
33 * lies on: points lying on the plus side of the hyperplane have a positive offsets,
34 * those on the minus side have a negative offset, and those lying directly on the
35 * hyperplane have an offset of zero.
36 *
37 * @param <P> Point implementation type
38 * @see HyperplaneLocation
39 * @see HyperplaneSubset
40 */
41 public interface Hyperplane<P extends Point<P>> {
42
43 /** Get the offset (oriented distance) of a point with respect
44 * to this instance. Points with an offset of zero lie on the
45 * hyperplane itself.
46 * @param point the point to compute the offset for
47 * @return the offset of the point
48 */
49 double offset(P point);
50
51 /** Classify a point with respect to this hyperplane.
52 * @param point the point to classify
53 * @return the relative location of the point with
54 * respect to this instance
55 */
56 HyperplaneLocation classify(P point);
57
58 /** Return true if the given point lies on the hyperplane.
59 * @param point the point to test
60 * @return true if the point lies on the hyperplane
61 */
62 boolean contains(P point);
63
64 /** Project a point onto this instance.
65 * @param point the point to project
66 * @return the projection of the point onto this instance. The returned
67 * point lies on the hyperplane.
68 */
69 P project(P point);
70
71 /** Return a hyperplane that has the opposite orientation as this instance.
72 * That is, the plus side of this instance is the minus side of the returned
73 * instance and vice versa.
74 * @return a hyperplane with the opposite orientation
75 */
76 Hyperplane<P> reverse();
77
78 /** Transform this instance using the given {@link Transform}.
79 * @param transform object to transform this instance with
80 * @return a new, transformed hyperplane
81 */
82 Hyperplane<P> transform(Transform<P> transform);
83
84 /** Return true if this instance has a similar orientation to the given hyperplane,
85 * meaning that they point in generally the same direction. This method is not
86 * used to determine exact equality of hyperplanes, but rather to determine whether
87 * two hyperplanes that contain the same points are parallel (point in the same direction)
88 * or anti-parallel (point in opposite directions).
89 * @param other the hyperplane to compare with
90 * @return true if the hyperplanes point in generally the same direction and could
91 * possibly be parallel
92 */
93 boolean similarOrientation(Hyperplane<P> other);
94
95 /** Return a {@link HyperplaneConvexSubset} spanning this entire hyperplane. The returned
96 * subset contains all points lying in this hyperplane and no more.
97 * @return a {@link HyperplaneConvexSubset} containing all points lying in this hyperplane
98 */
99 HyperplaneConvexSubset<P> span();
100 }