diff --git a/RTX class/Segment.m b/RTX class/Segment.m new file mode 100644 index 0000000000000000000000000000000000000000..b75c205d5af1ba71ba0548ab694b2c0e7f29d52d --- /dev/null +++ b/RTX class/Segment.m @@ -0,0 +1,72 @@ +classdef Segment + properties + posStart double = 0; + posEnd double = 0; + powDens double = 0; + end + methods + function obj = Segment(posStart, posEnd, powDens) + if nargin == 0 + obj.posStart = 0; + obj.posEnd = 0; + obj.powDens = 0; + elseif nargin == 1 %constructor from vector + obj.posStart = posStart(1); + obj.posEnd = posStart(2); + obj.powDens = 0; + elseif nargin == 2 + obj.posStart = posStart; + obj.posEnd = posEnd; + obj.powDens = 0; + elseif nargin >= 3 + obj.posStart = posStart; + obj.posEnd = posEnd; + obj.powDens = powDens; + end + if obj.posStart > obj.posEnd + tmp = obj.posStart; + obj.posStart = obj.posEnd; + obj.posEnd = tmp; + end + end + end + methods (Static) + function segments = split(seg1, seg2) + % seg1 before seg2 (if not, then swap) + if seg1.posStart > seg1.posStart + s = seg1; + seg1 = seg2; + seg2 = s; + end + segments = []; + if seg1.posEnd < seg2.posStart % no overlap + % |---| + % |---| + segments = [seg1, seg2]; + elseif seg1.posEnd < seg2.posEnd + % |---| + % |---| + segments = [Segment(seg1.posStart, seg2.posStart, seg1.powDens), ... + Segment(seg2.posStart, seg1.posEnd, seg1.powDens + seg2.powDens), ... + Segment(seg1.posEnd, seg2.posEnd, seg2.powDens)]; + else + % |-------| + % |---| + segments = [Segment(seg1.posStart, seg2.posStart, seg1.powDens), ... + Segment(seg2.posStart, seg2.posEnd, seg1.powDens + seg2.powDens), ... + Segment(seg2.posEnd, seg2.posEnd, seg2.powDens)]; + end + % Segments that has 0 width are not needed. + % e.g.: |----| + % |--| + n = 1; + for k = 1:size(segments,2) + if segments(k).posStart < segments(k).posEnd + segments(n) = segments(k); + n = n + 1; + end + end + segments = segments(1:n-1); + end + end +end \ No newline at end of file