From 2e6895ec0b70ba97e06c00f0447f86ad162181fd Mon Sep 17 00:00:00 2001 From: Eugeniy Mikhailov Date: Thu, 7 Jul 2011 01:21:13 -0400 Subject: arbitrary beam tracing --- beam2face_distance.m | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 beam2face_distance.m (limited to 'beam2face_distance.m') diff --git a/beam2face_distance.m b/beam2face_distance.m new file mode 100644 index 0000000..ba3d16b --- /dev/null +++ b/beam2face_distance.m @@ -0,0 +1,36 @@ +function [hit_distance, hit_position, is_face_hit] = beam2face_distance(beam,face) + %% return distance to face if beam hits it or infinity otherwise + % for beams and faces structure description see face_beam_interaction.m + + k = beam.k; + % face direction or kf + kf=face.vertex2 - face.vertex1; % not a unit vector + + %% let's find the intersection of lines passing through face and light beam + % we introduce parameters tb and tf + % which define distance (in arb. units) along k vectors + % we are solving + % xb_o+ k_x*tb = v1_x+ kf_x*tf + % yb_o+ k_y*tb = v1_y+ kf_y*tf + % A*t = B + A = [ k(1) , -kf(1); k(2), -kf(2)]; + B= [ face.vertex1(1)-beam.origin(1); face.vertex1(2)-beam.origin(2) ]; + t = A\B; tb=t(1); tf=t(2); + + % beam intersects face only if 0<=tf<=1 and tb>=0 + if ( (0 <= tf) && (tf<=1) && tb >=0 ) + % intersection, beam hits the face + is_face_hit = true; + else + % beam misses the face + is_face_hit = false; + hit_position = [NA, NA]; + hit_distance = Inf; + return; + end + + % calculating hit position + hit_position=face.vertex1+kf*tf; + hit_distance = tb; % distance along the light beam +end + -- cgit v1.2.3