summaryrefslogtreecommitdiff
path: root/beam_tracing/octave/beam_trace.m
diff options
context:
space:
mode:
Diffstat (limited to 'beam_tracing/octave/beam_trace.m')
-rw-r--r--beam_tracing/octave/beam_trace.m47
1 files changed, 47 insertions, 0 deletions
diff --git a/beam_tracing/octave/beam_trace.m b/beam_tracing/octave/beam_trace.m
new file mode 100644
index 0000000..90359d4
--- /dev/null
+++ b/beam_tracing/octave/beam_trace.m
@@ -0,0 +1,47 @@
+function [processed_beams] = beam_trace(beams, faces, borders, border_limits)
+ %% trace beam and all it reflections and refractions on faces
+ % for beams and faces structure description see face_beam_interaction.m
+ % border similar to faces cell array which enclose the beam
+ % i.e. it does not leave the polygon consisting of border faces
+
+ intensity_threshold = 1e-3; % intensity of the weakest beam which we still trace
+ processed_beams = {};
+
+ Nbeams=size(beams)(2);
+ if ( Nbeams == 0 )
+ % no more beam to trace
+ return;
+ end
+
+ % trace each beam in beams cell array
+ for i=1:Nbeams
+ beam=beams{i};
+ [is_face_hit, hit_position, hit_distance, new_beams] = face_beam_interaction(beam, faces);
+ if (is_face_hit)
+ beams{i}.hit_position=hit_position;
+ %% remove beams which are to weak to trace
+ N_new_beams=size(new_beams)(2);
+ intense_enough_beams={};
+ intense_beams_counter=0;
+ for k=1:N_new_beams
+ if ( new_beams{k}.intensity >= intensity_threshold )
+ intense_beams_counter=intense_beams_counter + 1;
+ intense_enough_beams{intense_beams_counter}=new_beams{k};
+ end
+ end
+ [new_processed_beams] = beam_trace(intense_enough_beams, faces, borders, border_limits);
+ processed_beams=cat(2,processed_beams, new_processed_beams);
+ else
+ % beam does not hit face but it should stop and borders
+ beam.face=NA;
+ [is_face_hit, hit_position, hit_distance, new_beams] = face_beam_interaction(beam, borders);
+ if (!is_face_hit)
+ error('borders are badly defined, the beam misses them');
+ end
+ beams{i}.hit_position=hit_position;
+ end
+ end
+ processed_beams=cat(2,beams, processed_beams);
+end
+
+