MATLAB Answers

RSHU FA
0

How to add an interval to a number?

Asked by RSHU FA
on 18 Apr 2018
Latest activity Commented on by Matt Macaulay on 19 Apr 2018
I have two points (0,0) and (1,1). and I write them as a vector like:
x=[0 1]
y=[0 1]
Also, I take the user two points (xp,yp).
(xp,xp)=ginput;
Now I want to use if structure to do some plots if the points of user and mine are almost the same. My question is I want to add some interval to x,(for being almost equal not exactly). for example:
if strcmp(x+[a, b],xp) && strcmp(y+[a, b]),yp)
but this bring me many errors. Maybe I can't use strcmp in this way or intervals...I don't know!
Could you please help me how can I add some error, interval .. to this? Thank you

  0 Comments

Sign in to comment.

3 Answers

Answer by Matt Macaulay on 18 Apr 2018
 Accepted Answer

Using a tolerance as KSSV mentioned does the job.

x=[0 1];
y=[0 1];
[xp,yp]=ginput;
epsilon = .1;
dx = x - xp;
dy = y - yp;
if any(hypot(dx, dy) < epsilon)
    disp('Close')
else
    disp('Far')
end

  2 Comments

Thanks so much. The only problem here I want to have a difference between (0,0),(1,1) and (1,1),(0,0). The order is important. How can I put it in the program?
The elements of the array
hypot(dx, dy) < epsilon
hold this information

Sign in to comment.


Answer by Pawel Jastrzebski on 18 Apr 2018

This example should have the answers to your problems:

% Values that can be changed in the code:
% d, Xu, Yu
% original points
X = [0 1];
Y = [0 1];
% error as an absolute value
d = 0.1;
% data for P(3) and P(4) below
% indexing vectors for X
idx1  = false(1,8);
idx1(1,[1,4,5,end]) = true; 
idx2  = ~idx1;
% error area X values
Xd = repelem(X,4);
Xd(idx1) = Xd(idx1)-d;
Xd(idx2) = Xd(idx2)+d;
% indexing vectors for Y
idx3 = false(1,8);
idx3(1,[1,2,5,6]) = true;
idx4 = ~idx3;
% error area X values
Yd = repelem(Y,4);
Yd(idx3) = Yd(idx3)+d;
Yd(idx4) = Yd(idx4)-d;
% user defined vector
Xu = [0.05 1.09];
Yu = [0.1 1.05];
% deciding whether baseline vector and user defined vector
% are within error 'd' from each other
Xb = Xd([1:2;5:6]);
Yb = Yd([3,2;7,6]);
Xcompare = (Xb(:,1) <= Xu') & (Xb(:,2) >= Xu');
Ycompare = (Yb(:,1) <= Yu') & (Yb(:,2) >= Xu');
result = all([Xcompare; Ycompare]);
f(1) = figure;
p(1) = plot(X,Y,'ok--');
hold on
p(2) = fill(Xd(1:4),Yd(1:4),[0 1 0]);
p(3) = fill(Xd(5:end),Yd(5:end),[0 1 0]);
p(4) = plot(Xu,Yu,'rx--');
grid on
if result
    title('In');
else
    title('Out');
end
legend([p(1), p(2), p(4)],...
    {'baseline', 'error area', 'user input'},...
    'Location','best');
set([p(2) p(3)],...
    'facealpha', 0.2,...
    'LineStyle', 'none');

The output:

  1 Comment

Thanks a lot. It's very good exercise.

Sign in to comment.


KSSV
Answer by KSSV
on 18 Apr 2018

Read about ismembertol.

Or you can add some tolerance (may be 10^-3) to (x,y) and then check with (xp,yp).

  0 Comments

Sign in to comment.