aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/libraries/ode-0.9/OPCODE/Ice/IceSegment.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libraries/ode-0.9/OPCODE/Ice/IceSegment.cpp')
-rw-r--r--libraries/ode-0.9/OPCODE/Ice/IceSegment.cpp57
1 files changed, 57 insertions, 0 deletions
diff --git a/libraries/ode-0.9/OPCODE/Ice/IceSegment.cpp b/libraries/ode-0.9/OPCODE/Ice/IceSegment.cpp
new file mode 100644
index 0000000..cd9ceb7
--- /dev/null
+++ b/libraries/ode-0.9/OPCODE/Ice/IceSegment.cpp
@@ -0,0 +1,57 @@
1///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
2/**
3 * Contains code for segments.
4 * \file IceSegment.cpp
5 * \author Pierre Terdiman
6 * \date April, 4, 2000
7 */
8///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
9
10///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
11/**
12 * Segment class.
13 * A segment is defined by S(t) = mP0 * (1 - t) + mP1 * t, with 0 <= t <= 1
14 * Alternatively, a segment is S(t) = Origin + t * Direction for 0 <= t <= 1.
15 * Direction is not necessarily unit length. The end points are Origin = mP0 and Origin + Direction = mP1.
16 *
17 * \class Segment
18 * \author Pierre Terdiman
19 * \version 1.0
20 */
21///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
22
23///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
24// Precompiled Header
25#include "Stdafx.h"
26
27using namespace IceMaths;
28
29float Segment::SquareDistance(const Point& point, float* t) const
30{
31 Point Diff = point - mP0;
32 Point Dir = mP1 - mP0;
33 float fT = Diff | Dir;
34
35 if(fT<=0.0f)
36 {
37 fT = 0.0f;
38 }
39 else
40 {
41 float SqrLen= Dir.SquareMagnitude();
42 if(fT>=SqrLen)
43 {
44 fT = 1.0f;
45 Diff -= Dir;
46 }
47 else
48 {
49 fT /= SqrLen;
50 Diff -= fT*Dir;
51 }
52 }
53
54 if(t) *t = fT;
55
56 return Diff.SquareMagnitude();
57}