diff --git a/RTX class/FarField.m b/RTX class/FarField.m index 3d7498b96e56bf2f4a8210119e6e729239f3c38d..07a28884c1b63c60b7371c09d95d81a2c3f0dd87 100644 --- a/RTX class/FarField.m +++ b/RTX class/FarField.m @@ -6,14 +6,18 @@ classdef FarField < handle wavelength; theta; nFi; + segArray; end methods - function obj = FarField(aperture, theta, nFi, wavelength) + function obj = FarField(aperture, theta, nFi, wavelength, segArray) obj.aperture = aperture; obj.wavelength = wavelength; obj.theta = theta; obj.nFi = nFi; + if nargin > 4 + obj.segArray = segArray; + end end function field = calculate(obj) @@ -22,15 +26,29 @@ classdef FarField < handle setappdata(progressBar2,'canceling',0); nTheta = length(obj.theta); stepSize = nTheta/100; + isemp = ~isprop(obj.aperture, 'segments'); - histogram = obj.aperture. getCollisionHistogram(); + if isemp + hist = obj.aperture.getCollisionHistogram(); + else + [hist, starts, ends] = obj.aperture.getCollisionHistogram(); + end field = zeros(1, nTheta); fi = linspace(0, 2*pi, obj.nFi); - nr = floor(length(histogram)/2); - r = linspace(0, obj.aperture.size/2, nr); + nr = floor(length(hist)/2); c1 = (obj.aperture.size/(2*nr))*2*pi/obj.nFi; c2 = 1i*2*pi/obj.wavelength; - + if isemp + r = linspace(0, obj.aperture.size/2, nr); + obj.areas = r*c1; + else + first = max(find(starts > 0, 1), find(ends > 0, 1)); + starts = starts(first:end); + ends = ends(first:end); + r = abs(starts); + nr = length(r); + c_areas = (ends - starts)*2*pi/obj.nFi; + end for i = 1:nTheta if getappdata(progressBar2,'canceling') @@ -41,11 +59,15 @@ classdef FarField < handle end c3 = c2*sin(obj.theta(i)); for j = 1:nr - area = r(j) * c1; + if isemp + area = r(j) * c1; + else + area = r(j) * c_areas(j); + end c4 = c3*r(j); - ind = 2*nr-j+1; + ind = length(hist)-nr+j; for k = 1:obj.nFi - field(i) = field(i) + histogram(ind)*exp(c4*sin(fi(k)))*area; + field(i) = field(i) + hist(ind)*exp(c4*sin(fi(k)))*area; end end end diff --git a/RTX class/RTX.m b/RTX class/RTX.m index 5666fd637140dbeb324c80b19330cba8ed0c6299..bcc70b6a5f353ba78042698de9120cffab244174 100644 --- a/RTX class/RTX.m +++ b/RTX class/RTX.m @@ -36,7 +36,11 @@ classdef RTX < handle 'CreateCancelBtn','setappdata(gcbf,''canceling'',1)'); setappdata(progBar,'canceling',0); stepSize = obj.nRay/100; - obj.rays = obj.antenna.generateRaysB(obj.nRay); + if isa(obj.aperture, 'SegmentedAperture') + obj.rays = obj.antenna.generateRays(linspace(0,2*pi, obj.nRay)); + else + obj.rays = obj.antenna.generateRaysB(obj.nRay); + end for j = 1:obj.nRay if getappdata(progBar,'canceling') break; @@ -60,7 +64,11 @@ classdef RTX < handle if isempty(obj.traces) obj.trace(); end - obj.farField = FarField(obj.aperture, theta, nFi, obj.wavelength); + if isprop(obj.aperture, 'segments') + obj.farField = FarField(obj.aperture, theta, nFi, obj.wavelength, obj.aperture.segments); + else + obj.farField = FarField(obj.aperture, theta, nFi, obj.wavelength); + end field = obj.farField.calculate(); end diff --git a/RTX class/Segment.m b/RTX class/Segment.m index 6bfac7145a0f4eb8e4577561cbc7b38c7eae5dcd..dc17e9f147ab902e26d1634e866c1a40202d58ec 100644 --- a/RTX class/Segment.m +++ b/RTX class/Segment.m @@ -2,7 +2,7 @@ classdef Segment properties posStart double = 0; posEnd double = 0; - powDens double = 0; + powDens; end methods function obj = Segment(posStart, posEnd, powDens) diff --git a/RTX class/SegmentedAperture.m b/RTX class/SegmentedAperture.m index 10cb7a057d6c161e750177192af44f8e42f791e7..14a61064f8d50674a7db149cce0b8e588419cc24 100644 --- a/RTX class/SegmentedAperture.m +++ b/RTX class/SegmentedAperture.m @@ -1,10 +1,6 @@ -classdef SegmentedAperture < Barrier +classdef SegmentedAperture < Aperture 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; + segments SegmentArray; prevTrace = Trace(Inf, Ray([0 0],[0 0], 0), 0, [], 0); prevCol; end @@ -14,35 +10,37 @@ classdef SegmentedAperture < Barrier 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 + obj.segments = SegmentArray(); 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); + if length(trace.rays) == length(obj.prevTrace.rays) + segmentSize = abs(obj.prevCol.pos.y - col.pos.y); + obj.segments.add(Segment(obj.prevCol.pos.y, col.pos.y, ... + trace.complexAmplitude/segmentSize * exp(1i*mod(trace.length, trace.wavelength)))); + end 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); + function [histogram, xStart, xStop] = getCollisionHistogram(obj) + obj.segments = obj.segments.doTheThing2(); + histogram = [obj.segments.segs.powDens]; + xStart = [obj.segments.segs.posStart]; + xStop = [obj.segments.segs.posEnd]; + end + + function plotApertureField(obj) + figure; + [histogram,x1, x2] = obj.getCollisionHistogram(); + plot(0, 0); + hold on; + for k = 1:length(histogram) + plot([x1(k) x2(k)], [abs(histogram(k)), abs(histogram(k))],'b'); + end + hold off; end end end diff --git a/RTX class/Trace.m b/RTX class/Trace.m index e6f12d4fd9e8b4d63e5c9d7b44bb5cf8103828e0..e55bd420bbeb77fb01d43466790f423071fbcfe4 100644 --- a/RTX class/Trace.m +++ b/RTX class/Trace.m @@ -66,7 +66,7 @@ classdef Trace < handle if nargin < 2 stop = size(obj.rays,2); end - stop = min([stop size(obj.rays,2)]); + stop = min([stop+1 size(obj.rays,2)]); x = zeros(1,stop); y = zeros(1,stop); for k = 1:stop diff --git a/RTX class/rtx_test.m b/RTX class/rtx_test.m index 661afd23d5d9f267cb8bfa2ea3176365861ec52c..50ce76dfb116931be0ed865f59b830020e5c271f 100644 --- a/RTX class/rtx_test.m +++ b/RTX class/rtx_test.m @@ -1,11 +1,21 @@ -clear -close all +%clear +%close all reflectors = [PlaneReflector([2 0], 2), ParabolaReflector([0 0], 4, 3)]; -aperture = BalazsAperture([3 0], 20, 1000); +%reflectors = [PlaneReflector([-1 1], 0)]; +aperture = BalazsAperture([3 0], 20, 400); +aperture2 = SegmentedAperture([3 0], 20); antenna = Antenna(Vect(1,0), [ones(1,125), zeros(1,750), ones(1,125)], zeros(1,1000)); +%antenna = Antenna(Vect(1,0)); wavelength = 3e8/1e9; -nRay = 1000; +nRay = 10000; +nRay2 = 1000; rtx = RTX(reflectors, aperture, antenna, wavelength, nRay); +rtx.trace(); +rtx.plotApertureField(); rtx.plotFarField(); +rtx2 = RTX(reflectors, aperture2, antenna, wavelength, nRay2); +rtx2.trace(); +rtx2.plotApertureField(); +rtx2.plotFarField(); diff --git a/RTX class/segment_test.m b/RTX class/segment_test.m index 1d3ae688220fb540cb2df94a055fd06c0e45cfc8..e8864889e3b3126820500360f7de33c67da2f62b 100644 --- a/RTX class/segment_test.m +++ b/RTX class/segment_test.m @@ -1,5 +1,5 @@ clear -close all +%close all progressBar1 = waitbar(0,'Generating rays...','Name','Tracing rays...',... 'CreateCancelBtn','setappdata(gcbf,''canceling'',1)'); @@ -8,18 +8,20 @@ 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) = PlaneReflector([2 0], 2); +%reflectors(end+1) = ParabolaReflector([0 0], 4, 3); reflectors(end+1) = SegmentedAperture([3 0], 20); -n = 100; +n = 1000; wavelength = 3e8/1e9; stepSize = n/100; -antenna = Antenna(Vect(1,0), [ones(1,125), zeros(1,750), ones(1,125)], zeros(1,1000)); +%antenna = Antenna(Vect(1,0), [zeros(1,125), 1, zeros(1,124), zeros(1,20), ones(1, 50), zeros(1, 180), zeros(1,500)], zeros(1,1000)); +%antenna = Antenna(Vect(1,0), [zeros(1,125), 1, zeros(1,124), zeros(1,188), ones(1,1), zeros(1,61) zeros(1,500)], zeros(1,1000)); +antenna = Antenna(Vect(1,0)); rays = antenna.generateRays(linspace(0,2*pi,n)); -figure(1); +figure(3); plot(0, 0); xlim([0 4]); ylim([-4 4]); @@ -36,8 +38,24 @@ for k = 1:size(rays, 2) 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); + traces(k) = Trace(k, rays(k), wavelength, reflectors, 10); + if abs(traces(k).complexAmplitude) > 0 + %traces(k).plot_trace(10); + end end delete(progressBar1) hold off; + +figure(4); +[histogram,x1, x2] = reflectors(end).getCollisionHistogram(); +plot(0, 0); +hold on; +for k = 1:length(histogram) + plot([x1(k) x2(k)], [abs(histogram(k)), abs(histogram(k))],'b'); +end +hold off; + +%interpolate +x = linspace(-10, 10, 1000); + + diff --git a/RTX class/simclass_test.m b/RTX class/simclass_test.m index 20c33733fd1227c1b4e4247650f0c21415cf4cc9..dd0dfbdc085c73faa9ea80dd870c5891e93a1caa 100644 --- a/RTX class/simclass_test.m +++ b/RTX class/simclass_test.m @@ -1,5 +1,5 @@ clear -close all +%close all progressBar1 = waitbar(0,'Generating rays...','Name','Tracing rays...',... 'CreateCancelBtn','setappdata(gcbf,''canceling'',1)'); diff --git a/RTX class/testSegmentArray.m b/RTX class/testSegmentArray.m index 7c6040d78e0c864094ff975c3d08a13d07cad1cc..0570f15ef43faddb9a3e54b2261033d483bf1d67 100644 --- a/RTX class/testSegmentArray.m +++ b/RTX class/testSegmentArray.m @@ -2,7 +2,7 @@ segs = SegmentArray(); % segs.add(Segment(4, 10, 1)); % segs.add(Segment(4, 8, 1)); % segs.add(Segment(7, 8, 1)); -for k = 1:1000 +for k = 1:10 segs.add(Segment(randi(200),randi(200),randi(20))); end y = [1:length(segs.segs); 1:length(segs.segs)];