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(50); 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 }