0001 function edge2 = clipEdge(edge, box)
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026 if size(box, 1) == 2
0027 box = box';
0028 end
0029
0030
0031 xmin = box(1);
0032 xmax = box(2);
0033 ymin = box(3);
0034 ymax = box(4);
0035
0036
0037
0038 lineX0 = [xmin ymin xmax-xmin 0];
0039 lineX1 = [xmin ymax xmax-xmin 0];
0040 lineY0 = [xmin ymin 0 ymax-ymin];
0041 lineY1 = [xmax ymin 0 ymax-ymin];
0042
0043
0044
0045 p11 = edge(:,1) < xmin; p21 = edge(:,3) < xmin;
0046 p12 = edge(:,1) > xmax; p22 = edge(:,3) > xmax;
0047 p13 = edge(:,2) < ymin; p23 = edge(:,4) < ymin;
0048 p14 = edge(:,2) > ymax; p24 = edge(:,4) > ymax;
0049 out1 = [p11 p12 p13 p14];
0050 out2 = [p21 p22 p23 p24];
0051
0052
0053 inside = sum(out1 | out2, 2) == 0;
0054
0055
0056 outside = sum(out1 & out2, 2) > 0;
0057
0058
0059
0060 ind = find(~(inside | outside));
0061
0062
0063 edge2 = zeros(size(edge));
0064
0065
0066 edge2(inside, :) = edge(inside, :);
0067
0068
0069 for i = 1:length(ind)
0070
0071 iedge = edge(ind(i), :);
0072
0073
0074 px0 = intersectLineEdge(lineX0, iedge);
0075 px1 = intersectLineEdge(lineX1, iedge);
0076 py0 = intersectLineEdge(lineY0, iedge);
0077 py1 = intersectLineEdge(lineY1, iedge);
0078
0079
0080 points = [px0; px1; py0; py1; iedge(1:2); iedge(3:4)];
0081
0082
0083 points = points(all(isfinite(points), 2), :);
0084
0085
0086 points = sortrows(points);
0087
0088
0089 centers = (points(2:end,:) + points(1:end-1,:))/2;
0090
0091
0092 inside = find( centers(:,1) >= xmin & centers(:,2) >= ymin & ...
0093 centers(:,1) <= xmax & centers(:,2) <= ymax);
0094
0095
0096
0097 if length(inside) > 1
0098
0099 dv = points(inside+1,:) - points(inside,:);
0100
0101 len = hypot(dv(:,1), dv(:,2));
0102
0103 [a, I] = max(len);
0104 inside = inside(I);
0105 end
0106
0107
0108
0109 if isscalar(inside)
0110
0111 if iedge(1) > iedge(3) || (iedge(1) == iedge(3) && iedge(2) > iedge(4))
0112 edge2(ind(i), :) = [points(inside+1,:) points(inside,:)];
0113 else
0114 edge2(ind(i), :) = [points(inside,:) points(inside+1,:)];
0115 end
0116 end
0117
0118 end
0119