View Javadoc

    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.internal;
    18
    19  import org.apache.commons.geometry.core.Point;
    20  import org.apache.commons.geometry.core.Region;
    21  import org.apache.commons.geometry.core.RegionLocation;
    22  import org.apache.commons.geometry.core.partitioning.EmbeddingHyperplane;
    23
    24  /** Utility methods for {@link org.apache.commons.geometry.core.partitioning.HyperplaneSubset}
    25   * implementations.
    26   */
    27  public final class HyperplaneSubsets {
    28
    29      /** Utility class; no instantiation. */
    30      private HyperplaneSubsets() {
    31      }
    32
    33      /** Classify a point against a region embedded in a hyperplane.
    34       * @param <P> Point implementation class
    35       * @param <S> Subspace point implementation class
    36       * @param <H> Hyperplane implementation class
    37       * @param <R> Region implementation class
    38       * @param pt the point to classify
    39       * @param hyperplane hyperplane containing the embedded region
    40       * @param embeddedRegion embedded region to classify against
    41       * @return the region location of the given point
    42       */
    43      public static <
    44          P extends Point<P>,
    45          S extends Point<S>,
    46          H extends EmbeddingHyperplane<P, S>,
    47          R extends Region<S>> RegionLocation classifyAgainstEmbeddedRegion(final P pt,
    48                  final H hyperplane, final R embeddedRegion) {
    49
    50          if (hyperplane.contains(pt)) {
    51              final S subPoint = hyperplane.toSubspace(pt);
    52
    53              return embeddedRegion.classify(subPoint);
    54          }
    55
    56          return RegionLocation.OUTSIDE;
    57      }
    58
    59      /** Return the closest point to a given point in a region embedded in a hyperplane.
    60       * @param <P> Point implementation class
    61       * @param <S> Subspace point implementation class
    62       * @param <H> Hyperplane implementation class
    63       * @param <R> Region implementation class
    64       * @param pt point to find the closest point to
    65       * @param hyperplane hyperplane containing the embedded region
    66       * @param embeddedRegion embedded region to find the closest point in
    67       * @return the closest point to {@code pt} in the embedded region
    68       */
    69      public static <
    70          P extends Point<P>,
    71          S extends Point<S>,
    72          H extends EmbeddingHyperplane<P, S>,
    73          R extends Region<S>> P closestToEmbeddedRegion(final P pt,
    74                  final H hyperplane, final R embeddedRegion) {
    75
    76          final S subPt = hyperplane.toSubspace(pt);
    77
    78          if (embeddedRegion.contains(subPt)) {
    79              return hyperplane.toSpace(subPt);
    80          }
    81
    82          final S subProjected = embeddedRegion.project(subPt);
    83          if (subProjected != null) {
    84              return hyperplane.toSpace(subProjected);
    85          }
    86
    87          return null;
    88      }
    89  }