MUDA
Loading...
Searching...
No Matches
distance_unclassified.inl
1namespace muda::distance
2{
3template <class T>
4MUDA_GENERIC void point_point_distance_unclassified(const Eigen::Vector<T, 3>& p0,
5 const Eigen::Vector<T, 3>& p1,
6 T& dist2)
7{
8 return point_point_distance(p0, p1, dist2);
9}
10
11template <class T>
12MUDA_GENERIC void point_triangle_distance_unclassified(const Eigen::Vector<T, 3>& p,
13 const Eigen::Vector<T, 3>& t0,
14 const Eigen::Vector<T, 3>& t1,
15 const Eigen::Vector<T, 3>& t2,
16 T& dist2)
17{
18 switch(point_triangle_distance_type(p, t0, t1, t2))
19 {
20 case PointTriangleDistanceType::PP_PT0: {
21 point_point_distance(p, t0, dist2);
22 break;
23 }
24
25 case PointTriangleDistanceType::PP_PT1: {
26 point_point_distance(p, t1, dist2);
27 break;
28 }
29
30 case PointTriangleDistanceType::PP_PT2: {
31 point_point_distance(p, t2, dist2);
32 break;
33 }
34
35 case PointTriangleDistanceType::PE_PT0T1: {
36 point_edge_distance(p, t0, t1, dist2);
37 break;
38 }
39
40 case PointTriangleDistanceType::PE_PT1T2: {
41 point_edge_distance(p, t1, t2, dist2);
42 break;
43 }
44
45 case PointTriangleDistanceType::PE_PT2T0: {
46 point_edge_distance(p, t2, t0, dist2);
47 break;
48 }
49
50 case PointTriangleDistanceType::PT: {
51 point_triangle_distance(p, t0, t1, t2, dist2);
52 break;
53 }
54
55 default:
56 MUDA_KERNEL_ERROR_WITH_LOCATION("invalid type");
57 break;
58 }
59}
60
61template <class T>
62MUDA_GENERIC void edge_edge_distance_unclassified(const Eigen::Vector<T, 3>& ea0,
63 const Eigen::Vector<T, 3>& ea1,
64 const Eigen::Vector<T, 3>& eb0,
65 const Eigen::Vector<T, 3>& eb1,
66 T& dist2)
67{
68 switch(edge_edge_distance_type(ea0, ea1, eb0, eb1))
69 {
70 case EdgeEdgeDistanceType::PP_Ea0Eb0: {
71 point_point_distance(ea0, eb0, dist2);
72 break;
73 }
74
75 case EdgeEdgeDistanceType::PP_Ea0Eb1: {
76 point_point_distance(ea0, eb1, dist2);
77 break;
78 }
79
80 case EdgeEdgeDistanceType::PE_Ea0Eb0Eb1: {
81 point_edge_distance(ea0, eb0, eb1, dist2);
82 break;
83 }
84
85 case EdgeEdgeDistanceType::PP_Ea1Eb0: {
86 point_point_distance(ea1, eb0, dist2);
87 break;
88 }
89
90 case EdgeEdgeDistanceType::PP_Ea1Eb1: {
91 point_point_distance(ea1, eb1, dist2);
92 break;
93 }
94
95 case EdgeEdgeDistanceType::PE_Ea1Eb0Eb1: {
96 point_edge_distance(ea1, eb0, eb1, dist2);
97 break;
98 }
99
100 case EdgeEdgeDistanceType::PE_Eb0Ea0Ea1: {
101 point_edge_distance(eb0, ea0, ea1, dist2);
102 break;
103 }
104
105 case EdgeEdgeDistanceType::PE_Eb1Ea0Ea1: {
106 point_edge_distance(eb1, ea0, ea1, dist2);
107 break;
108 }
109
110 case EdgeEdgeDistanceType::EE: {
111 edge_edge_distance(ea0, ea1, eb0, eb1, dist2);
112 break;
113 }
114
115 default:
116 MUDA_KERNEL_ERROR_WITH_LOCATION("invalid type");
117 break;
118 }
119}
120
121// http://geomalgorithms.com/a02-_lines.html
122template <class T>
123MUDA_GENERIC void point_edge_distance_unclassified(const Eigen::Vector<T, 3>& p,
124 const Eigen::Vector<T, 3>& e0,
125 const Eigen::Vector<T, 3>& e1,
126 T& dist2)
127{
128 switch(point_edge_distance_type(p, e0, e1))
129 {
130 case PointEdgeDistanceType::PP_PE0: {
131 point_point_distance(p, e0, dist2);
132 break;
133 }
134
135 case PointEdgeDistanceType::PP_PE1: {
136 point_point_distance(p, e1, dist2);
137 break;
138 }
139
140 case PointEdgeDistanceType::PE: {
141 point_edge_distance(p, e0, e1, dist2);
142 break;
143 }
144 default:
145 MUDA_KERNEL_ERROR_WITH_LOCATION("invalid type");
146 break;
147 }
148}
149
150} // namespace muda::distance