Author: luc
Date: Thu Aug 18 18:50:08 2011
New Revision: 1159353

URL: http://svn.apache.org/viewvc?rev=1159353&view=rev
Log:
Added a 3D SubLine class.

JIRA: MATH-593

Added:
    
commons/proper/math/trunk/src/main/java/org/apache/commons/math/geometry/euclidean/threed/Segment.java
   (with props)
    
commons/proper/math/trunk/src/main/java/org/apache/commons/math/geometry/euclidean/threed/SubLine.java
   (with props)
    
commons/proper/math/trunk/src/test/java/org/apache/commons/math/geometry/euclidean/threed/SubLineTest.java
   (with props)
Modified:
    
commons/proper/math/trunk/src/main/java/org/apache/commons/math/geometry/euclidean/threed/Line.java
    
commons/proper/math/trunk/src/main/java/org/apache/commons/math/geometry/euclidean/threed/Plane.java
    commons/proper/math/trunk/src/site/xdoc/changes.xml
    
commons/proper/math/trunk/src/test/java/org/apache/commons/math/geometry/euclidean/threed/LineTest.java
    
commons/proper/math/trunk/src/test/java/org/apache/commons/math/geometry/euclidean/threed/PlaneTest.java

Modified: 
commons/proper/math/trunk/src/main/java/org/apache/commons/math/geometry/euclidean/threed/Line.java
URL: 
http://svn.apache.org/viewvc/commons/proper/math/trunk/src/main/java/org/apache/commons/math/geometry/euclidean/threed/Line.java?rev=1159353&r1=1159352&r2=1159353&view=diff
==============================================================================
--- 
commons/proper/math/trunk/src/main/java/org/apache/commons/math/geometry/euclidean/threed/Line.java
 (original)
+++ 
commons/proper/math/trunk/src/main/java/org/apache/commons/math/geometry/euclidean/threed/Line.java
 Thu Aug 18 18:50:08 2011
@@ -16,10 +16,11 @@
  */
 package org.apache.commons.math.geometry.euclidean.threed;
 
-import org.apache.commons.math.exception.MathArithmeticException;
+import org.apache.commons.math.exception.MathIllegalArgumentException;
 import org.apache.commons.math.exception.util.LocalizedFormats;
 import org.apache.commons.math.geometry.Vector;
 import org.apache.commons.math.geometry.euclidean.oned.Euclidean1D;
+import org.apache.commons.math.geometry.euclidean.oned.IntervalsSet;
 import org.apache.commons.math.geometry.euclidean.oned.Vector1D;
 import org.apache.commons.math.geometry.partitioning.Embedding;
 import org.apache.commons.math.util.FastMath;
@@ -28,7 +29,7 @@ import org.apache.commons.math.util.Math
 /** The class represent lines in a three dimensional space.
 
  * <p>Each oriented line is intrinsically associated with an abscissa
- * wich is a coordinate on the line. The point at abscissa 0 is the
+ * which is a coordinate on the line. The point at abscissa 0 is the
  * orthogonal projection of the origin on the line, another equivalent
  * way to express this is to say that it is the point of the line
  * which is closest to the origin. Abscissa increases in the line
@@ -45,13 +46,13 @@ public class Line implements Embedding<E
     /** Line point closest to the origin. */
     private Vector3D zero;
 
-    /** Build a line from a point and a direction.
-     * @param p point belonging to the line (this can be any point)
-     * @param direction direction of the line
-     * @exception MathArithmeticException if the direction norm is too small
+    /** Build a line from two points.
+     * @param p1 first point belonging to the line (this can be any point)
+     * @param p2 second point belonging to the line (this can be any point, 
different from p1)
+     * @exception MathIllegalArgumentException if the points are equal
      */
