99namespace inclusion_ccd
1010{
1111
12- static Scalar CCD_LENGTH_TOL = 1e-6 ;
13-
14- std::array<Vector3d, 2 > bbd_4_pts_new (const std::array<Vector3d, 4 > &pts)
15- {
16- Vector3d min, max;
17- min = pts[0 ];
18- max = pts[0 ];
19- for (int i = 1 ; i < 4 ; i++)
20- {
21- for (int j = 0 ; j < 3 ; j++)
22- {
23- if (min[j] > pts[i][j])
24- {
25- min[j] = pts[i][j];
26- }
27- if (max[j] < pts[i][j])
28- {
29- max[j] = pts[i][j];
30- }
31- }
32- }
33- std::array<Vector3d, 2 > rst;
34- rst[0 ] = min;
35- rst[1 ] = max;
36- return rst;
37- }
12+ static constexpr Scalar DEFAULT_CCD_LENGTH_TOL = 1e-6 ;
13+ // #define TIGHT_INCLUSION_MAX_ABS_TOL
14+ #ifdef TIGHT_INCLUSION_MAX_ABS_TOL
15+ static constexpr Scalar CCD_MAX_TIME_TOL = 1e-3 ;
16+ static constexpr Scalar CCD_MAX_COORD_TOL = 1e-2 ;
17+ #else
18+ static constexpr Scalar CCD_MAX_TIME_TOL =
19+ std::numeric_limits<double >::infinity();
20+ static constexpr Scalar CCD_MAX_COORD_TOL =
21+ std::numeric_limits<double >::infinity();
22+ #endif
3823
39- Scalar max_diff (
40- const Scalar b1min ,
41- const Scalar b1max ,
42- const Scalar b2min ,
43- const Scalar b2max )
24+ inline std::array<Vector3d, 2 > bbd_4_pts_new (
25+ const Vector3d &p0 ,
26+ const Vector3d &p1 ,
27+ const Vector3d &p2 ,
28+ const Vector3d &p3 )
4429 {
45- Scalar r = 0 ;
46- if (r < b1max - b1min)
47- r = b1max - b1min;
48- if (r < b2max - b2min)
49- r = b2max - b2min;
50- if (r < fabs (b2min - b1max))
51- r = fabs (b2min - b1max);
52- if (r < fabs (b1min - b2max))
53- r = fabs (b1min - b2max);
54- return r;
30+ return {
31+ p0.cwiseMin (p1).cwiseMin (p2).cwiseMin (p3),
32+ p0.cwiseMax (p1).cwiseMax (p2).cwiseMax (p3)};
5533 }
5634
5735 // calculate maximum x, y and z diff
5836 Scalar get_max_axis_diff (
5937 const std::array<Vector3d, 2 > &b1, const std::array<Vector3d, 2 > &b2)
6038 {
61-
62- Scalar x = max_diff (b1[0 ][0 ], b1[1 ][0 ], b2[0 ][0 ], b2[1 ][0 ]);
63- Scalar y = max_diff (b1[0 ][1 ], b1[1 ][1 ], b2[0 ][1 ], b2[1 ][1 ]);
64- Scalar z = max_diff (b1[0 ][2 ], b1[1 ][2 ], b2[0 ][2 ], b2[1 ][2 ]);
65- return std::max (std::max (x, y), z);
66- }
67-
68- Scalar max_linf_dist (const Vector3d &p1, const Vector3d &p2)
69- {
70- Scalar r = 0 ;
71- for (int i = 0 ; i < 3 ; i++)
72- {
73- if (r < fabs (p1[i] - p2[i]))
74- {
75- r = fabs (p1[i] - p2[i]);
76- }
77- }
78- return r;
39+ return std::max ({
40+ (b1[1 ] - b1[0 ]).maxCoeff (),
41+ (b2[1 ] - b2[0 ]).maxCoeff (),
42+ (b2[0 ] - b1[1 ]).cwiseAbs ().maxCoeff (),
43+ (b1[0 ] - b2[1 ]).cwiseAbs ().maxCoeff (),
44+ });
7945 }
8046
81- Scalar max_linf_4 (
47+ inline Scalar max_linf_4 (
8248 const Vector3d &p1,
8349 const Vector3d &p2,
8450 const Vector3d &p3,
@@ -88,20 +54,11 @@ namespace inclusion_ccd
8854 const Vector3d &p3e,
8955 const Vector3d &p4e)
9056 {
91- Scalar r = 0 , temp = 0 ;
92- temp = max_linf_dist (p1e, p1);
93- if (r < temp)
94- r = temp;
95- temp = max_linf_dist (p2e, p2);
96- if (r < temp)
97- r = temp;
98- temp = max_linf_dist (p3e, p3);
99- if (r < temp)
100- r = temp;
101- temp = max_linf_dist (p4e, p4);
102- if (r < temp)
103- r = temp;
104- return r;
57+ return std::max (
58+ {(p1e - p1).lpNorm <Eigen::Infinity>(),
59+ (p2e - p2).lpNorm <Eigen::Infinity>(),
60+ (p3e - p3).lpNorm <Eigen::Infinity>(),
61+ (p4e - p4).lpNorm <Eigen::Infinity>()});
10562 }
10663
10764 Vector3d compute_face_vertex_tolerance_3d_new (
@@ -115,67 +72,26 @@ namespace inclusion_ccd
11572 const Vector3d &f2e,
11673 const Scalar tolerance)
11774 {
118- Vector3d p000 = vs - f0s, p001 = vs - f2s,
119- p011 = vs - (f1s + f2s - f0s), p010 = vs - f1s;
120- Vector3d p100 = ve - f0e, p101 = ve - f2e,
121- p111 = ve - (f1e + f2e - f0e), p110 = ve - f1e;
122- Scalar dl = 0 ;
123- Scalar edge0_length = 0 ;
124- Scalar edge1_length = 0 ;
125- dl = 3 * max_linf_4 (p000, p001, p011, p010, p100, p101, p111, p110);
126- edge0_length =
75+ const Vector3d p000 = vs - f0s;
76+ const Vector3d p001 = vs - f2s;
77+ const Vector3d p011 = vs - (f1s + f2s - f0s);
78+ const Vector3d p010 = vs - f1s;
79+ const Vector3d p100 = ve - f0e;
80+ const Vector3d p101 = ve - f2e;
81+ const Vector3d p111 = ve - (f1e + f2e - f0e);
82+ const Vector3d p110 = ve - f1e;
83+
84+ Scalar dl =
85+ 3 * max_linf_4 (p000, p001, p011, p010, p100, p101, p111, p110);
86+ Scalar edge0_length =
12787 3 * max_linf_4 (p000, p100, p101, p001, p010, p110, p111, p011);
128- edge1_length =
88+ Scalar edge1_length =
12989 3 * max_linf_4 (p000, p100, p110, p010, p001, p101, p111, p011);
130- // Scalar diag=max_linf_4(
131- // p000,p100,p110,p010,
132- // p111,p011,p001,p101);
133-
134- // std::array<Vector3d,2>
135- // t0box=bbd_4_pts_new({{p000,p001,p010,p011}});
136- // std::array<Vector3d,2>
137- // t1box=bbd_4_pts_new({{p100,p101,p110,p111}});
138- // std::array<Vector3d,2>
139- // u0box=bbd_4_pts_new({{p000,p001,p100,p101}});
140- // std::array<Vector3d,2>
141- // u1box=bbd_4_pts_new({{p010,p011,p110,p111}});
142- // std::array<Vector3d,2>
143- // v0box=bbd_4_pts_new({{p000,p100,p010,p110}});
144- // std::array<Vector3d,2>
145- // v1box=bbd_4_pts_new({{p001,p101,p011,p111}});
146- // dl=get_max_axis_diff(t0box,t1box);
147- // edge0_length=get_max_axis_diff(u0box,u1box);
148- // edge1_length=get_max_axis_diff(v0box,v1box);
149- // for(int i=0;i<3;i++){
150- // if(dl<fabs(ve[i]-vs[i]))
151- // dl=fabs(ve[i]-vs[i]);
152-
153- // if(dl<fabs(f0e[i]-f0s[i]))
154- // dl=fabs(f0e[i]-f0s[i]);
155-
156- // if(dl<fabs(f1e[i]-f1s[i]))
157- // dl=fabs(f1e[i]-f1s[i]);
158-
159- // if(dl<fabs(f2e[i]-f2s[i]))
160- // dl=fabs(f2e[i]-f2s[i]);
161-
162- // if(edge0_length<fabs(f1s[i] - f0s[i]))
163- // edge0_length=fabs(f1s[i] - f0s[i]);
164-
165- // if(edge0_length<fabs(f1e[i] - f0e[i]))
166- // edge0_length=fabs(f1e[i] - f0e[i]);
167-
168- // if(edge1_length<fabs(f2s[i]-f0s[i]))
169- // edge1_length=fabs(f2s[i]-f0s[i]);
170-
171- // if(edge1_length<fabs(f2e[i]-f0e[i]))
172- // edge1_length=fabs(f2e[i]-f0e[i]);
173- // }
174- // //Scalar edge_length = std::max(edge0_length, edge1_length);
175- // c00=0;c10=0;c20=0;
176- // c00=dl;c10=edge0_length;c20=edge1_length;
90+
17791 return Vector3d (
178- tolerance / dl, tolerance / edge0_length, tolerance / edge1_length);
92+ std::min (tolerance / dl, CCD_MAX_TIME_TOL), // time tolerance
93+ std::min (tolerance / edge0_length, CCD_MAX_COORD_TOL),
94+ std::min (tolerance / edge1_length, CCD_MAX_COORD_TOL));
17995 }
18096
18197 Vector3d compute_edge_edge_tolerance_new (
@@ -190,89 +106,26 @@ namespace inclusion_ccd
190106 const Scalar tolerance)
191107 {
192108
193- Vector3d p000 = edge0_vertex0_start - edge1_vertex0_start,
194- p001 = edge0_vertex0_start - edge1_vertex1_start,
195- p011 = edge0_vertex1_start - edge1_vertex1_start,
196- p010 = edge0_vertex1_start - edge1_vertex0_start;
197- Vector3d p100 = edge0_vertex0_end - edge1_vertex0_end,
198- p101 = edge0_vertex0_end - edge1_vertex1_end,
199- p111 = edge0_vertex1_end - edge1_vertex1_end,
200- p110 = edge0_vertex1_end - edge1_vertex0_end;
201- Scalar dl = 0 ;
202- Scalar edge0_length = 0 ;
203- Scalar edge1_length = 0 ;
204- // {
205- // std::array<Vector3d,2>
206- // t0box=bbd_4_pts_new({{p000,p001,p010,p011}});
207- // std::array<Vector3d,2>
208- // t1box=bbd_4_pts_new({{p100,p101,p110,p111}});
209- // std::array<Vector3d,2>
210- // u0box=bbd_4_pts_new({{p000,p001,p100,p101}});
211- // std::array<Vector3d,2>
212- // u1box=bbd_4_pts_new({{p010,p011,p110,p111}});
213- // std::array<Vector3d,2>
214- // v0box=bbd_4_pts_new({{p000,p100,p010,p110}});
215- // std::array<Vector3d,2>
216- // v1box=bbd_4_pts_new({{p001,p101,p011,p111}});
217- // dl=get_max_axis_diff(t0box,t1box);
218- // edge0_length=get_max_axis_diff(u0box,u1box);
219- // edge1_length=get_max_axis_diff(v0box,v1box);
220- // }
221-
222- dl = 3 * max_linf_4 (p000, p001, p011, p010, p100, p101, p111, p110);
223- edge0_length =
109+ const Vector3d p000 = edge0_vertex0_start - edge1_vertex0_start;
110+ const Vector3d p001 = edge0_vertex0_start - edge1_vertex1_start;
111+ const Vector3d p011 = edge0_vertex1_start - edge1_vertex1_start;
112+ const Vector3d p010 = edge0_vertex1_start - edge1_vertex0_start;
113+ const Vector3d p100 = edge0_vertex0_end - edge1_vertex0_end;
114+ const Vector3d p101 = edge0_vertex0_end - edge1_vertex1_end;
115+ const Vector3d p111 = edge0_vertex1_end - edge1_vertex1_end;
116+ const Vector3d p110 = edge0_vertex1_end - edge1_vertex0_end;
117+
118+ Scalar dl =
119+ 3 * max_linf_4 (p000, p001, p011, p010, p100, p101, p111, p110);
120+ Scalar edge0_length =
224121 3 * max_linf_4 (p000, p100, p101, p001, p010, p110, p111, p011);
225- edge1_length =
122+ Scalar edge1_length =
226123 3 * max_linf_4 (p000, p100, p110, p010, p001, p101, p111, p011);
227- // for(int i=0;i<3;i++){
228- // if(fabs(p000[i]-p100[i])>dl)
229- // dl=fabs(p000[i]-p100[i]);
230- // if(fabs(p001[i]-p101[i])>dl)
231- // dl=fabs(p001[i]-p101[i]);
232- // if(fabs(p010[i]-p110[i])>dl)
233- // dl=fabs(p010[i]-p110[i]);
234- // if(fabs(p011[i]-p111[i])>dl)
235- // dl=fabs(p011[i]-p111[i]);
236- // }
237-
238- // Scalar dl=0;
239- // Scalar edge0_length=0;
240- // Scalar edge1_length=0;
241- // for(int i=0;i<3;i++){
242- // if(dl<fabs(edge0_vertex0_end[i]-edge0_vertex0_start[i]))
243- // dl=fabs(edge0_vertex0_end[i]-edge0_vertex0_start[i]);
244-
245- // if(dl<fabs(edge0_vertex1_end[i]-edge0_vertex1_start[i]))
246- // dl=fabs(edge0_vertex1_end[i]-edge0_vertex1_start[i]);
247-
248- // if(dl<fabs(edge1_vertex0_end[i]-edge1_vertex0_start[i]))
249- // dl=fabs(edge1_vertex0_end[i]-edge1_vertex0_start[i]);
250-
251- // if(dl<fabs(edge1_vertex1_end[i]-edge1_vertex1_start[i]))
252- // dl=fabs(edge1_vertex1_end[i]-edge1_vertex1_start[i]);
253-
254- // if(edge0_length<fabs(edge0_vertex1_start[i] -
255- // edge0_vertex0_start[i]))
256- // edge0_length=fabs(edge0_vertex1_start[i] -
257- // edge0_vertex0_start[i]);
258-
259- // if(edge0_length<fabs(edge0_vertex1_end[i] -
260- // edge0_vertex0_end[i]))
261- // edge0_length=fabs(edge0_vertex1_end[i] -
262- // edge0_vertex0_end[i]);
263-
264- // if(edge1_length<fabs(edge1_vertex1_start[i] -
265- // edge1_vertex0_start[i]))
266- // edge1_length=fabs(edge1_vertex1_start[i] -
267- // edge1_vertex0_start[i]);
268-
269- // if(edge1_length<fabs(edge1_vertex1_end[i] -
270- // edge1_vertex0_end[i]))
271- // edge1_length=fabs(edge1_vertex1_end[i] -
272- // edge1_vertex0_end[i]);
273- // }
124+
274125 return Vector3d (
275- tolerance / dl, tolerance / edge0_length, tolerance / edge1_length);
126+ std::min (tolerance / dl, CCD_MAX_TIME_TOL),
127+ std::min (tolerance / edge0_length, CCD_MAX_COORD_TOL),
128+ std::min (tolerance / edge1_length, CCD_MAX_COORD_TOL));
276129 }
277130
278131 bool edgeEdgeCCD_double (
@@ -547,7 +400,7 @@ namespace inclusion_ccd
547400 {
548401
549402 Vector3d tol = compute_edge_edge_tolerance_new (
550- a0s, a1s, b0s, b1s, a0e, a1e, b0e, b1e, CCD_LENGTH_TOL );
403+ a0s, a1s, b0s, b1s, a0e, a1e, b0e, b1e, DEFAULT_CCD_LENGTH_TOL );
551404
552405 // ////////////////////////////////////////////////////////
553406 // TODO this should be the error of the whole mesh
@@ -596,11 +449,10 @@ namespace inclusion_ccd
596449 const Scalar ms,
597450 Scalar &toi)
598451 {
599-
600452 Vector3d tol = compute_face_vertex_tolerance_3d_new (
601453 vertex_start, face_vertex0_start, face_vertex1_start,
602454 face_vertex2_start, vertex_end, face_vertex0_end, face_vertex1_end,
603- face_vertex2_end, CCD_LENGTH_TOL );
455+ face_vertex2_end, DEFAULT_CCD_LENGTH_TOL );
604456 // std::cout<<"get tolerance successfully"<<std::endl;
605457 // ////////////////////////////////////////////////////////
606458 // TODO this should be the error of the whole mesh
0 commit comments