HyperplaneSubsets.java
/*
* 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.internal;
import org.apache.commons.geometry.core.Point;
import org.apache.commons.geometry.core.Region;
import org.apache.commons.geometry.core.RegionLocation;
import org.apache.commons.geometry.core.partitioning.EmbeddingHyperplane;
/** Utility methods for {@link org.apache.commons.geometry.core.partitioning.HyperplaneSubset}
* implementations.
*/
public final class HyperplaneSubsets {
/** Utility class; no instantiation. */
private HyperplaneSubsets() {
}
/** Classify a point against a region embedded in a hyperplane.
* @param <P> Point implementation class
* @param <S> Subspace point implementation class
* @param <H> Hyperplane implementation class
* @param <R> Region implementation class
* @param pt the point to classify
* @param hyperplane hyperplane containing the embedded region
* @param embeddedRegion embedded region to classify against
* @return the region location of the given point
*/
public static <
P extends Point<P>,
S extends Point<S>,
H extends EmbeddingHyperplane<P, S>,
R extends Region<S>> RegionLocation classifyAgainstEmbeddedRegion(final P pt,
final H hyperplane, final R embeddedRegion) {
if (hyperplane.contains(pt)) {
final S subPoint = hyperplane.toSubspace(pt);
return embeddedRegion.classify(subPoint);
}
return RegionLocation.OUTSIDE;
}
/** Return the closest point to a given point in a region embedded in a hyperplane.
* @param <P> Point implementation class
* @param <S> Subspace point implementation class
* @param <H> Hyperplane implementation class
* @param <R> Region implementation class
* @param pt point to find the closest point to
* @param hyperplane hyperplane containing the embedded region
* @param embeddedRegion embedded region to find the closest point in
* @return the closest point to {@code pt} in the embedded region
*/
public static <
P extends Point<P>,
S extends Point<S>,
H extends EmbeddingHyperplane<P, S>,
R extends Region<S>> P closestToEmbeddedRegion(final P pt,
final H hyperplane, final R embeddedRegion) {
final S subPt = hyperplane.toSubspace(pt);
if (embeddedRegion.contains(subPt)) {
return hyperplane.toSpace(subPt);
}
final S subProjected = embeddedRegion.project(subPt);
if (subProjected != null) {
return hyperplane.toSpace(subProjected);
}
return null;
}
}