diff --git a/RTX class/Antenna.m b/RTX class/Antenna.m index 2b72e07524f84c8ca705d3b7f14280cbe812b1be..1afd6347a348976898e0cd3034919159b1435960 100644 --- a/RTX class/Antenna.m +++ b/RTX class/Antenna.m @@ -17,16 +17,16 @@ classdef Antenna for j=1:length(obj.amplitude) obj.integral(j) = sum(amplitude(1:j)*dPhi); end - end + end - function [rays, complex_amplitudes] = generateRays(obj, phi) - rays(size(phi, 2)) = Ray; - for k = 1:size(phi, 2) - rays(k) = Ray(obj.position, [cos(phi(k)), sin(phi(k))]); - end - complex_amplitudes = obj.get_complex_amplitudes(phi); + function rays = generateRays(obj, phi) %TODO + complexAmplitudes = obj.get_complex_amplitudes(phi); + rays(1) = Ray(obj.position, [cos(phi(1)), sin(phi(1))]); + for k = 2:size(phi, 2) + rays(k) = Ray(obj.position, [cos(phi(k)), sin(phi(k))], complexAmplitudes(k-1)); + end end - + function rays = generateRaysB(obj, nRay) phi = linspace(0, 2*pi, length(obj.amplitude)); randArray = rand(1, nRay); @@ -34,7 +34,7 @@ classdef Antenna minval = min(abs(obj.integral - randArray(j)*obj.integral(end))); phiIndex = find(abs(obj.integral - randArray(j)*obj.integral(end)) == minval, 1, 'last'); phiRay = phi(phiIndex); - rays(j) = Ray(obj.position, [cos(phiRay), sin(phiRay)], obj.phase(phiIndex)); + rays(j) = Ray(obj.position, [cos(phiRay), sin(phiRay)], exp(1i*obj.phase(phiIndex))); end end @@ -47,6 +47,7 @@ classdef Antenna plot(obj.position.x, obj.position.y, 'kO', 'MarkerSize', 10); end end + methods(Access = protected) function complex_amplitudes = get_complex_amplitudes(obj, phi) n = size(phi, 2); @@ -77,3 +78,4 @@ classdef Antenna end end end + diff --git a/RTX class/BalazsAperture.m b/RTX class/BalazsAperture.m index 6c08f79145b357530a32b1b7a800fb664e23fee5..28dc8245558ad1b8fa2dcab9211fdca4fc97fbf6 100644 --- a/RTX class/BalazsAperture.m +++ b/RTX class/BalazsAperture.m @@ -35,7 +35,7 @@ classdef BalazsAperture < Barrier function post_collide(obj, col, trace) if (col.collided) %change from original i = floor(obj.nslice*(col.pos.y-obj.center.y+obj.size/2)/obj.size) + 1; - phase = trace.init_phase + 2*pi * mod(trace.length, trace.wavelength)/trace.wavelength; + phase = angle(trace.complexAmplitude) + 2*pi * mod(trace.length, trace.wavelength)/trace.wavelength; obj.collisions(i) = obj.collisions(i) + exp(1i*phase); end end diff --git a/RTX class/Ray.m b/RTX class/Ray.m index ced16c0d423a1497af364e2a72eac25977923e5e..bffb5f778fe20ca9e37bf6a3c62f11caa6a9bc9a 100644 --- a/RTX class/Ray.m +++ b/RTX class/Ray.m @@ -2,14 +2,14 @@ classdef Ray properties start Vect = Vect; dir Vect = Vect; - initPhase = 0; + complexAmplitude = 0; end methods - function obj = Ray(start, dir, initPhase) + function obj = Ray(start, dir, complexAmplitude) obj.start = start; obj.dir = dir; if nargin == 3 - obj.initPhase = initPhase; + obj.complexAmplitude = complexAmplitude; end end end diff --git a/RTX class/Segment.m b/RTX class/Segment.m index b75c205d5af1ba71ba0548ab694b2c0e7f29d52d..38c47e81aabc54c4e37b4c816de9fae54bab385c 100644 --- a/RTX class/Segment.m +++ b/RTX class/Segment.m @@ -69,4 +69,4 @@ classdef Segment segments = segments(1:n-1); end end -end \ No newline at end of file +end diff --git a/RTX class/SegmentedAperture.m b/RTX class/SegmentedAperture.m new file mode 100644 index 0000000000000000000000000000000000000000..10cb7a057d6c161e750177192af44f8e42f791e7 --- /dev/null +++ b/RTX class/SegmentedAperture.m @@ -0,0 +1,48 @@ +classdef SegmentedAperture < Barrier + properties + center Vect = Vect; % center position + size double = 0; % full size of reflector (end to end) + color = [0.5 0.5 0.5]; + width = 2; + segments Segment; + prevTrace = Trace(Inf, Ray([0 0],[0 0], 0), 0, [], 0); + prevCol; + end + methods + function obj = SegmentedAperture(center, size) + if nargin == 2 + obj.center = center; + obj.size = size; + end + end + + function col = collide(obj, ray) % override this function with custom collision + col = Collision; + col.stop = true; + + k = (obj.center.x - ray.start.x)/ray.dir.x; + col.pos = ray.start + k*ray.dir; + col.reflDir = Vect(-ray.dir.x, ray.dir.y); + if abs(col.pos.y - obj.center.y) < obj.size/2 && k*ray.dir.mag > 1e-6 + col.collided = true; + else + col.collided = false; + end + end + + function post_collide(obj, col, trace) + if trace.id == obj.prevTrace.id+1 && abs(trace.complexAmplitude) > 0 + segmentSize = abs(obj.prevCol.pos.y - col.pos.y); + obj.segments(end+1) = Segment(obj.prevCol.pos.y, col.pos.y, abs(trace.complexAmplitude)/segmentSize); + end + obj.prevTrace = trace; + obj.prevCol = col; + end + + function plot_self(obj) + plot([obj.center.x obj.center.x],... + [obj.center.y - obj.size/2, obj.center.y + obj.size/2],... + 'LineWidth', obj.width, 'Color', obj.color); + end + end +end diff --git a/RTX class/Trace.m b/RTX class/Trace.m index e1442eb729f93d10453ae146c0a8605344c872df..e6f12d4fd9e8b4d63e5c9d7b44bb5cf8103828e0 100644 --- a/RTX class/Trace.m +++ b/RTX class/Trace.m @@ -5,15 +5,15 @@ classdef Trace < handle wavelength; rays Ray; length = +inf; - init_phase = 0; - + complexAmplitude = 0; + end methods - function obj = Trace(id, init_ray, wavelength, barriers, maxCol) + function obj = Trace(id, initRay, wavelength, barriers, maxCol) obj.id = id; - obj.rays(1) = init_ray; - obj.init_phase = init_ray.initPhase; + obj.rays(1) = initRay; + obj.complexAmplitude = initRay.complexAmplitude; obj.wavelength = wavelength; ncol = 0; @@ -25,7 +25,7 @@ classdef Trace < handle for k = 1:size(barriers,2) c = barriers(k).collide(obj.rays(ncol+1)); % get collision from the 'k'th barrier if (c.collided) - d = Vect.abs(c.pos - init_ray.start); + d = Vect.abs(c.pos - initRay.start); if d < dist dist = d; col = c; @@ -56,9 +56,9 @@ classdef Trace < handle length = obj.length; end - function plot_trace(obj, stop, color, linewidth) + function plot_trace(obj, stop, color, lineWidth) if nargin < 4 - linewidth = 1; + lineWidth = 1; end if nargin < 3 color = 'r'; @@ -73,7 +73,9 @@ classdef Trace < handle x(k) = obj.rays(k).start.x; y(k) = obj.rays(k).start.y; end - plot(x, y, 'Color', color, 'LineWidth', linewidth); + plot(x, y, 'Color', color, 'LineWidth', lineWidth); end end end + + diff --git a/RTX class/segment_test.m b/RTX class/segment_test.m new file mode 100644 index 0000000000000000000000000000000000000000..1d3ae688220fb540cb2df94a055fd06c0e45cfc8 --- /dev/null +++ b/RTX class/segment_test.m @@ -0,0 +1,43 @@ +clear +close all + +progressBar1 = waitbar(0,'Generating rays...','Name','Tracing rays...',... + 'CreateCancelBtn','setappdata(gcbf,''canceling'',1)'); +setappdata(progressBar1,'canceling',0); + + + +reflectors = PlaneReflector.empty; +reflectors(end+1) = PlaneReflector([2 0], 2); +reflectors(end+1) = ParabolaReflector([0 0], 4, 3); +reflectors(end+1) = SegmentedAperture([3 0], 20); + +n = 100; +wavelength = 3e8/1e9; +stepSize = n/100; + +antenna = Antenna(Vect(1,0), [ones(1,125), zeros(1,750), ones(1,125)], zeros(1,1000)); +rays = antenna.generateRays(linspace(0,2*pi,n)); + +figure(1); +plot(0, 0); +xlim([0 4]); +ylim([-4 4]); +hold on; +antenna.plot_antenna(); +for k = 1:size(reflectors, 2) + reflectors(k).plot_self; +end + +for k = 1:size(rays, 2) + if getappdata(progressBar1,'canceling') + break; + end + if mod(k, stepSize) == 0 + waitbar(k/n,progressBar1,sprintf('Tracing rays... [%0.1f%%]',k/n*100)); + end + traces(k) = Trace(k, rays(k), wavelength, reflectors, 5); + traces(k).plot_trace(4); +end +delete(progressBar1) +hold off;