diff --git a/RTX class/Antenna.m b/RTX class/Antenna.m index 94ab99aebd195a8eada6d522b4117ffb2701c4c9..94f8017fcc71660adda1d4fa5d1baecca13cb708 100644 --- a/RTX class/Antenna.m +++ b/RTX class/Antenna.m @@ -1,16 +1,38 @@ classdef Antenna properties amplitude = ones(1, 1000); - phase = ones(1, 1000); + phase = zeros(1, 1000); + position Vect; end methods - function obj = Antenna(amplitude ,phase) - obj.amplitude = amplitude; - obj.phase = phase; - end + function obj = Antenna(position, amplitude ,phase) + obj.position = position; + if nargin > 1 + obj.amplitude = amplitude; + obj.phase = phase; + end + end + + function [rays, complex_amplitudes] = generate_rays(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); + end - function complex_amplitude = get_ray_data(obj, phi) + function plot_characteristics(obj) + phi = linspace(0,2*pi,1000); + polarplot(phi, obj.amplitude, phi, obj.phase); + end + + function plot_antenna(obj) + 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); rpower = zeros(1, n-1); rphase = zeros(1, n-1); @@ -25,8 +47,8 @@ classdef Antenna dphi = 2 * pi / size(obj.amplitude, 2); for j = 1:n-1 - [m, start_index] = min(abs(data_phi - phi(j))); - [m, stop_index] = min(abs(data_phi - phi(j+1))); + [~, start_index] = min(abs(data_phi - phi(j))); + [~, stop_index] = min(abs(data_phi - phi(j+1))); for k = start_index:stop_index if j ~= 1 && k == start_index continue; @@ -35,13 +57,7 @@ classdef Antenna end rphase(j) = obj.phase(ceil((start_index + stop_index) / 2)); end - complex_amplitude = rpower.*exp(1i*rphase); + complex_amplitudes = rpower.*exp(1i*rphase); end - - function plot(obj) - phi = linspace(0,2*pi,1000); - polarplot(phi, obj.amplitude, phi, obj.phase); - end end end - diff --git a/RTX class/Ray.m b/RTX class/Ray.m index c017f32489c6f66963a7d6f19e0dcd2c9036acae..df985ce10b8154f16cb82afa26a8ba8eac0d4b42 100644 --- a/RTX class/Ray.m +++ b/RTX class/Ray.m @@ -10,39 +10,5 @@ classdef Ray obj.dir = dir; end end - function t = trace(obj, barriers, maxCol) - t = Trace(obj); - ncol = 0; - for m = 1:maxCol - col = Collision; - col.collided = false; - dist = +Inf; - col_barrier = 1; - for k = 1:size(barriers,2) - c = barriers(k).collide(t.rays(ncol+1)); % get collision from the 'k'th barrier - if (c.collided) - d = Vect.abs(c.pos - obj.start); - if d < dist - dist = d; - col = c; - col_barrier = k; - end - end - end - if col.collided - ncol = ncol + 1; - next_ray = Ray(col.pos, col.reflDir); - t = t + next_ray; - barriers(col_barrier).post_collide(col); - if col.stop - t.trace_end(); - %Nem tudom ez mire való: rays(m+1).dir = Vect; - break; - end - else - break; - end - end - end end end diff --git a/RTX class/Trace.m b/RTX class/Trace.m index 3c5a8cd1cf8f8b1971796b65fb491729714955c1..fb0b15c2e13bfa1779fd872f4aa163afc3649326 100644 --- a/RTX class/Trace.m +++ b/RTX class/Trace.m @@ -1,6 +1,8 @@ classdef Trace < handle properties + id; + wavelength; rays Ray = []; length = +inf; init_phase = 0; @@ -8,20 +10,42 @@ classdef Trace < handle end methods - function obj = Trace(rays, init_phase) - if isvector(rays) - obj.rays = rays; - return - else - obj.rays(1) = rays; + function obj = Trace(id, init_ray, init_phase, wavelength, barriers, maxCol) + obj.id = id; + obj.rays(1) = init_ray; + obj.init_phase = init_phase; + obj.wavelength = wavelength; + + ncol = 0; + for m = 1:maxCol + col = Collision; + col.collided = false; + dist = +Inf; + col_barrier = 1; + 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); + if d < dist + dist = d; + col = c; + col_barrier = k; + end + end + end + if col.collided + ncol = ncol + 1; + next_ray = Ray(col.pos, col.reflDir); + obj.rays(end+1) = next_ray; + barriers(col_barrier).post_collide(col); + if col.stop + obj.trace_end(); + break; + end + else + break; + end end - if nargin == 2 - obj.init_phase = init_phase; - end - end - - function p = plus(t,r) - p = Trace([t.rays r], t.init_phase); end function length = trace_end(obj) diff --git a/RTX class/simclass_test.m b/RTX class/simclass_test.m index 4daa74a9133c0362282a985ea147fcdbcfb9760c..fc71a75983ce8c8aa4c9e27c34130f99a60175f4 100644 --- a/RTX class/simclass_test.m +++ b/RTX class/simclass_test.m @@ -3,24 +3,22 @@ reflectors(end+1) = PlaneReflector([2 0], 2); reflectors(end+1) = ParabolaReflector([0 0], 4, 3); reflectors(end+1) = BalazsAperture([3 0], 20, 1000); -start = Vect(1, 0); -n_ray = 10000; -phi_start = -pi;%angle(1-1i); -phi_stop = pi;%angle(1+1i); -phi = linspace(phi_start, phi_stop, n_ray); -rays(n_ray) = Ray; -for k = 1:size(phi, 2) - rays(k) = Ray(start, [cos(phi(k)), sin(phi(k))]); -end +phi_start = -pi; +phi_stop = pi; +n = 1000; +wavelength = 3e8/1e9; + +antenna = Antenna(Vect(1,0)); +[rays, complex_amplitudes] = antenna.generate_rays(linspace(phi_start, phi_stop, n)); figure(1); plot(0, 0); hold on; -for k = 1:n_ray - t = rays(k).trace(reflectors, 5); +for k = 1:size(rays, 2) + t = Trace(k, rays(k), 0, wavelength, reflectors, 5); %t.plot_trace(); end -plot(start.x, start.y, 'kO', 'MarkerSize', 10); +antenna.plot_antenna(); for k = 1:size(reflectors, 2) reflectors(k).plot_self; end @@ -37,4 +35,3 @@ plot(histogram); %field = field/max(field); %plot(20*log10(field)); -