I really need help with fprintf'ing a string, having it alternate with commas and parentheses.
3 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
The Merchant
am 4 Dez. 2019
Bearbeitet: Image Analyst
am 15 Dez. 2019
"I really need help with fprintf'ing a string, having it alternate with commas and parentheses."
How do I write a function to fprintf the following string, so that it also changes when the input is changed!:
"convex points: 6 (1 15), 7 (2 6), 8 (6 1), 10 (16 7), 12 (19 18) and 5 (9 19)."
aka
"convex points: firstConvexPoint (coordsX coordsY), secondConvexPoint (coordsX coordsY)"
the values are already sorted properly in arrays, but I can't figure out how to code the string that it alternates in such a way that I get the string above..
Any help is hugely appreciated.
Code:
clear;
close all;
clc;
xy = [
3 12 % Point 1
10 8 % Point 2
11 14 % Point 3
13 16 % Point 4
9 19 % Point 5
1 15 % Point 6
2 6 % Point 7
6 1 % Point 8
12 5 % Point 9
16 7 % Point 10
14 17 % Point 11
19 18 % Point 12
];
xy = xy';
convexHull = getConvexHull(xy);
coords = xy(:,convexHull)';
coordsX = coords(:,1);
coordsY = coords(:,2);
fprintf
function k = getConvexHull(xy)
[m,n] = size(xy);
if m~=2
error('convexhull: xy must have 2 columns');
end
[xmin,first] = min( xy(1,:) );
ind = [1:(first-1) (first+1):n];
angle = atan2( xy(1,ind)-xy(1,first), xy(2,ind)-xy(2,first) );
[junk,order] = sort(angle);
ind = [ind(order) first];
stack = zeros( n, 1, 'uint32' );
stack(1) = first;
stacktop = 1;
i = 1;
while i<=n
if stacktop<2
stacktop = stacktop+1;
stack(stacktop) = ind(i);
i = i+1;
else
p0 = xy(:,stack(stacktop));
p1 = xy(:,stack(stacktop-1));
p2 = xy(:,ind(i));
if (p1(1)-p0(1))*(p2(2)-p0(2))-(p2(1)-p0(1))*(p1(2)-p0(2)) >= 0
stacktop = stacktop+1;
stack(stacktop) = ind(i);
i = i+1;
else
stacktop = stacktop-1;
end
end
end
k = stack(1:stacktop);
k = flip(k);
k(end) = [];
end
3 Kommentare
Stephen23
am 15 Dez. 2019
Original question (in case this gets deleted for a third time):
"I really need help with fprintf'ing a string, having it alternate with commas and parentheses."
How do I write a function to fprintf the following string, so that it also changes when the input is changed!:
"convex points: 6 (1 15), 7 (2 6), 8 (6 1), 10 (16 7), 12 (19 18) and 5 (9 19)."
aka
"convex points: firstConvexPoint (coordsX coordsY), secondConvexPoint (coordsX coordsY)"
the values are already sorted properly in arrays, but I can't figure out how to code the string that it alternates in such a way that I get the string above..
Any help is hugely appreciated.
Code:
clear;
close all;
clc;
xy = [
3 12 % Point 1
10 8 % Point 2
11 14 % Point 3
13 16 % Point 4
9 19 % Point 5
1 15 % Point 6
2 6 % Point 7
6 1 % Point 8
12 5 % Point 9
16 7 % Point 10
14 17 % Point 11
19 18 % Point 12
];
xy = xy';
convexHull = getConvexHull(xy);
coords = xy(:,convexHull)';
coordsX = coords(:,1);
coordsY = coords(:,2);
fprintf
function k = getConvexHull(xy)
[m,n] = size(xy);
if m~=2
error('convexhull: xy must have 2 columns');
end
[xmin,first] = min( xy(1,:) );
ind = [1:(first-1) (first+1):n];
angle = atan2( xy(1,ind)-xy(1,first), xy(2,ind)-xy(2,first) );
[junk,order] = sort(angle);
ind = [ind(order) first];
stack = zeros( n, 1, 'uint32' );
stack(1) = first;
stacktop = 1;
i = 1;
while i<=n
if stacktop<2
stacktop = stacktop+1;
stack(stacktop) = ind(i);
i = i+1;
else
p0 = xy(:,stack(stacktop));
p1 = xy(:,stack(stacktop-1));
p2 = xy(:,ind(i));
if (p1(1)-p0(1))*(p2(2)-p0(2))-(p2(1)-p0(1))*(p1(2)-p0(2)) >= 0
stacktop = stacktop+1;
stack(stacktop) = ind(i);
i = i+1;
else
stacktop = stacktop-1;
end
end
end
k = stack(1:stacktop);
k = flip(k);
k(end) = [];
end
Akzeptierte Antwort
Stephen23
am 4 Dez. 2019
Bearbeitet: Stephen23
am 4 Dez. 2019
[~,idx] = ismember(coords,xy.','rows'); % Better: obtain these indices from your function!
mat = [idx,coords].'; % should have size 3xN for N points.
fprintf('convex points:'); % prints once.
fprintf(' %d (%d %d),',mat(:,1:end-1)) % prints N-1 times.
fprintf(' and %d (%d %d).\n',mat(:,end)) % prints once.
Which prints:
convex points: 6 (1 15), 7 (2 6), 8 (6 1), 10 (16 7), 12 (19 18), and 5 (9 19).
Tip: avoid confusion be not transposing xy all the time: pick one orientation and stick to it.
Weitere Antworten (0)
Siehe auch
Kategorien
Mehr zu Logical finden Sie in Help Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!