Author: luc
Date: Mon Aug 15 18:20:08 2011
New Revision: 1157932

URL: http://svn.apache.org/viewvc?rev=1157932&view=rev
Log:
clean up code, mainly replacing static dotProduct methods calls by non-static 
ones

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/OutlineExtractor.java
    
commons/proper/math/trunk/src/main/java/org/apache/commons/math/geometry/euclidean/threed/Plane.java
    
commons/proper/math/trunk/src/main/java/org/apache/commons/math/geometry/euclidean/threed/PolyhedronsSet.java
    
commons/proper/math/trunk/src/main/java/org/apache/commons/math/geometry/euclidean/threed/SubPlane.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=1157932&r1=1157931&r2=1157932&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
 Mon Aug 15 18:20:08 2011
@@ -16,11 +16,14 @@
  */
 package org.apache.commons.math.geometry.euclidean.threed;
 
+import org.apache.commons.math.exception.MathArithmeticException;
+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.Vector1D;
 import org.apache.commons.math.geometry.partitioning.Embedding;
 import org.apache.commons.math.util.FastMath;
+import org.apache.commons.math.util.MathUtils;
 
 /** The class represent lines in a three dimensional space.
 
@@ -45,24 +48,34 @@ public class Line implements Embedding<E
     /** 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 IllegalArgumentException if the direction norm is too small
+     * @exception MathArithmeticException if the direction norm is too small
      */
     public Line(final Vector3D p, final Vector3D direction) {
         reset(p, direction);
     }
 
+    /** Copy constructor.
+     * <p>The created instance is completely independent from the
+     * original instance, it is a deep copy.</p>
+     * @param line line to copy
+     */
+    public Line(final Line line) {
+        this.direction = line.direction;
+        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 IllegalArgumentException if the direction norm is too small
+     * @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 IllegalArgumentException("null norm");
+            throw new MathArithmeticException(LocalizedFormats.ZERO_NORM);
         }
         this.direction = new Vector3D(1.0 / norm, dir);
-        zero = new Vector3D(1.0, p, -Vector3D.dotProduct(p, this.direction), 
this.direction);
+        zero = new Vector3D(1.0, p, -p.dotProduct(this.direction), 
this.direction);
     }
 
     /** Get a line with reversed direction.
@@ -90,25 +103,33 @@ public class Line implements Embedding<E
      * <p>The abscissa is 0 if the projection of the point and the
      * projection of the frame origin on the line are the same
      * point.</p>
-     * @param point point to check (must be a {@link Vector3D Vector3D}
-     * instance)
-     * @return abscissa of the point (really a
-     * {org.apache.commons.math.geometry.euclidean.oned.Vector1D Vector1D} 
instance)
+     * @param point point to check
+     * @return abscissa of the point
      */
