1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115
|
// Geometric Tools, LLC
// Copyright (c) 1998-2014
// 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
//
// File Version: 5.0.1 (2010/10/01)
#include "Wm5MathematicsPCH.h"
#include "Wm5IntrSegment3Plane3.h"
#include "Wm5IntrLine3Plane3.h"
namespace Wm5
{
//----------------------------------------------------------------------------
template <typename Real>
IntrSegment3Plane3<Real>::IntrSegment3Plane3 (const Segment3<Real>& rkSegment,
const Plane3<Real>& rkPlane)
:
mSegment(&rkSegment),
mPlane(&rkPlane)
{
}
//----------------------------------------------------------------------------
template <typename Real>
const Segment3<Real>& IntrSegment3Plane3<Real>::GetSegment () const
{
return *mSegment;
}
//----------------------------------------------------------------------------
template <typename Real>
const Plane3<Real>& IntrSegment3Plane3<Real>::GetPlane () const
{
return *mPlane;
}
//----------------------------------------------------------------------------
template <typename Real>
bool IntrSegment3Plane3<Real>::Test ()
{
Vector3<Real> P0 = mSegment->P0;
Real sdistance0 = mPlane->DistanceTo(P0);
if (Math<Real>::FAbs(sdistance0) <= Math<Real>::ZERO_TOLERANCE)
{
sdistance0 = (Real)0;
}
Vector3<Real> P1 = mSegment->P1;
Real sdistance1 = mPlane->DistanceTo(P1);
if (Math<Real>::FAbs(sdistance1) <= Math<Real>::ZERO_TOLERANCE)
{
sdistance1 = (Real)0;
}
Real prod = sdistance0*sdistance1;
if (prod < (Real)0)
{
// The segment passes through the plane.
mIntersectionType = IT_POINT;
return true;
}
if (prod > (Real)0)
{
// The segment is on one side of the plane.
mIntersectionType = IT_EMPTY;
return false;
}
if (sdistance0 != (Real)0 || sdistance1 != (Real)0)
{
// A segment end point touches the plane.
mIntersectionType = IT_POINT;
return true;
}
// The segment is coincident with the plane.
mIntersectionType = IT_SEGMENT;
return true;
}
//----------------------------------------------------------------------------
template <typename Real>
bool IntrSegment3Plane3<Real>::Find ()
{
Line3<Real> line(mSegment->Center, mSegment->Direction);
IntrLine3Plane3<Real> intr(line, *mPlane);
if (intr.Find())
{
// The line intersects the plane, but possibly at a point that is
// not on the segment.
mIntersectionType = intr.GetIntersectionType();
mSegmentParameter = intr.GetLineParameter();
return Math<Real>::FAbs(mSegmentParameter) <= mSegment->Extent;
}
mIntersectionType = IT_EMPTY;
return false;
}
//----------------------------------------------------------------------------
template <typename Real>
Real IntrSegment3Plane3<Real>::GetSegmentParameter () const
{
return mSegmentParameter;
}
//----------------------------------------------------------------------------
//----------------------------------------------------------------------------
// Explicit instantiation.
//----------------------------------------------------------------------------
template WM5_MATHEMATICS_ITEM
class IntrSegment3Plane3<float>;
template WM5_MATHEMATICS_ITEM
class IntrSegment3Plane3<double>;
//----------------------------------------------------------------------------
}
|