1 | /* |
---|
2 | orxonox - the future of 3D-vertical-scrollers |
---|
3 | |
---|
4 | Copyright (C) 2004 orx |
---|
5 | |
---|
6 | This program is free software; you can redistribute it and/or modify |
---|
7 | it under the terms of the GNU General Public License as published by |
---|
8 | the Free Software Foundation; either version 2, or (at your option) |
---|
9 | any later version. |
---|
10 | |
---|
11 | ### File Specific: |
---|
12 | main-programmer: Christian Meyer |
---|
13 | co-programmer: Patrick Boenzli : Vector::scale() |
---|
14 | Vector::abs() |
---|
15 | */ |
---|
16 | |
---|
17 | #define DEBUG_SPECIAL_MODULE DEBUG_MODULE_MATH |
---|
18 | |
---|
19 | #include "line.h" |
---|
20 | #include "plane.h" |
---|
21 | #ifdef DEBUG |
---|
22 | #include "debug.h" |
---|
23 | #else |
---|
24 | #include <stdio.h> |
---|
25 | #define PRINT(x) printf |
---|
26 | #endif |
---|
27 | |
---|
28 | using namespace std; |
---|
29 | |
---|
30 | /** |
---|
31 | * calculate the distance between two lines |
---|
32 | * @param l: the other line |
---|
33 | * @return the distance between the lines |
---|
34 | */ |
---|
35 | float Line::distance (const Line& l) const |
---|
36 | { |
---|
37 | float q, d; |
---|
38 | Vector n = a.cross(l.a); |
---|
39 | q = n.dot(r-l.r); |
---|
40 | d = n.len(); |
---|
41 | if( d == 0.0) return 0.0; |
---|
42 | return q/d; |
---|
43 | } |
---|
44 | |
---|
45 | /** |
---|
46 | * calculate the distance between a line and a point |
---|
47 | * @param v: the point |
---|
48 | * @return the distance between the Line and the point |
---|
49 | */ |
---|
50 | float Line::distancePoint (const Vector& v) const |
---|
51 | { |
---|
52 | Vector d = v-r; |
---|
53 | Vector u = a * d.dot( a); |
---|
54 | return (d - u).len(); |
---|
55 | } |
---|
56 | |
---|
57 | /** |
---|
58 | * calculate the distance between a line and a point |
---|
59 | * @param v: the point |
---|
60 | * @return the distance between the Line and the point |
---|
61 | */ |
---|
62 | float Line::distancePoint (const sVec3D& v) const |
---|
63 | { |
---|
64 | Vector s(v[0], v[1], v[2]); |
---|
65 | Vector d = s - r; |
---|
66 | Vector u = a * d.dot( a); |
---|
67 | return (d - u).len(); |
---|
68 | } |
---|
69 | |
---|
70 | /** |
---|
71 | * calculate the two points of minimal distance of two lines |
---|
72 | * @param l: the other line |
---|
73 | * @return a Vector[2] (!has to be deleted after use!) containing the two points of minimal distance |
---|
74 | */ |
---|
75 | Vector* Line::footpoints (const Line& l) const |
---|
76 | { |
---|
77 | Vector* fp = new Vector[2]; |
---|
78 | Plane p = Plane (r + a.cross(l.a), r, r + a); |
---|
79 | fp[1] = p.intersectLine (l); |
---|
80 | p = Plane (fp[1], l.a); |
---|
81 | fp[0] = p.intersectLine (*this); |
---|
82 | return fp; |
---|
83 | } |
---|
84 | |
---|
85 | /** |
---|
86 | \brief calculate the length of a line |
---|
87 | \return the lenght of the line |
---|
88 | */ |
---|
89 | float Line::len() const |
---|
90 | { |
---|
91 | return a.len(); |
---|
92 | } |
---|
93 | |
---|
94 | /** |
---|
95 | * rotate the line by given rotation |
---|
96 | * @param rot: a rotation |
---|
97 | */ |
---|
98 | void Line::rotate (const Rotation& rot) |
---|
99 | { |
---|
100 | Vector t = a + r; |
---|
101 | t = rotateVector( t, rot); |
---|
102 | r = rotateVector( r, rot), |
---|
103 | a = t - r; |
---|
104 | } |
---|