2 views (last 30 days)

"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

Stephen Cobeldick
on 4 Dec 2019

Edited: Stephen Cobeldick
on 4 Dec 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.

Sign in to answer this question.

Opportunities for recent engineering grads.

Apply Today
## 3 Comments

## Direct link to this comment

https://ch.mathworks.com/matlabcentral/answers/494806-i-really-need-help-with-fprintf-ing-a-string-having-it-alternate-with-commas-and-parentheses#comment_774351

⋮## Direct link to this comment

https://ch.mathworks.com/matlabcentral/answers/494806-i-really-need-help-with-fprintf-ing-a-string-having-it-alternate-with-commas-and-parentheses#comment_774351

## Direct link to this comment

https://ch.mathworks.com/matlabcentral/answers/494806-i-really-need-help-with-fprintf-ing-a-string-having-it-alternate-with-commas-and-parentheses#comment_777406

⋮## Direct link to this comment

https://ch.mathworks.com/matlabcentral/answers/494806-i-really-need-help-with-fprintf-ing-a-string-having-it-alternate-with-commas-and-parentheses#comment_777406

## Direct link to this comment

https://ch.mathworks.com/matlabcentral/answers/494806-i-really-need-help-with-fprintf-ing-a-string-having-it-alternate-with-commas-and-parentheses#comment_778122

⋮## Direct link to this comment

https://ch.mathworks.com/matlabcentral/answers/494806-i-really-need-help-with-fprintf-ing-a-string-having-it-alternate-with-commas-and-parentheses#comment_778122

Sign in to comment.