-
Notifications
You must be signed in to change notification settings - Fork 9
Expand file tree
/
Copy pathdistance.cpp
More file actions
65 lines (48 loc) · 1.71 KB
/
distance.cpp
File metadata and controls
65 lines (48 loc) · 1.71 KB
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
#include "geom/distance.h"
#include "geom/intersection.h"
#include "common/math.h"
namespace truck::geom {
double distanceSq(const Vec2& a, const Vec2& b) noexcept { return (a - b).lenSq(); }
double distance(const Vec2& a, const Vec2& b) noexcept { return (a - b).len(); }
double distanceSq(const Vec2& p, const Segment& s) noexcept {
const Vec2 ab = s.end - s.begin;
const Vec2 ap = p - s.begin;
const Vec2 bp = p - s.end;
const double ab_len_sq = ab.lenSq();
const double ap_ab = dot(ap, ab);
const double bp_ab = dot(bp, ab);
if (ap_ab <= 0) {
return ap.lenSq();
}
if (bp_ab >= 0) {
return bp.lenSq();
}
return ap.lenSq() - squared(ap_ab) / ab_len_sq;
}
double denormalizedDistance(const Line& l, const Vec2& p) noexcept {
return (dot(l.normal(), p) + l.c);
}
double denormalizedDistance(const Vec2& p, const Line& l) noexcept {
return denormalizedDistance(l, p);
}
double distance(const Line& l, const Vec2& p) noexcept {
return std::abs(denormalizedDistance(l, p) / l.normal().len());
}
double distance(const Vec2& p, const Line& l) noexcept { return distance(l, p); }
double distanceSq(const MotionState& a, const MotionState& b) noexcept {
return distanceSq(a.pos, b.pos);
}
double distance(const MotionState& a, const MotionState& b) noexcept {
return distance(a.pos, b.pos);
}
double distance(const Segment& a, const Segment& b) noexcept {
if (intersect(a, b)) {
return 0.0;
}
return std::min(
{distance(a.begin, projection(a.begin, b)),
distance(a.end, projection(a.end, b)),
distance(b.begin, projection(b.begin, a)),
distance(b.end, projection(b.end, a))});
}
} // namespace truck::geom