-    public Vector1D toSubSpace(final Vector<Euclidean3D> point) {
-        Vector3D p3 = (Vector3D) point;
-        return new Vector1D(Vector3D.dotProduct(p3.subtract(zero), direction));
+    public double getAbscissa(final Vector3D point) {
+        return point.subtract(zero).dotProduct(direction);
     }
 
     /** Get one point from the line.
-     * @param point desired abscissa for the point (must be a
-     * {org.apache.commons.math.geometry.euclidean.oned.Vector1D Vector1D} 
instance)
+     * @param point desired abscissa for the point
      * @return one point belonging to the line, at specified abscissa
-     * (really a {@link Vector3D Vector3D} instance)
+     */
+    public Vector3D pointAt(final double abscissa) {
+        return new Vector3D(1.0, zero, abscissa, direction);
+    }
+
+    /** {@inheritDoc}
+     * @see #getAbscissa(Vector3D)
+     */
+    public Vector1D toSubSpace(final Vector<Euclidean3D> point) {
+        return new Vector1D(getAbscissa((Vector3D) point));
+    }
+
+    /** {@inheritDoc}
+     * @see #pointAt(double)
      */
     public Vector3D toSpace(final Vector<Euclidean1D> point) {
-        Vector1D p1 = (Vector1D) point;
-        return new Vector3D(1.0, zero, p1.getX(), direction);
+        return pointAt(((Vector1D) point).getX());
     }
 
     /** Check if the instance is similar to another line.
@@ -137,28 +158,59 @@ public class Line implements Embedding<E
      */
     public double distance(final Vector3D p) {
         final Vector3D d = p.subtract(zero);
-        final Vector3D n = new Vector3D(1.0, d, -Vector3D.dotProduct(d, 
direction), direction);
+        final Vector3D n = new Vector3D(1.0, d, -d.dotProduct(direction), 
direction);
         return n.getNorm();
     }
 
     /** Compute the shortest distance between the instance and another line.
-     * @param line line to check agains the instance
+     * @param line line to check against the instance
      * @return shortest distance between the instance and the line
      */
     public double distance(final Line line) {
 
         final Vector3D normal = Vector3D.crossProduct(direction, 
line.direction);
-        if (normal.getNorm() < 1.0e-10) {
+        final double n = normal.getNorm();
+        if (n < MathUtils.SAFE_MIN) {
             // lines are parallel
             return distance(line.zero);
         }
 
-        // separating middle plane
-        final Plane middle = new Plane(new Vector3D(0.5, zero, 0.5, 
line.zero), normal);
+        // signed separation of the two parallel planes that contains the lines
+        final double offset = line.zero.subtract(zero).dotProduct(normal) / n;
 
-        // the lines are at the same distance on either side of the plane
-        return 2 * FastMath.abs(middle.getOffset(zero));
+        return FastMath.abs(offset);
 
     }
 
+    /** Compute the point of the instance closest to another line.
+     * @param line line to check against the instance
+     * @return point of the instance closest to another line
+     */
+    public Vector3D closestPoint(final Line line) {
+
+        final double cos = direction.dotProduct(line.direction);
+        final double n = 1 - cos * cos;
+        if (n < MathUtils.EPSILON) {
+            // the lines are parallel
+            return zero;
+        }
+
+        final Vector3D delta0 = line.zero.subtract(zero);
+        final double a        = delta0.dotProduct(direction);
+        final double b        = delta0.dotProduct(line.direction);
+
+        return new Vector3D(1, zero, (a - b * cos) / n, direction);
+
+    }
+
+    /** Get the intersection point of the instance and another line.
+     * @param line other line
+     * @return intersection point of the instance and the other line
+     * or null if there are no intersection points
+     */
+    public Vector3D intersection(final Line line) {
+        final Vector3D closest = closestPoint(line);
+        return line.contains(closest) ? closest : null;
+    }
+
 }

Modified: 
commons/proper/math/trunk/src/main/java/org/apache/commons/math/geometry/euclidean/threed/OutlineExtractor.java
URL: 
http://svn.apache.org/viewvc/commons/proper/math/trunk/src/main/java/org/apache/commons/math/geometry/euclidean/threed/OutlineExtractor.java?rev=1157932&r1=1157931&r2=1157932&view=diff
==============================================================================
--- 
commons/proper/math/trunk/src/main/java/org/apache/commons/math/geometry/euclidean/threed/OutlineExtractor.java
 (original)
+++ 
commons/proper/math/trunk/src/main/java/org/apache/commons/math/geometry/euclidean/threed/OutlineExtractor.java
 Mon Aug 15 18:20:08 2011
@@ -164,7 +164,7 @@ public class OutlineExtractor {
                 (AbstractSubHyperplane<Euclidean3D, Euclidean2D>) facet;
             final Plane plane    = (Plane) facet.getHyperplane();
 
-            final double scal = Vector3D.dotProduct(plane.getNormal(), w);
+            final double scal = plane.getNormal().dotProduct(w);
             if (FastMath.abs(scal) > 1.0e-3) {
                 Vector2D[][] vertices =
                     ((PolygonsSet) 
absFacet.getRemainingRegion()).getVertices();
@@ -201,13 +201,13 @@ public class OutlineExtractor {
                     int previous         = closed ? (loop.length - 1) : 1;
                     Vector3D previous3D  = (Vector3D) 
plane.toSpace(loop[previous]);
                     int current          = (previous + 1) % loop.length;
-                    Vector2D pPoint       = new 
Vector2D(Vector3D.dotProduct(previous3D, u),
-                                                       
Vector3D.dotProduct(previous3D, v));
+                    Vector2D pPoint       = new 
Vector2D(previous3D.dotProduct(u),
+                                                         
previous3D.dotProduct(v));
                     while (current < loop.length) {
 
                         final Vector3D current3D = (Vector3D) 
plane.toSpace(loop[current]);
-                        final Vector2D  cPoint    = new 
Vector2D(Vector3D.dotProduct(current3D, u),
-                                                               
Vector3D.dotProduct(current3D, v));
+                        final Vector2D  cPoint    = new 
Vector2D(current3D.dotProduct(u),
+                                                                 
current3D.dotProduct(v));
                         final 
org.apache.commons.math.geometry.euclidean.twod.Line line =
                             new 
org.apache.commons.math.geometry.euclidean.twod.Line(pPoint, cPoint);
                         SubHyperplane<Euclidean2D> edge = 
line.wholeHyperplane();

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=1157932&r1=1157931&r2=1157932&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
 Mon Aug 15 18:20:08 2011
@@ -16,6 +16,8 @@
  */
 package org.apache.commons.math.geometry.euclidean.threed;
 
+import org.apache.commons.math.exception.MathArithmeticException;
+import org.apache.commons.math.exception.util.LocalizedFormats;
 import org.apache.commons.math.geometry.Vector;
 import org.apache.commons.math.geometry.euclidean.oned.Vector1D;
 import org.apache.commons.math.geometry.euclidean.twod.Euclidean2D;
@@ -48,7 +50,7 @@ public class Plane implements Hyperplane
 
     /** Build a plane normal to a given direction and containing the origin.
      * @param normal normal direction to the plane
-     * @exception IllegalArgumentException if the normal norm is too small
+     * @exception MathArithmeticException if the normal norm is too small
      */
     public Plane(final Vector3D normal) {
         setNormal(normal);
@@ -59,11 +61,11 @@ public class Plane implements Hyperplane
     /** Build a plane from a point and a normal.
      * @param p point belonging to the plane
      * @param normal normal direction to the plane
-     * @exception IllegalArgumentException if the normal norm is too small
+     * @exception MathArithmeticException if the normal norm is too small
      */
     public Plane(final Vector3D p, final Vector3D normal) {
         setNormal(normal);
-        originOffset = -Vector3D.dotProduct(p, w);
+        originOffset = -p.dotProduct(w);
         setFrame();
     }
 
@@ -73,10 +75,10 @@ public class Plane implements Hyperplane
      * @param p1 first point belonging to the plane
      * @param p2 second point belonging to the plane
      * @param p3 third point belonging to the plane
-     * @exception IllegalArgumentException if the points do not constitute a 
plane
+     * @exception MathArithmeticException if the points do not constitute a 
plane
      */
     public Plane(final Vector3D p1, final Vector3D p2, final Vector3D p3) {
-        this(p1, Vector3D.crossProduct(p2.subtract(p1), p3.subtract(p1)));
+        this(p1, p2.subtract(p1).crossProduct(p3.subtract(p1)));
     }
 
     /** Copy constructor.
@@ -109,7 +111,7 @@ public class Plane implements Hyperplane
      */
     public void reset(final Vector3D p, final Vector3D normal) {
         setNormal(normal);
-        originOffset = -Vector3D.dotProduct(p, w);
+        originOffset = -p.dotProduct(w);
         setFrame();
     }
 
@@ -129,12 +131,12 @@ public class Plane implements Hyperplane
 
     /** Set the normal vactor.
      * @param normal normal direction to the plane (will be copied)
-     * @exception IllegalArgumentException if the normal norm is too small
+     * @exception MathArithmeticException if the normal norm is too small
      */
     private void setNormal(final Vector3D normal) {
         final double norm = normal.getNorm();
         if (norm < 1.0e-10) {
-            throw new IllegalArgumentException("null norm");
+            throw new MathArithmeticException(LocalizedFormats.ZERO_NORM);
         }
         w = new Vector3D(1.0 / norm, normal);
     }
@@ -220,9 +222,7 @@ public class Plane implements Hyperplane
      * @see #toSpace
      */
     public Vector2D toSubSpace(final Vector<Euclidean3D> point) {
-        final Vector3D p3D = (Vector3D) point;
-        return new Vector2D(Vector3D.dotProduct(p3D, u),
-                           Vector3D.dotProduct(p3D, v));
+        return new Vector2D(point.dotProduct(u), point.dotProduct(v));
     }
 
     /** Transform an in-plane point into a 3D space point.
@@ -304,12 +304,12 @@ public class Plane implements Hyperplane
      */
     public Vector3D intersection(final Line line) {
         final Vector3D direction = line.getDirection();
-        final double   dot       = Vector3D.dotProduct(w, direction);
+        final double   dot       = w.dotProduct(direction);
         if (FastMath.abs(dot) < 1.0e-10) {
             return null;
         }
         final Vector3D point = (Vector3D) line.toSpace(Vector1D.ZERO);
-        final double   k     = -(originOffset + Vector3D.dotProduct(w, point)) 
/ dot;
+        final double   k     = -(originOffset + w.dotProduct(point)) / dot;
         return new Vector3D(1.0, point, k, direction);
     }
 
@@ -415,7 +415,7 @@ public class Plane implements Hyperplane
      * @return offset of the point
      */
     public double getOffset(final Vector<Euclidean3D> point) {
-        return Vector3D.dotProduct((Vector3D) point, w) + originOffset;
+        return point.dotProduct(w) + originOffset;
     }
 
     /** Check if the instance has the same orientation as another hyperplane.
@@ -424,7 +424,7 @@ public class Plane implements Hyperplane
      * the same orientation
      */
     public boolean sameOrientationAs(final Hyperplane<Euclidean3D> other) {
-        return Vector3D.dotProduct(((Plane) other).w, w) > 0.0;
+        return (((Plane) other).w).dotProduct(w) > 0.0;
     }
 
 }

Modified: 
commons/proper/math/trunk/src/main/java/org/apache/commons/math/geometry/euclidean/threed/PolyhedronsSet.java
URL: 
http://svn.apache.org/viewvc/commons/proper/math/trunk/src/main/java/org/apache/commons/math/geometry/euclidean/threed/PolyhedronsSet.java?rev=1157932&r1=1157931&r2=1157932&view=diff
==============================================================================
--- 
commons/proper/math/trunk/src/main/java/org/apache/commons/math/geometry/euclidean/threed/PolyhedronsSet.java
 (original)
+++ 
commons/proper/math/trunk/src/main/java/org/apache/commons/math/geometry/euclidean/threed/PolyhedronsSet.java
 Mon Aug 15 18:20:08 2011
@@ -175,7 +175,7 @@ public class PolyhedronsSet extends Abst
 
                 final Plane    plane  = (Plane) facet.getHyperplane();
                 final Vector3D facetB = plane.toSpace(polygon.getBarycenter());
-                double   scaled = area * Vector3D.dotProduct(facetB, 
plane.getNormal());
+                double   scaled = area * facetB.dotProduct(plane.getNormal());
                 if (reversed) {
                     scaled = -scaled;
                 }

Modified: 
commons/proper/math/trunk/src/main/java/org/apache/commons/math/geometry/euclidean/threed/SubPlane.java
URL: 
http://svn.apache.org/viewvc/commons/proper/math/trunk/src/main/java/org/apache/commons/math/geometry/euclidean/threed/SubPlane.java?rev=1157932&r1=1157931&r2=1157932&view=diff
==============================================================================
--- 
commons/proper/math/trunk/src/main/java/org/apache/commons/math/geometry/euclidean/threed/SubPlane.java
 (original)
+++ 
commons/proper/math/trunk/src/main/java/org/apache/commons/math/geometry/euclidean/threed/SubPlane.java
 Mon Aug 15 18:20:08 2011
@@ -72,7 +72,7 @@ public class SubPlane extends AbstractSu
         Vector2D p = thisPlane.toSubSpace(inter.toSpace(Vector1D.ZERO));
         Vector2D q = thisPlane.toSubSpace(inter.toSpace(Vector1D.ONE));
         Vector3D crossP = Vector3D.crossProduct(inter.getDirection(), 
thisPlane.getNormal());
-        if (Vector3D.dotProduct(crossP, otherPlane.getNormal()) < 0) {
+        if (crossP.dotProduct(otherPlane.getNormal()) < 0) {
             final Vector2D tmp = p;
             p           = q;
             q           = tmp;
@@ -109,7 +109,7 @@ public class SubPlane extends AbstractSu
         Vector2D p = thisPlane.toSubSpace(inter.toSpace(Vector1D.ZERO));
         Vector2D q = thisPlane.toSubSpace(inter.toSpace(Vector1D.ONE));
         Vector3D crossP = Vector3D.crossProduct(inter.getDirection(), 
thisPlane.getNormal());
-        if (Vector3D.dotProduct(crossP, otherPlane.getNormal()) < 0) {
+        if (crossP.dotProduct(otherPlane.getNormal()) < 0) {
             final Vector2D tmp = p;
             p           = q;
             q           = tmp;


Reply via email to