-    public Line(final Vector3D p, final Vector3D direction) {
-        reset(p, direction);
+    public Line(final Vector3D p1, final Vector3D p2) {
+        reset(p1, p2);
     }
 
     /** Copy constructor.
@@ -64,25 +65,26 @@ public class Line implements Embedding<E
         this.zero      = line.zero;
     }
 
-    /** Reset the instance as if built from a point and a normal.
-     * @param p point belonging to the line (this can be any point)
-     * @param dir direction of the line
-     * @exception MathArithmeticException if the direction norm is too small
-     */
-    public void reset(final Vector3D p, final Vector3D dir) {
-        final double norm = dir.getNorm();
-        if (norm == 0.0) {
-            throw new MathArithmeticException(LocalizedFormats.ZERO_NORM);
+    /** Reset the instance as if built from two points.
+     * @param p1 first point belonging to the line (this can be any point)
+     * @param p2 second point belonging to the line (this can be any point, 
different from p1)
+     * @exception MathIllegalArgumentException if the points are equal
+     */
+    public void reset(final Vector3D p1, final Vector3D p2) {
+        final Vector3D delta = p2.subtract(p1);
+        final double norm2 = delta.getNormSq();
+        if (norm2 == 0.0) {
+            throw new MathIllegalArgumentException(LocalizedFormats.ZERO_NORM);
         }
-        this.direction = new Vector3D(1.0 / norm, dir);
-        zero = new Vector3D(1.0, p, -p.dotProduct(this.direction), 
this.direction);
+        this.direction = new Vector3D(1.0 / FastMath.sqrt(norm2), delta);
+        zero = new Vector3D(1.0, p1, -p1.dotProduct(delta) / norm2, delta);
     }
 
     /** Get a line with reversed direction.
      * @return a new instance, with reversed direction
      */
     public Line revert() {
-        return new Line(zero, direction.negate());
+        return new Line(zero, zero.subtract(direction));
     }
 
     /** Get the normalized direction vector.
@@ -213,4 +215,11 @@ public class Line implements Embedding<E
         return line.contains(closest) ? closest : null;
     }
 
+    /** Build a sub-line covering the whole line.
+     * @return a sub-line covering the whole line
+     */
+    public SubLine wholeLine() {
+        return new SubLine(this, new IntervalsSet());
+    }
+
 }

Modified: 
commons/proper/math/trunk/src/main/java/org/apache/commons/math/geometry/euclidean/threed/Plane.java
URL: 
http://svn.apache.org/viewvc/commons/proper/math/trunk/src/main/java/org/apache/commons/math/geometry/euclidean/threed/Plane.java?rev=1159353&r1=1159352&r2=1159353&view=diff
==============================================================================
--- 
commons/proper/math/trunk/src/main/java/org/apache/commons/math/geometry/euclidean/threed/Plane.java
 (original)
+++ 
commons/proper/math/trunk/src/main/java/org/apache/commons/math/geometry/euclidean/threed/Plane.java
 Thu Aug 18 18:50:08 2011
@@ -323,8 +323,8 @@ public class Plane implements Hyperplane
         if (direction.getNorm() < 1.0e-10) {
             return null;
         }
-        return new Line(intersection(this, other, new Plane(direction)),
-                        direction);
+        final Vector3D point = intersection(this, other, new Plane(direction));
+        return new Line(point, point.add(direction));
     }
 
     /** Get the intersection point of three planes.

Added: 
commons/proper/math/trunk/src/main/java/org/apache/commons/math/geometry/euclidean/threed/Segment.java
URL: 
http://svn.apache.org/viewvc/commons/proper/math/trunk/src/main/java/org/apache/commons/math/geometry/euclidean/threed/Segment.java?rev=1159353&view=auto
==============================================================================
--- 
commons/proper/math/trunk/src/main/java/org/apache/commons/math/geometry/euclidean/threed/Segment.java
 (added)
+++ 
commons/proper/math/trunk/src/main/java/org/apache/commons/math/geometry/euclidean/threed/Segment.java
 Thu Aug 18 18:50:08 2011
@@ -0,0 +1,67 @@
+/*
+ * 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.math.geometry.euclidean.threed;
+
+
+/** Simple container for a two-points segment.
+ * @version $Id$
+ * @since 3.0
+ */
+public class Segment {
+
+    /** Start point of the segment. */
+    private final Vector3D start;
+
+    /** End point of the segments. */
+    private final Vector3D end;
+
+    /** Line containing the segment. */
+    private final Line     line;
+
+    /** Build a segment.
+     * @param start start point of the segment
+     * @param end end point of the segment
+     * @param line line containing the segment
+     */
+    public Segment(final Vector3D start, final Vector3D end, final Line line) {
+        this.start  = start;
+        this.end    = end;
+        this.line   = line;
+    }
+
+    /** Get the start point of the segment.
+     * @return start point of the segment
+     */
+    public Vector3D getStart() {
+        return start;
+    }
+
+    /** Get the end point of the segment.
+     * @return end point of the segment
+     */
+    public Vector3D getEnd() {
+        return end;
+    }
+
+    /** Get the line containing the segment.
+     * @return line containing the segment
+     */
+    public Line getLine() {
+        return line;
+    }
+
+}

Propchange: 
commons/proper/math/trunk/src/main/java/org/apache/commons/math/geometry/euclidean/threed/Segment.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
commons/proper/math/trunk/src/main/java/org/apache/commons/math/geometry/euclidean/threed/Segment.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Added: 
commons/proper/math/trunk/src/main/java/org/apache/commons/math/geometry/euclidean/threed/SubLine.java
URL: 
http://svn.apache.org/viewvc/commons/proper/math/trunk/src/main/java/org/apache/commons/math/geometry/euclidean/threed/SubLine.java?rev=1159353&view=auto
==============================================================================
--- 
commons/proper/math/trunk/src/main/java/org/apache/commons/math/geometry/euclidean/threed/SubLine.java
 (added)
+++ 
commons/proper/math/trunk/src/main/java/org/apache/commons/math/geometry/euclidean/threed/SubLine.java
 Thu Aug 18 18:50:08 2011
@@ -0,0 +1,137 @@
+/*
+ * 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.math.geometry.euclidean.threed;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.commons.math.geometry.euclidean.oned.Interval;
+import org.apache.commons.math.geometry.euclidean.oned.IntervalsSet;
+import org.apache.commons.math.geometry.euclidean.oned.Vector1D;
+import org.apache.commons.math.geometry.partitioning.Hyperplane;
+import org.apache.commons.math.geometry.partitioning.Region.Location;
+
+/** This class represents a subset of a {@link Line}.
+ * @version $Id$
+ * @since 3.0
+ */
+public class SubLine {
+
+    /** Underlying line. */
+    private final Line line;
+
+    /** Remaining region of the hyperplane. */
+    private final IntervalsSet remainingRegion;
+
+    /** Simple constructor.
+     * @param line underlying line
+     * @param remainingRegion remaining region of the line
+     */
+    public SubLine(final Line line, final IntervalsSet remainingRegion) {
+        this.line            = line;
+        this.remainingRegion = remainingRegion;
+    }
+
+    /** Create a sub-line from two endpoints.
+     * @param start start point
+     * @param end end point
+     */
+    public SubLine(final Vector3D start, final Vector3D end) {
+        this(new Line(start, end), buildIntervalSet(start, end));
+    }
+
+    /** Create a sub-line from a segment.
+     * @param segment single segment forming the sub-line
+     */
+    public SubLine(final Segment segment) {
+        this(segment.getLine(), buildIntervalSet(segment.getStart(), 
segment.getEnd()));
+    }
+
+    /** Get the endpoints of the sub-line.
+     * <p>
+     * A subline may be any arbitrary number of disjoints segments, so the 
endpoints
+     * are provided as a list of endpoint pairs. Each element of the list 
represents
+     * one segment, and each segment contains a start point at index 0 and an 
end point
+     * at index 1. If the sub-line is unbounded in the negative infinity 
direction,
+     * the start point of the first segment will have infinite coordinates. If 
the
+     * sub-line is unbounded in the positive infinity direction, the end point 
of the
+     * last segment will have infinite coordinates. So a sub-line covering the 
whole
+     * line will contain just one row and both elements of this row will have 
infinite
+     * coordinates. If the sub-line is empty, the returned list will contain 0 
segments.
+     * </p>
+     * @return list of segments endpoints
+     */
+    public List<Segment> getSegments() {
+
+        final List<Interval> list = remainingRegion.asList();
+        final List<Segment> segments = new ArrayList<Segment>();
+
+        for (final Interval interval : list) {
+            final Vector3D start = line.toSpace(new 
Vector1D(interval.getLower()));
+            final Vector3D end   = line.toSpace(new 
Vector1D(interval.getUpper()));
+            segments.add(new Segment(start, end, line));
+        }
+
+        return segments;
+
+    }
+
+    /** Get the intersection of the instance and another sub-line.
+     * <p>
+     * This method is related to the {@link Line#intersection(Hyperplane)
+     * intersection} method in the {@link Line Line} class, but in addition
+     * to compute the point along infinite lines, it also checks the point
+     * lies on both sub-line ranges.
+     * </p>
+     * @param subLine other sub-line which may intersect instance
+     * @param includeEndPoints if true, endpoints are considered to belong to
+     * instance (i.e. they are closed sets) and may be returned, otherwise 
endpoints
+     * are considered to not belong to instance (i.e. they are open sets) and 
intersection
+     * occurring on endpoints lead to null being returned
+     * @return the intersection point if there is one, null if the sub-lines 
don't intersect
+     */
+    public Vector3D intersection(final SubLine subLine, final boolean 
includeEndPoints) {
+
+        // compute the intersection on infinite line
+        Vector3D v1D = line.intersection(subLine.line);
+
+        // check location of point with respect to first sub-line
+        Location loc1 = remainingRegion.checkPoint(line.toSubSpace(v1D));
+
+        // check location of point with respect to second sub-line
+        Location loc2 = 
subLine.remainingRegion.checkPoint(subLine.line.toSubSpace(v1D));
+
+        if (includeEndPoints) {
+            return ((loc1 != Location.OUTSIDE) && (loc2 != Location.OUTSIDE)) 
? v1D : null;
+        } else {
+            return ((loc1 == Location.INSIDE) && (loc2 == Location.INSIDE)) ? 
v1D : null;
+        }
+
+    }
+
+    /** Build an interval set from two points.
+     * @param start start point
+     * @param end end point
+     * @return an interval set
+     */
+    private static IntervalsSet buildIntervalSet(final Vector3D start, final 
Vector3D end) {
+        final Line line = new Line(start, end);
+        return new IntervalsSet(line.toSubSpace(start).getX(),
+                                line.toSubSpace(end).getX());
+    }
+
+}

Propchange: 
commons/proper/math/trunk/src/main/java/org/apache/commons/math/geometry/euclidean/threed/SubLine.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
commons/proper/math/trunk/src/main/java/org/apache/commons/math/geometry/euclidean/threed/SubLine.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision

Modified: commons/proper/math/trunk/src/site/xdoc/changes.xml
URL: 
http://svn.apache.org/viewvc/commons/proper/math/trunk/src/site/xdoc/changes.xml?rev=1159353&r1=1159352&r2=1159353&view=diff
==============================================================================
--- commons/proper/math/trunk/src/site/xdoc/changes.xml (original)
+++ commons/proper/math/trunk/src/site/xdoc/changes.xml Thu Aug 18 18:50:08 2011
@@ -52,6 +52,9 @@ The <action> type attribute can be add,u
     If the output is not quite correct, check for invisible trailing spaces!
      -->
     <release version="3.0" date="TBD" description="TBD">
+      <action dev="luc" type="add" issue="MATH-593">
+         Added a 3D SubLine class.
+      </action>
       <action dev="erans" type="fix" issue="MATH-645">
          Fixed exceptions generated by "ebeMultiply" and "ebeDivide" in 
"OpenMapRealVector".
       </action>

Modified: 
commons/proper/math/trunk/src/test/java/org/apache/commons/math/geometry/euclidean/threed/LineTest.java
URL: 
http://svn.apache.org/viewvc/commons/proper/math/trunk/src/test/java/org/apache/commons/math/geometry/euclidean/threed/LineTest.java?rev=1159353&r1=1159352&r2=1159353&view=diff
==============================================================================
--- 
commons/proper/math/trunk/src/test/java/org/apache/commons/math/geometry/euclidean/threed/LineTest.java
 (original)
+++ 
commons/proper/math/trunk/src/test/java/org/apache/commons/math/geometry/euclidean/threed/LineTest.java
 Thu Aug 18 18:50:08 2011
@@ -27,7 +27,7 @@ public class LineTest {
     @Test
     public void testContains() {
         Vector3D p1 = new Vector3D(0, 0, 1);
-        Line l = new Line(p1, new Vector3D(0, 0, 1));
+        Line l = new Line(p1, new Vector3D(0, 0, 2));
         Assert.assertTrue(l.contains(p1));
         Assert.assertTrue(l.contains(new Vector3D(1.0, p1, 0.3, 
l.getDirection())));
         Vector3D u = l.getDirection().orthogonal();
@@ -42,89 +42,89 @@ public class LineTest {
     public void testSimilar() {
         Vector3D p1  = new Vector3D (1.2, 3.4, -5.8);
         Vector3D p2  = new Vector3D (3.4, -5.8, 1.2);
-        Line     lA  = new Line(p1, p2.subtract(p1));
-        Line     lB  = new Line(p2, p1.subtract(p2));
+        Line     lA  = new Line(p1, p2);
+        Line     lB  = new Line(p2, p1);
         Assert.assertTrue(lA.isSimilarTo(lB));
-        Assert.assertTrue(! lA.isSimilarTo(new Line(p1, 
lA.getDirection().orthogonal())));
+        Assert.assertTrue(! lA.isSimilarTo(new Line(p1, 
p1.add(lA.getDirection().orthogonal()))));
     }
 
     @Test
     public void testPointDistance() {
-        Line l = new Line(new Vector3D(0, 1, 1), new Vector3D(0, 1, 1));
+        Line l = new Line(new Vector3D(0, 1, 1), new Vector3D(0, 2, 2));
         Assert.assertEquals(FastMath.sqrt(3.0 / 2.0), l.distance(new 
Vector3D(1, 0, 1)), 1.0e-10);
         Assert.assertEquals(0, l.distance(new Vector3D(0, -4, -4)), 1.0e-10);
     }
 
     @Test
     public void testLineDistance() {
-        Line l = new Line(new Vector3D(0, 1, 1), new Vector3D(0, 1, 1));
+        Line l = new Line(new Vector3D(0, 1, 1), new Vector3D(0, 2, 2));
         Assert.assertEquals(1.0,
-                            l.distance(new Line(new Vector3D(1, 0, 1), 
Vector3D.PLUS_K)),
+                            l.distance(new Line(new Vector3D(1, 0, 1), new 
Vector3D(1, 0, 2))),
                             1.0e-10);
         Assert.assertEquals(0.5,
-                            l.distance(new Line(new Vector3D(-0.5, 0, 0), new 
Vector3D(0, -1, -1))),
+                            l.distance(new Line(new Vector3D(-0.5, 0, 0), new 
Vector3D(-0.5, -1, -1))),
                             1.0e-10);
         Assert.assertEquals(0.0,
                             l.distance(l),
                             1.0e-10);
         Assert.assertEquals(0.0,
-                            l.distance(new Line(new Vector3D(0, -4, -4), new 
Vector3D(0, -1, -1))),
+                            l.distance(new Line(new Vector3D(0, -4, -4), new 
Vector3D(0, -5, -5))),
                             1.0e-10);
         Assert.assertEquals(0.0,
-                            l.distance(new Line(new Vector3D(0, -4, -4), new 
Vector3D(0, 1, 0))),
+                            l.distance(new Line(new Vector3D(0, -4, -4), new 
Vector3D(0, -3, -4))),
                             1.0e-10);
         Assert.assertEquals(0.0,
-                            l.distance(new Line(new Vector3D(0, -4, -4), new 
Vector3D(1, 0, 0))),
+                            l.distance(new Line(new Vector3D(0, -4, -4), new 
Vector3D(1, -4, -4))),
                             1.0e-10);
         Assert.assertEquals(FastMath.sqrt(8),
-                            l.distance(new Line(new Vector3D(0, -4, 0), new 
Vector3D(1, 0, 0))),
+                            l.distance(new Line(new Vector3D(0, -4, 0), new 
Vector3D(1, -4, 0))),
                             1.0e-10);
     }
 
     @Test
     public void testClosest() {
-        Line l = new Line(new Vector3D(0, 1, 1), new Vector3D(0, 1, 1));
+        Line l = new Line(new Vector3D(0, 1, 1), new Vector3D(0, 2, 2));
         Assert.assertEquals(0.0,
-                            l.closestPoint(new Line(new Vector3D(1, 0, 1), 
Vector3D.PLUS_K)).distance(new Vector3D(0, 0, 0)),
+                            l.closestPoint(new Line(new Vector3D(1, 0, 1), new 
Vector3D(1, 0, 2))).distance(new Vector3D(0, 0, 0)),
                             1.0e-10);
         Assert.assertEquals(0.5,
-                            l.closestPoint(new Line(new Vector3D(-0.5, 0, 0), 
new Vector3D(0, -1, -1))).distance(new Vector3D(-0.5, 0, 0)),
+                            l.closestPoint(new Line(new Vector3D(-0.5, 0, 0), 
new Vector3D(-0.5, -1, -1))).distance(new Vector3D(-0.5, 0, 0)),
                             1.0e-10);
         Assert.assertEquals(0.0,
                             l.closestPoint(l).distance(new Vector3D(0, 0, 0)),
                             1.0e-10);
         Assert.assertEquals(0.0,
-                            l.closestPoint(new Line(new Vector3D(0, -4, -4), 
new Vector3D(0, -1, -1))).distance(new Vector3D(0, 0, 0)),
+                            l.closestPoint(new Line(new Vector3D(0, -4, -4), 
new Vector3D(0, -5, -5))).distance(new Vector3D(0, 0, 0)),
                             1.0e-10);
         Assert.assertEquals(0.0,
-                            l.closestPoint(new Line(new Vector3D(0, -4, -4), 
new Vector3D(0, 1, 0))).distance(new Vector3D(0, -4, -4)),
+                            l.closestPoint(new Line(new Vector3D(0, -4, -4), 
new Vector3D(0, -3, -4))).distance(new Vector3D(0, -4, -4)),
                             1.0e-10);
         Assert.assertEquals(0.0,
-                            l.closestPoint(new Line(new Vector3D(0, -4, -4), 
new Vector3D(1, 0, 0))).distance(new Vector3D(0, -4, -4)),
+                            l.closestPoint(new Line(new Vector3D(0, -4, -4), 
new Vector3D(1, -4, -4))).distance(new Vector3D(0, -4, -4)),
                             1.0e-10);
         Assert.assertEquals(0.0,
-                            l.closestPoint(new Line(new Vector3D(0, -4, 0), 
new Vector3D(1, 0, 0))).distance(new Vector3D(0, -2, -2)),
+                            l.closestPoint(new Line(new Vector3D(0, -4, 0), 
new Vector3D(1, -4, 0))).distance(new Vector3D(0, -2, -2)),
                             1.0e-10);
     }
 
     @Test
     public void testIntersection() {
-        Line l = new Line(new Vector3D(0, 1, 1), new Vector3D(0, 1, 1));
-        Assert.assertNull(l.intersection(new Line(new Vector3D(1, 0, 1), 
Vector3D.PLUS_K)));
-        Assert.assertNull(l.intersection(new Line(new Vector3D(-0.5, 0, 0), 
new Vector3D(0, -1, -1))));
+        Line l = new Line(new Vector3D(0, 1, 1), new Vector3D(0, 2, 2));
+        Assert.assertNull(l.intersection(new Line(new Vector3D(1, 0, 1), new 
Vector3D(1, 0, 2))));
+        Assert.assertNull(l.intersection(new Line(new Vector3D(-0.5, 0, 0), 
new Vector3D(-0.5, -1, -1))));
         Assert.assertEquals(0.0,
                             l.intersection(l).distance(new Vector3D(0, 0, 0)),
                             1.0e-10);
         Assert.assertEquals(0.0,
-                            l.intersection(new Line(new Vector3D(0, -4, -4), 
new Vector3D(0, -1, -1))).distance(new Vector3D(0, 0, 0)),
+                            l.intersection(new Line(new Vector3D(0, -4, -4), 
new Vector3D(0, -5, -5))).distance(new Vector3D(0, 0, 0)),
                             1.0e-10);
         Assert.assertEquals(0.0,
-                            l.intersection(new Line(new Vector3D(0, -4, -4), 
new Vector3D(0, 1, 0))).distance(new Vector3D(0, -4, -4)),
+                            l.intersection(new Line(new Vector3D(0, -4, -4), 
new Vector3D(0, -3, -4))).distance(new Vector3D(0, -4, -4)),
                             1.0e-10);
         Assert.assertEquals(0.0,
-                            l.intersection(new Line(new Vector3D(0, -4, -4), 
new Vector3D(1, 0, 0))).distance(new Vector3D(0, -4, -4)),
+                            l.intersection(new Line(new Vector3D(0, -4, -4), 
new Vector3D(1, -4, -4))).distance(new Vector3D(0, -4, -4)),
                             1.0e-10);
-        Assert.assertNull(l.intersection(new Line(new Vector3D(0, -4, 0), new 
Vector3D(1, 0, 0))));
+        Assert.assertNull(l.intersection(new Line(new Vector3D(0, -4, 0), new 
Vector3D(1, -4, 0))));
     }
 
 }

Modified: 
commons/proper/math/trunk/src/test/java/org/apache/commons/math/geometry/euclidean/threed/PlaneTest.java
URL: 
http://svn.apache.org/viewvc/commons/proper/math/trunk/src/test/java/org/apache/commons/math/geometry/euclidean/threed/PlaneTest.java?rev=1159353&r1=1159352&r2=1159353&view=diff
==============================================================================
--- 
commons/proper/math/trunk/src/test/java/org/apache/commons/math/geometry/euclidean/threed/PlaneTest.java
 (original)
+++ 
commons/proper/math/trunk/src/test/java/org/apache/commons/math/geometry/euclidean/threed/PlaneTest.java
 Thu Aug 18 18:50:08 2011
@@ -116,12 +116,12 @@ public class PlaneTest {
     @Test
     public void testIntersection() {
         Plane p = new Plane(new Vector3D(1, 2, 3), new Vector3D(-4, 1, -5));
-        Line  l = new Line(new Vector3D(0.2, -3.5, 0.7), new Vector3D(1, 1, 
-1));
+        Line  l = new Line(new Vector3D(0.2, -3.5, 0.7), new Vector3D(1.2, 
-2.5, -0.3));
         Vector3D point = p.intersection(l);
         Assert.assertTrue(p.contains(point));
         Assert.assertTrue(l.contains(point));
         Assert.assertNull(p.intersection(new Line(new Vector3D(10, 10, 10),
-                                                  
p.getNormal().orthogonal())));
+                                                  new Vector3D(10, 10, 
10).add(p.getNormal().orthogonal()))));
     }
 
     @Test

Added: 
commons/proper/math/trunk/src/test/java/org/apache/commons/math/geometry/euclidean/threed/SubLineTest.java
URL: 
http://svn.apache.org/viewvc/commons/proper/math/trunk/src/test/java/org/apache/commons/math/geometry/euclidean/threed/SubLineTest.java?rev=1159353&view=auto
==============================================================================
--- 
commons/proper/math/trunk/src/test/java/org/apache/commons/math/geometry/euclidean/threed/SubLineTest.java
 (added)
+++ 
commons/proper/math/trunk/src/test/java/org/apache/commons/math/geometry/euclidean/threed/SubLineTest.java
 Thu Aug 18 18:50:08 2011
@@ -0,0 +1,155 @@
+/*
+ * 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.math.geometry.euclidean.threed;
+
+import java.util.List;
+
+import org.apache.commons.math.geometry.euclidean.oned.Euclidean1D;
+import org.apache.commons.math.geometry.euclidean.oned.IntervalsSet;
+import org.apache.commons.math.geometry.partitioning.RegionFactory;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class SubLineTest {
+
+    @Test
+    public void testEndPoints() {
+        Vector3D p1 = new Vector3D(-1, -7, 2);
+        Vector3D p2 = new Vector3D(7, -1, 0);
+        Segment segment = new Segment(p1, p2, new Line(p1, p2));
+        SubLine sub = new SubLine(segment);
+        List<Segment> segments = sub.getSegments();
+        Assert.assertEquals(1, segments.size());
+        Assert.assertEquals(0.0, new Vector3D(-1, -7, 
2).distance(segments.get(0).getStart()), 1.0e-10);
+        Assert.assertEquals(0.0, new Vector3D( 7, -1, 
0).distance(segments.get(0).getEnd()), 1.0e-10);
+    }
+
+    @Test
+    public void testNoEndPoints() {
+        SubLine wholeLine = new Line(new Vector3D(-1, 7, 2), new Vector3D(7, 
1, 0)).wholeLine();
+        List<Segment> segments = wholeLine.getSegments();
+        Assert.assertEquals(1, segments.size());
+        Assert.assertTrue(Double.isInfinite(segments.get(0).getStart().getX()) 
&&
+                          segments.get(0).getStart().getX() < 0);
+        Assert.assertTrue(Double.isInfinite(segments.get(0).getStart().getY()) 
&&
+                          segments.get(0).getStart().getY() > 0);
+        Assert.assertTrue(Double.isInfinite(segments.get(0).getStart().getZ()) 
&&
+                          segments.get(0).getStart().getZ() > 0);
+        Assert.assertTrue(Double.isInfinite(segments.get(0).getEnd().getX()) &&
+                          segments.get(0).getEnd().getX() > 0);
+        Assert.assertTrue(Double.isInfinite(segments.get(0).getEnd().getY()) &&
+                          segments.get(0).getEnd().getY() < 0);
+        Assert.assertTrue(Double.isInfinite(segments.get(0).getEnd().getZ()) &&
+                          segments.get(0).getEnd().getZ() < 0);
+    }
+
+    @Test
+    public void testNoSegments() {
+        SubLine empty = new SubLine(new Line(new Vector3D(-1, -7, 2), new 
Vector3D(7, -1, 0)),
+                                    (IntervalsSet) new 
RegionFactory<Euclidean1D>().getComplement(new IntervalsSet()));
+        List<Segment> segments = empty.getSegments();
+        Assert.assertEquals(0, segments.size());
+    }
+
+    @Test
+    public void testSeveralSegments() {
+        SubLine twoSubs = new SubLine(new Line(new Vector3D(-1, -7, 2), new 
Vector3D(7, -1, 0)),
+                                      (IntervalsSet) new 
RegionFactory<Euclidean1D>().union(new IntervalsSet(1, 2),
+                                                                               
             new IntervalsSet(3, 4)));
+        List<Segment> segments = twoSubs.getSegments();
+        Assert.assertEquals(2, segments.size());
+    }
+
+    @Test
+    public void testHalfInfiniteNeg() {
+        SubLine empty = new SubLine(new Line(new Vector3D(-1, -7, 2), new 
Vector3D(7, -1, -2)),
+                                    new IntervalsSet(Double.NEGATIVE_INFINITY, 
0.0));
+        List<Segment> segments = empty.getSegments();
+        Assert.assertEquals(1, segments.size());
+        Assert.assertTrue(Double.isInfinite(segments.get(0).getStart().getX()) 
&&
+                          segments.get(0).getStart().getX() < 0);
+        Assert.assertTrue(Double.isInfinite(segments.get(0).getStart().getY()) 
&&
+                          segments.get(0).getStart().getY() < 0);
+        Assert.assertTrue(Double.isInfinite(segments.get(0).getStart().getZ()) 
&&
+                          segments.get(0).getStart().getZ() > 0);
+        Assert.assertEquals(0.0, new Vector3D(3, -4, 
0).distance(segments.get(0).getEnd()), 1.0e-10);
+    }
+
+    @Test
+    public void testHalfInfinitePos() {
+        SubLine empty = new SubLine(new Line(new Vector3D(-1, -7, 2), new 
Vector3D(7, -1, -2)),
+                                    new IntervalsSet(0.0, 
Double.POSITIVE_INFINITY));
+        List<Segment> segments = empty.getSegments();
+        Assert.assertEquals(1, segments.size());
+        Assert.assertEquals(0.0, new Vector3D(3, -4, 
0).distance(segments.get(0).getStart()), 1.0e-10);
+        Assert.assertTrue(Double.isInfinite(segments.get(0).getEnd().getX()) &&
+                          segments.get(0).getEnd().getX() > 0);
+        Assert.assertTrue(Double.isInfinite(segments.get(0).getEnd().getY()) &&
+                          segments.get(0).getEnd().getY() > 0);
+        Assert.assertTrue(Double.isInfinite(segments.get(0).getEnd().getZ()) &&
+                          segments.get(0).getEnd().getZ() < 0);
+    }
+
+    @Test
+    public void testIntersectionInsideInside() {
+        SubLine sub1 = new SubLine(new Vector3D(1, 1, 1), new Vector3D(3, 1, 
1));
+        SubLine sub2 = new SubLine(new Vector3D(2, 0, 0), new Vector3D(2, 2, 
2));
+        Assert.assertEquals(0.0, new Vector3D(2, 1, 
1).distance(sub1.intersection(sub2, true)),  1.0e-12);
+        Assert.assertEquals(0.0, new Vector3D(2, 1, 
1).distance(sub1.intersection(sub2, false)), 1.0e-12);
+    }
+
+    @Test
+    public void testIntersectionInsideBoundary() {
+        SubLine sub1 = new SubLine(new Vector3D(1, 1, 1), new Vector3D(3, 1, 
1));
+        SubLine sub2 = new SubLine(new Vector3D(2, 0, 0), new Vector3D(2, 1, 
1));
+        Assert.assertEquals(0.0, new Vector3D(2, 1, 
1).distance(sub1.intersection(sub2, true)),  1.0e-12);
+        Assert.assertNull(sub1.intersection(sub2, false));
+    }
+
+    @Test
+    public void testIntersectionInsideOutside() {
+        SubLine sub1 = new SubLine(new Vector3D(1, 1, 1), new Vector3D(3, 1, 
1));
+        SubLine sub2 = new SubLine(new Vector3D(2, 0, 0), new Vector3D(2, 0.5, 
0.5));
+        Assert.assertNull(sub1.intersection(sub2, true));
+        Assert.assertNull(sub1.intersection(sub2, false));
+    }
+
+    @Test
+    public void testIntersectionBoundaryBoundary() {
+        SubLine sub1 = new SubLine(new Vector3D(1, 1, 1), new Vector3D(2, 1, 
1));
+        SubLine sub2 = new SubLine(new Vector3D(2, 0, 0), new Vector3D(2, 1, 
1));
+        Assert.assertEquals(0.0, new Vector3D(2, 1, 
1).distance(sub1.intersection(sub2, true)),  1.0e-12);
+        Assert.assertNull(sub1.intersection(sub2, false));
+    }
+
+    @Test
+    public void testIntersectionBoundaryOutside() {
+        SubLine sub1 = new SubLine(new Vector3D(1, 1, 1), new Vector3D(2, 1, 
1));
+        SubLine sub2 = new SubLine(new Vector3D(2, 0, 0), new Vector3D(2, 0.5, 
0.5));
+        Assert.assertNull(sub1.intersection(sub2, true));
+        Assert.assertNull(sub1.intersection(sub2, false));
+    }
+
+    @Test
+    public void testIntersectionOutsideOutside() {
+        SubLine sub1 = new SubLine(new Vector3D(1, 1, 1), new Vector3D(1.5, 1, 
1));
+        SubLine sub2 = new SubLine(new Vector3D(2, 0, 0), new Vector3D(2, 0.5, 
0.5));
+        Assert.assertNull(sub1.intersection(sub2, true));
+        Assert.assertNull(sub1.intersection(sub2, false));
+    }
+
+}

Propchange: 
commons/proper/math/trunk/src/test/java/org/apache/commons/math/geometry/euclidean/threed/SubLineTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
commons/proper/math/trunk/src/test/java/org/apache/commons/math/geometry/euclidean/threed/SubLineTest.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision


Reply via email to