Chi-Tech
raytracer_2D_polygon.cc
Go to the documentation of this file.
1#include "raytracing.h"
2
3#include "mesh/Cell/cell.h"
5
6//###################################################################
7/**Performs raytracing within a 2D Polygon.*/
9 Vector3 &pos_i,
10 Vector3 &omega_i,
11 bool& intersection_found,
12 bool& backward_tolerance_hit,
14{
15 const auto& grid = Grid();
16 chi_mesh::Vector3 ip; //intersection point
17
18 const double fabs_mu = std::fabs(omega_i.Dot(cell.faces_[0].normal_));
19
20 double d_extend = (fabs_mu<1.0e-15)? 1.0e15 : extension_distance_ / fabs_mu;
21
22 chi_mesh::Vector3 pos_f_line = pos_i + omega_i * d_extend;
23
24 std::vector<RayTracerOutputInformation> face_intersections;
25
26 size_t num_faces = cell.faces_.size();
27 face_intersections.reserve(num_faces);
28 for (int f=0; f<num_faces; f++)
29 {
30 if (cell.faces_[f].normal_.Dot(omega_i) < 0.0) continue;
31
33
34 uint64_t fpi = cell.faces_[f].vertex_ids_[0]; //face point index 0
35 uint64_t fpf = cell.faces_[f].vertex_ids_[1]; //face point index 1
36 const chi_mesh::Vertex& face_point_i = grid.vertices[fpi];
37 const chi_mesh::Vertex& face_point_f = grid.vertices[fpf];
38
39 bool intersects = chi_mesh::CheckLineIntersectStrip(
40 face_point_i, face_point_f, cell.faces_[f].normal_,
41 pos_i, pos_f_line, ip);
42
43 double D = (ip - pos_i).Norm();
44
45 if ((D > backward_tolerance_) and intersects )
46 {
47 face_oi.distance_to_surface = D;
48 face_oi.pos_f = ip;
49
50 face_oi.destination_face_index = f;
51 face_oi.destination_face_neighbor = cell.faces_[f].neighbor_id_;
52 intersection_found = true;
53 face_intersections.emplace_back(std::move(face_oi));
54 if (not perform_concavity_checks_) break;
55 }//if intersects
56 if ((D < backward_tolerance_) and intersects )
57 backward_tolerance_hit = true;
58 }//for faces
59
60 //======================================== Determine closest intersection
61 if (not perform_concavity_checks_ and not face_intersections.empty())
62 oi = face_intersections.back();
63 else if (perform_concavity_checks_ and not face_intersections.empty())
64 {
65 auto closest_intersection = &face_intersections.back();
66 for (auto& intersection : face_intersections)
67 if (intersection.distance_to_surface <
68 closest_intersection->distance_to_surface)
69 closest_intersection = &intersection;
70
71 oi = *closest_intersection;
72 }
73 else
74 {
76 blank_oi.distance_to_surface = 1.0e15;
77 oi = blank_oi;
78 }
79}
std::vector< CellFace > faces_
Definition: cell.h:82
bool perform_concavity_checks_
Definition: raytracing.h:29
double extension_distance_
Definition: raytracing.h:28
double backward_tolerance_
Definition: raytracing.h:27
void TracePolygon(const Cell &cell, Vector3 &pos_i, Vector3 &omega_i, bool &intersection_found, bool &backward_tolerance_hit, RayTracerOutputInformation &oi)
const chi_mesh::MeshContinuum & Grid() const
Definition: raytracer.cc:7
bool CheckLineIntersectStrip(const chi_mesh::Vector3 &strip_point0, const chi_mesh::Vector3 &strip_point1, const chi_mesh::Vector3 &strip_normal, const chi_mesh::Vector3 &line_point0, const chi_mesh::Vector3 &line_point1, chi_mesh::Vector3 &intersection_point, double *distance_to_intersection=nullptr)
Vector3 Dot(const chi_mesh::TensorRank2Dim3 &that) const