From 10328f8af2ba8e67b0c20c91470bf6c2cf5fdf9b Mon Sep 17 00:00:00 2001 From: Harvey Harrison Date: Fri, 28 Jun 2013 14:04:11 -0700 Subject: j3dcore: check in a snapshot of the GeometricTools ray to segment distance function - adapted from code under the Boost 1.0 license, here distributed as GPLv2 + classpath Signed-off-by: Harvey Harrison --- src/classes/share/javax/media/j3d/Utils.java | 175 +++++++++++++++++++++++++++ 1 file changed, 175 insertions(+) diff --git a/src/classes/share/javax/media/j3d/Utils.java b/src/classes/share/javax/media/j3d/Utils.java index 276b1e5..81a3391 100644 --- a/src/classes/share/javax/media/j3d/Utils.java +++ b/src/classes/share/javax/media/j3d/Utils.java @@ -98,6 +98,181 @@ static final double ptToRaySquare(Point3d pt, Point3d start, Vector3d dir, Point private static final double ZERO_TOL = 1e-5d; +/** + * Return the square of the minimum distance between a ray and a segment. + * Geometric Tools, LLC + * Copyright (c) 1998-2012 + * Distributed under the Boost Software License, Version 1.0. + * http://www.boost.org/LICENSE_1_0.txt + * http://www.geometrictools.com/License/Boost/LICENSE_1_0.txt + * http://www.geometrictools.com/LibMathematics/Distance/Wm5DistRay3Segment3.cpp + * File Version: 5.0.1 (2010/10/01) + */ +static public double rayToSegment(Point3d rayorig, Vector3d raydir, + Point3d segstart, Point3d segend, + Point3d rayint, Point3d segint, double[] param) { +// Vector3 diff = mRay->Origin- mSegment->Center; +// Real a01 = -mRay->Direction.Dot(mSegment->Direction); +// Real b0 = diff.Dot(mRay->Direction); +// Real b1 = -diff.Dot(mSegment->Direction); +// Real c = diff.SquaredLength(); +// Real det = Math::FAbs((Real)1 - a01*a01); +// Real s0, s1, sqrDist, extDet; +// +// if (det >= Math::ZERO_TOLERANCE) +// { +// // The ray and segment are not parallel. +// s0 = a01*b1 - b0; +// s1 = a01*b0 - b1; +// extDet = mSegment->Extent*det; +// +// if (s0 >= (Real)0) +// { +// if (s1 >= -extDet) +// { +// if (s1 <= extDet) // region 0 +// { +// // Minimum at interior points of ray and segment. +// Real invDet = ((Real)1)/det; +// s0 *= invDet; +// s1 *= invDet; +// sqrDist = s0*(s0 + a01*s1 + ((Real)2)*b0) + +// s1*(a01*s0 + s1 + ((Real)2)*b1) + c; +// } +// else // region 1 +// { +// s1 = mSegment->Extent; +// s0 = -(a01*s1 + b0); +// if (s0 > (Real)0) +// { +// sqrDist = -s0*s0 + s1*(s1 + ((Real)2)*b1) + c; +// } +// else +// { +// s0 = (Real)0; +// sqrDist = s1*(s1 + ((Real)2)*b1) + c; +// } +// } +// } +// else // region 5 +// { +// s1 = -mSegment->Extent; +// s0 = -(a01*s1 + b0); +// if (s0 > (Real)0) +// { +// sqrDist = -s0*s0 + s1*(s1 + ((Real)2)*b1) + c; +// } +// else +// { +// s0 = (Real)0; +// sqrDist = s1*(s1 + ((Real)2)*b1) + c; +// } +// } +// } +// else +// { +// if (s1 <= -extDet) // region 4 +// { +// s0 = -(-a01*mSegment->Extent + b0); +// if (s0 > (Real)0) +// { +// s1 = -mSegment->Extent; +// sqrDist = -s0*s0 + s1*(s1 + ((Real)2)*b1) + c; +// } +// else +// { +// s0 = (Real)0; +// s1 = -b1; +// if (s1 < -mSegment->Extent) +// { +// s1 = -mSegment->Extent; +// } +// else if (s1 > mSegment->Extent) +// { +// s1 = mSegment->Extent; +// } +// sqrDist = s1*(s1 + ((Real)2)*b1) + c; +// } +// } +// else if (s1 <= extDet) // region 3 +// { +// s0 = (Real)0; +// s1 = -b1; +// if (s1 < -mSegment->Extent) +// { +// s1 = -mSegment->Extent; +// } +// else if (s1 > mSegment->Extent) +// { +// s1 = mSegment->Extent; +// } +// sqrDist = s1*(s1 + ((Real)2)*b1) + c; +// } +// else // region 2 +// { +// s0 = -(a01*mSegment->Extent + b0); +// if (s0 > (Real)0) +// { +// s1 = mSegment->Extent; +// sqrDist = -s0*s0 + s1*(s1 + ((Real)2)*b1) + c; +// } +// else +// { +// s0 = (Real)0; +// s1 = -b1; +// if (s1 < -mSegment->Extent) +// { +// s1 = -mSegment->Extent; +// } +// else if (s1 > mSegment->Extent) +// { +// s1 = mSegment->Extent; +// } +// sqrDist = s1*(s1 + ((Real)2)*b1) + c; +// } +// } +// } +// } +// else +// { +// // Ray and segment are parallel. +// if (a01 > (Real)0) +// { +// // Opposite direction vectors. +// s1 = -mSegment->Extent; +// } +// else +// { +// // Same direction vectors. +// s1 = mSegment->Extent; +// } +// +// s0 = -(a01*s1 + b0); +// if (s0 > (Real)0) +// { +// sqrDist = -s0*s0 + s1*(s1 + ((Real)2)*b1) + c; +// } +// else +// { +// s0 = (Real)0; +// sqrDist = s1*(s1 + ((Real)2)*b1) + c; +// } +// } +// +// mClosestPoint0 = mRay->Origin + s0*mRay->Direction; +// mClosestPoint1 = mSegment->Center + s1*mSegment->Direction; +// mRayParameter = s0; +// mSegmentParameter = s1; +// +// // Account for numerical round-off errors. +// if (sqrDist < (Real)0) +// { +// sqrDist = (Real)0; +// } +// return sqrDist; + return 0.0d; +} + /** * Return the square of the minimum distance between two line segments. * -- cgit v1.2.3