@@ -505,96 +505,101 @@ vector<int32_t>::iterator CSGCell::find_left_parenthesis(
505505}
506506std::pair<double , int32_t > CSGCell::distance (
507507 Position r, Direction u, int32_t on_surface, GeometryState* p) const
508+ {
509+ if (virtual_lattice_) {
510+ return distance_in_virtual_lattice (r, u, on_surface, p);
511+ } else {
512+ return region_.distance (r, u, on_surface);
513+ }
514+ }
515+
516+ std::pair<double , int32_t > CSGCell::distance_in_virtual_lattice (
517+ Position r, Direction u, int32_t on_surface, GeometryState* p) const
508518{
509519 double min_dist {INFTY};
510520 int32_t i_surf {std::numeric_limits<int32_t >::max ()};
511521 double min_dis_vl;
512522 int32_t i_surf_vl;
513- if (virtual_lattice_) {
514- double max_dis = p->collision_distance ();
515- double tol_dis = 0 ;
516- vector<double > dis_to_bou (3 ), dis_to_bou_max (3 );
517- double u_value = sqrt (pow (u.x , 2 ) + pow (u.y , 2 ) +
518- pow (u.z , 2 )); // don't know if u has been normalized
519- vector<double > norm_u = {u.x / u_value, u.y / u_value, u.z / u_value};
520- vector<int > lat_ind (3 );
521- vector<double > temp_pos = {r.x , r.y , r.z };
522- int loop_time;
523- for (int i = 0 ; i < 3 ; i++) {
524- lat_ind[i] = floor ((temp_pos[i] - vl_lower_left_[i]) / vl_pitch_[i]);
525- if (lat_ind[i] == vl_shape_[i] && norm_u[i] < 0 ) {
526- lat_ind[i] = vl_shape_[i] - 1 ;
527- }
528- if (lat_ind[i] == -1 && norm_u[i] > 0 ) {
529- lat_ind[i] = 0 ;
530- }
523+
524+ double max_dis = p->collision_distance ();
525+ double tol_dis = 0 ;
526+ vector<double > dis_to_bou (3 ), dis_to_bou_max (3 );
527+ double u_value = sqrt (pow (u.x , 2 ) + pow (u.y , 2 ) +
528+ pow (u.z , 2 )); // don't know if u has been normalized
529+ vector<double > norm_u = {u.x / u_value, u.y / u_value, u.z / u_value};
530+ vector<int > lat_ind (3 );
531+ vector<double > temp_pos = {r.x , r.y , r.z };
532+ int loop_time;
533+ for (int i = 0 ; i < 3 ; i++) {
534+ lat_ind[i] = floor ((temp_pos[i] - vl_lower_left_[i]) / vl_pitch_[i]);
535+ if (lat_ind[i] == vl_shape_[i] && norm_u[i] < 0 ) {
536+ lat_ind[i] = vl_shape_[i] - 1 ;
537+ }
538+ if (lat_ind[i] == -1 && norm_u[i] > 0 ) {
539+ lat_ind[i] = 0 ;
531540 }
541+ }
532542
533- dis_to_bou = {INFTY, INFTY, INFTY};
534- for (int i = 0 ; i < 3 ; i++) {
535- if (norm_u[i] > 0 ) {
536- dis_to_bou[i] = std::abs (
537- ((lat_ind[i] + 1 ) * vl_pitch_[i] + vl_lower_left_[i] - temp_pos[i]) /
538- norm_u[i]);
539- dis_to_bou_max[i] = vl_pitch_[i] / norm_u[i];
540- } else if (norm_u[i] < 0 ) {
541- dis_to_bou[i] = std::abs (
542- (lat_ind[i] * vl_pitch_[i] + vl_lower_left_[i] - temp_pos[i]) /
543- norm_u[i]);
544- dis_to_bou_max[i] = -vl_pitch_[i] / norm_u[i];
545- }
543+ dis_to_bou = {INFTY, INFTY, INFTY};
544+ for (int i = 0 ; i < 3 ; i++) {
545+ if (norm_u[i] > 0 ) {
546+ dis_to_bou[i] = std::abs (
547+ ((lat_ind[i] + 1 ) * vl_pitch_[i] + vl_lower_left_[i] - temp_pos[i]) /
548+ norm_u[i]);
549+ dis_to_bou_max[i] = vl_pitch_[i] / norm_u[i];
550+ } else if (norm_u[i] < 0 ) {
551+ dis_to_bou[i] =
552+ std::abs ((lat_ind[i] * vl_pitch_[i] + vl_lower_left_[i] - temp_pos[i]) /
553+ norm_u[i]);
554+ dis_to_bou_max[i] = -vl_pitch_[i] / norm_u[i];
546555 }
556+ }
547557
548- while (true ) {
549- if (lat_ind[0 ] < 0 || lat_ind[0 ] >= vl_shape_[0 ] || lat_ind[1 ] < 0 ||
550- lat_ind[1 ] >= vl_shape_[1 ] || lat_ind[2 ] < 0 ||
551- lat_ind[2 ] >= vl_shape_[2 ])
552- break ;
558+ while (true ) {
559+ if (lat_ind[0 ] < 0 || lat_ind[0 ] >= vl_shape_[0 ] || lat_ind[1 ] < 0 ||
560+ lat_ind[1 ] >= vl_shape_[1 ] || lat_ind[2 ] < 0 ||
561+ lat_ind[2 ] >= vl_shape_[2 ])
562+ break ;
553563
554- for (int token :
555- vl_triso_distribution_[lat_ind[0 ] + lat_ind[1 ] * vl_shape_[0 ] +
556- lat_ind[2 ] * vl_shape_[0 ] * vl_shape_[1 ]]) {
557- bool coincident {std::abs (token) == std::abs (on_surface)};
558- double d {model::surfaces[abs (token) - 1 ]->distance (r, u, coincident)};
559- if (d < min_dist) {
560- if (min_dist - d >= FP_PRECISION * min_dist) {
561- min_dist = d;
562- i_surf = -token;
563- }
564+ for (int token :
565+ vl_triso_distribution_[lat_ind[0 ] + lat_ind[1 ] * vl_shape_[0 ] +
566+ lat_ind[2 ] * vl_shape_[0 ] * vl_shape_[1 ]]) {
567+ bool coincident {std::abs (token) == std::abs (on_surface)};
568+ double d {model::surfaces[abs (token) - 1 ]->distance (r, u, coincident)};
569+ if (d < min_dist) {
570+ if (min_dist - d >= FP_PRECISION * min_dist) {
571+ min_dist = d;
572+ i_surf = -token;
564573 }
565574 }
575+ }
566576
567- int mes_bou_crossed = 0 ;
568- if (dis_to_bou[1 ] < dis_to_bou[0 ]) {
569- mes_bou_crossed = 1 ;
570- }
571- if (dis_to_bou[2 ] < dis_to_bou[mes_bou_crossed]) {
572- mes_bou_crossed = 2 ;
573- }
577+ int mes_bou_crossed = 0 ;
578+ if (dis_to_bou[1 ] < dis_to_bou[0 ]) {
579+ mes_bou_crossed = 1 ;
580+ }
581+ if (dis_to_bou[2 ] < dis_to_bou[mes_bou_crossed]) {
582+ mes_bou_crossed = 2 ;
583+ }
574584
575- tol_dis = dis_to_bou[mes_bou_crossed];
585+ tol_dis = dis_to_bou[mes_bou_crossed];
576586
577- if (min_dist < tol_dis) {
578- break ;
579- }
587+ if (min_dist < tol_dis) {
588+ break ;
589+ }
580590
581- if (norm_u[mes_bou_crossed] > 0 ) {
582- lat_ind[mes_bou_crossed] += 1 ;
583- } else {
584- lat_ind[mes_bou_crossed] += -1 ;
585- }
591+ if (norm_u[mes_bou_crossed] > 0 ) {
592+ lat_ind[mes_bou_crossed] += 1 ;
593+ } else {
594+ lat_ind[mes_bou_crossed] += -1 ;
595+ }
586596
587- dis_to_bou[mes_bou_crossed] += dis_to_bou_max[mes_bou_crossed];
597+ dis_to_bou[mes_bou_crossed] += dis_to_bou_max[mes_bou_crossed];
588598
589- if (tol_dis > max_dis) {
590- break ;
591- }
599+ if (tol_dis > max_dis) {
600+ break ;
592601 }
593-
594- } else {
595- return region_.distance (r, u, on_surface);
596602 }
597-
598603 return {min_dist, i_surf};
599604}
600605
0 commit comments