Check if a set of coordinates are on a line
8 visualizaciones (últimos 30 días)
Mostrar comentarios más antiguos
Sebastian Ursarescu
el 18 de Sept. de 2019
Comentada: Sebastian Ursarescu
el 18 de Sept. de 2019
I have a set of coordinates, for example x = [0 0 0 0] y = [1 0.9 1.1 1] or x = [1 2 3 4] y = [1 4 6 7], and I want to know if they are almost on a line. I can say the first exemple does and the second doesn't.
I tried with polyarea checking if the area is small enough but it's hard to define the crossing area value regarding the size of the polygon and, moreover, it gives the wrong answer if the polygon crosses itself, like in the first example.
Thank you in advice.
1 comentario
KALYAN ACHARJYA
el 18 de Sept. de 2019
@Guillaume sir, sorry, I missed it, I misundestood the question and considering on image (Horizantal or Vertical line)
Always Thanks
Respuesta aceptada
Bruno Luong
el 18 de Sept. de 2019
Editada: Bruno Luong
el 18 de Sept. de 2019
xy=[x(:)';y(:)'];
criteriatol = 0.01; % adjust to your need, smaller means stricter line test
s = svd(xy-mean(xy,2));
isline = max(s)*criteriatol>min(s)
Work isotropically (orientation independent, but also scaling, shifting independent), even with vertical line.
Más respuestas (1)
Guillaume
el 18 de Sept. de 2019
Probably, the best way is to use polyfit (which does a least square fit) and look at the norm of the residuals. If it's small enough your points (tolerance is up to you) are on a line.
[~, pfit] = polyfit(x, y, 1); %least square fit of a line
if pfit.normr <= arbitrary_value
disp('is a line');
else
disp('not a line');
end
You may need to special case when all the x are (almost) all equal (vertical line) if that's an actual possibility.
2 comentarios
Ver también
Categorías
Más información sobre Computational Geometry en Help Center y File Exchange.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!