diff --git a/RTX class/Segment.m b/RTX class/Segment.m index 38c47e81aabc54c4e37b4c816de9fae54bab385c..6bfac7145a0f4eb8e4577561cbc7b38c7eae5dcd 100644 --- a/RTX class/Segment.m +++ b/RTX class/Segment.m @@ -31,42 +31,53 @@ classdef Segment 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 +% function yes = overlap(seg1, seg2) +% yes = false; +% if seg1.posStart > seg1.posStart +% s = seg1; +% seg1 = seg2; +% seg2 = s; +% end +% if (seg1.posEnd > seg2.posStart) +% yes = true; +% end +% end +% 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 diff --git a/RTX class/SegmentArray.m b/RTX class/SegmentArray.m new file mode 100644 index 0000000000000000000000000000000000000000..8afc10f87035e11072617eb750efc0a745edae3c --- /dev/null +++ b/RTX class/SegmentArray.m @@ -0,0 +1,50 @@ +classdef SegmentArray < handle + properties + segs; + end + methods + function obj = SegmentArray() + obj.segs = Segment.empty(); + end + function add(obj, seg) + if length(obj.segs) == 0 + obj.segs(1) = seg; + else + added = false; + for k = 1:length(obj.segs) + if (obj.segs(k).posStart > seg.posStart) || ... + (obj.segs(k).posStart == seg.posStart && ... + obj.segs(k).posEnd > seg.posEnd) + obj.segs = [obj.segs(1:k-1), seg, obj.segs(k:end)]; + added = true; + break; + end + end + if ~added + obj.segs = [obj.segs(1:end) seg]; + end + end + end + function remove(obj, idx) + obj.segs = [obj.segs(1:idx-1) obj.segs(idx + 1:end)]; + end + function sort(obj) + [~, ind] = sort([obj.segs.posStart]); + obj.segs = obj.segs(ind); + end + function newSegments = doTheThing2(obj) + newArray = unique(sort([obj.segs.posStart, obj.segs.posEnd])); + powDens = zeros(size(newArray)); + newSegments = SegmentArray(); + for k = 1:length(newArray)-1 + idx = find([obj.segs.posStart]<=newArray(k) & [obj.segs.posEnd]>=newArray(k+1)); + dens = [obj.segs.powDens]; + powDens(k) = sum(dens(idx)); + newSegments.add(Segment(newArray(k), newArray(k+1), powDens(k))); + end + end + function plot(obj) + + end + end +end \ No newline at end of file diff --git a/RTX class/testSegmentArray.m b/RTX class/testSegmentArray.m new file mode 100644 index 0000000000000000000000000000000000000000..7c6040d78e0c864094ff975c3d08a13d07cad1cc --- /dev/null +++ b/RTX class/testSegmentArray.m @@ -0,0 +1,28 @@ +segs = SegmentArray(); +% segs.add(Segment(4, 10, 1)); +% segs.add(Segment(4, 8, 1)); +% segs.add(Segment(7, 8, 1)); +for k = 1:1000 + segs.add(Segment(randi(200),randi(200),randi(20))); +end +y = [1:length(segs.segs); 1:length(segs.segs)]; +y = y(:)'; +figure(1); +plot(0,0); +hold on; +dens = [segs.segs.powDens]; +L = strsplit(sprintf('%.1f\n', dens(:)), '\n'); +for k = 1:length(segs.segs) + plot([segs.segs(k).posStart, segs.segs(k).posEnd], [k+0.5 k+0.5], 'r'); + text(segs.segs(k).posStart, k+0.5, L(k)); +end +segs1 = segs; +% segs.doTheThing(); +segs = segs.doTheThing2(); +dens = [segs.segs.powDens]; +L = strsplit(sprintf('%.1f\n', dens(:)), '\n'); +for k = 1:length(segs.segs) + plot([segs.segs(k).posStart, segs.segs(k).posEnd], [k k], 'b'); + text(segs.segs(k).posStart, k, L(k)); +end +hold off; \ No newline at end of file