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.euclidean;
    18
    19  import java.util.Objects;
    20
    21  import org.apache.commons.geometry.core.Embedding;
    22  import org.apache.commons.geometry.euclidean.oned.Vector1D;
    23
    24  /** Base class for intersections discovered during linecast operations. This class contains
    25   * the intersection point and the normal of the target boundary at the point of intersection
    26   * along with the intersecting line and abscissa.
    27   * @param <P> Euclidean point/vector implementation type
    28   * @param <U> Unit-length Euclidean vector implementation type
    29   * @param <L> Line implementation type
    30   */
    31  public abstract class AbstractLinecastPoint<
    32      P extends EuclideanVector<P>,
    33      U extends P,
    34      L extends Embedding<P, Vector1D>> {
    35
    36      /** Line intersection point. */
    37      private final P point;
    38
    39      /** Normal of the target boundary at the intersection point. */
    40      private final U normal;
    41
    42      /** The intersecting line. */
    43      private final L line;
    44
    45      /** Abscissa of the intersection point along the intersecting line. */
    46      private final double abscissa;
    47
    48      /** Construct a new instance from its components.
    49       * @param point intersection point
    50       * @param normal surface normal
    51       * @param line line that the intersection point belongs to
    52       */
    53      protected AbstractLinecastPoint(final P point, final U normal, final L line) {
    54          this.point = point;
    55          this.normal = normal;
    56          this.line = line;
    57
    58          this.abscissa = line.toSubspace(point).getX();
    59      }
    60
    61      /** Get the line intersection point.
    62       * @return the line intersection point
    63       */
    64      public P getPoint() {
    65          return point;
    66      }
    67
    68      /** Get the normal of the target boundary at the intersection point.
    69       * @return the normal of the target boundary at the intersection point
    70       */
    71      public U getNormal() {
    72          return normal;
    73      }
    74
    75      /** Get the intersecting line.
    76       * @return the intersecting line
    77       */
    78      public L getLine() {
    79          return line;
    80      }
    81
    82      /** Get the abscissa (1D position) of the intersection point
    83       * along the linecast line.
    84       * @return the abscissa of the intersection point.
    85       */
    86      public double getAbscissa() {
    87          return abscissa;
    88      }
    89
    90      /** {@inheritDoc} */
    91      @Override
    92      public int hashCode() {
    93          return Objects.hash(point, normal, line);
    94      }
    95
    96      /** {@inheritDoc} */
    97      @Override
    98      public boolean equals(final Object obj) {
    99          if (this == obj) {
    100             return true;
    101         }
    102         if (obj == null || !getClass().equals(obj.getClass())) {
    103             return false;
    104         }
    105
    106         final AbstractLinecastPoint<?, ?, ?> other = (AbstractLinecastPoint<?, ?, ?>) obj;
    107
    108         return Objects.equals(point, other.point) &&
    109                 Objects.equals(normal, other.normal) &&
    110                 Objects.equals(line, other.line);
    111     }
    112
    113     /** {@inheritDoc} */
    114     @Override
    115     public String toString() {
    116         final StringBuilder sb = new StringBuilder();
    117         sb.append(getClass().getSimpleName())
    118             .append("[point= ")
    119             .append(getPoint())
    120             .append(", normal= ")
    121             .append(getNormal())
    122             .append(", abscissa= ")
    123             .append(getAbscissa())
    124             .append(", line= ")
    125             .append(getLine())
    126             .append(']');
    127
    128         return sb.toString();
    129     }
    130 }