@@ -295,3 +295,46 @@ efp_strncasecmp(const char *s1, const char *s2, size_t n)
295295 }
296296 return 0 ;
297297}
298+
299+ void
300+ find_plane (const vec_t pt1 , const vec_t pt2 , const vec_t pt3 , vec_t * normal , double d ) {
301+ // determines plane by three points: ax + by + cz + d = 0, where a,b,c are given by a normal vector
302+ vec_t vec21 = vec_sub (& pt2 ,& pt1 );
303+ vec_t vec31 = vec_sub (& pt3 ,& pt1 );
304+ * normal = vec_cross (& vec21 ,& vec31 );
305+ d = - vec_dot (normal ,& pt1 );
306+ }
307+
308+ double
309+ max_cutoff (const six_t box ) {
310+ vec_t point000 = {0.0 , 0.0 , 0.0 };
311+ vec_t point100 = {1.0 , 0.0 , 0.0 };
312+ vec_t point010 = {0.0 , 1.0 , 0.0 };
313+ vec_t point001 = {0.0 , 0.0 , 1.0 };
314+ vec_t point = {0.5 ,0.5 ,0.5 };
315+ frac_to_cart (box , & point100 );
316+ frac_to_cart (box , & point010 );
317+ frac_to_cart (box , & point001 );
318+ frac_to_cart (box , & point );
319+ // plane xy: points 000, 100, 010
320+ vec_t normal ;
321+ double d ;
322+ double dist ;
323+ double min_dist ;
324+ // plane xy: points 000, 100, 010
325+ find_plane (point100 , point000 , point010 , & normal , d );
326+ dist = (vec_dot (& normal , & point ) + d ) / vec_len (& normal );
327+ dist = sqrt (dist * dist );
328+ min_dist = dist ;
329+ // plane xz: points 000, 100, 001
330+ find_plane (point100 , point000 , point001 , & normal , d );
331+ dist = (vec_dot (& normal , & point ) + d ) / vec_len (& normal );
332+ dist = sqrt (dist * dist );
333+ if (min_dist > dist ) min_dist = dist ;
334+ // plane yz: points 000, 010, 001
335+ find_plane (point010 , point000 , point001 , & normal , d );
336+ dist = (vec_dot (& normal , & point ) + d ) / vec_len (& normal );
337+ dist = sqrt (dist * dist );
338+ if (min_dist > dist ) min_dist = dist ;
339+ return min_dist ;
340+ }
0 commit comments