diff options
author | Eugeniy Mikhailov <evgmik@gmail.com> | 2013-01-16 14:27:10 -0500 |
---|---|---|
committer | Eugeniy Mikhailov <evgmik@gmail.com> | 2013-01-16 14:27:10 -0500 |
commit | 37d09478a8fca4e1229dcb1246c9f23f1f6118df (patch) | |
tree | 79e2d5f9179987b46b5b743c552c29f94ffb999e /beam_tracing/beam_trace.m | |
parent | 28ef703f718ce7f540864ca8f9a301f8d7d3f3e0 (diff) | |
download | wgmr-37d09478a8fca4e1229dcb1246c9f23f1f6118df.tar.gz wgmr-37d09478a8fca4e1229dcb1246c9f23f1f6118df.zip |
move code to directory with speaking name
Diffstat (limited to 'beam_tracing/beam_trace.m')
-rw-r--r-- | beam_tracing/beam_trace.m | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/beam_tracing/beam_trace.m b/beam_tracing/beam_trace.m new file mode 100644 index 0000000..90359d4 --- /dev/null +++ b/beam_tracing/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 + + |