Borrar filtros
Borrar filtros

how to find the sharp turn in a 2d-line (curve)?

32 visualizaciones (últimos 30 días)
tafteh
tafteh el 21 de Dic. de 2012
Comentada: Image Analyst el 31 de Mayo de 2019
Hi all,
I am trying to find the sharp turn in a 2d-line (curve). Line is constructed with two vectors, X and Y. In following link you can find a sample line with realized point at which there is sharp turn (red solid point).
I appreciate if you could help me out with this.
Thanks, Payam

Respuesta aceptada

Roger Stafford
Roger Stafford el 22 de Dic. de 2012
One measure of a "sharp turn" is the amount of curvature between three adjacent points on your curve. Let (x1,y1), (x2,y2), and (x3,y3) be three such adjacent points. By a well-known formula, the curvature of a circle drawn through them is simply four times the area of the triangle formed by the three points divided by the product of its three sides. Using the coordinates of the points this is given by:
K = 2*abs((x2-x1).*(y3-y1)-(x3-x1).*(y2-y1)) ./ ...
sqrt(((x2-x1).^2+(y2-y1).^2)*((x3-x1).^2+(y3-y1).^2)*((x3-x2).^2+(y3-y2).^2));
Roger Stafford
  3 comentarios
Maradona Rodrigues
Maradona Rodrigues el 31 de Mayo de 2019
Hi I tried using the above code and resulted in some erronous results
my 2d line is list = [0 0; 4 0.5; 8 6; 6 25; 3 7; 1 1] , with the biggest curvature being at the point [6,25]. However i didnt get the second lowest at that point?
Image Analyst
Image Analyst el 31 de Mayo de 2019
Maybe there are not enough points to make a determination. If you have a recent version of MATLAB you might also try findchangepts().

Iniciar sesión para comentar.

Más respuestas (3)

Jan
Jan el 22 de Dic. de 2012
"Sharp" is relative. There is always a zoom level, which let a curve look smooth.
If you do not have a curve defined by a function, but a piecewise defined line, you are looking for neighboring elements with and included angle above a certain limit. But when such a piece has a length of 1e-200, while the others have a length of 1.0, can this have a "sharp turn"?!
But let's imagine, that you can control this fundamental problem by inventing some meaningful thresholds. Then this determines the angle between two lines:
angle = atan2(norm(cross(N1, N2)), dot(N1, N2))

Image Analyst
Image Analyst el 21 de Dic. de 2012
Well for that example, just do
yAtTurn = min(y);
xAtTurn = find(y == yAtTurn);
If you need something more general, flexible, and robust, then you need to say how other curves might look different than the one example you supplied.
  6 comentarios
Alessandro
Alessandro el 30 de Mayo de 2014
Hi Image Analyst... your code works fine for me but i have a bw image instead of a set of (x,y) points... so that, i've not an ordered set of (x,y)... how can i figure out? (my purpose is still find inflection points)
Image Analyst
Image Analyst el 30 de Mayo de 2014
You can use bwboundaries() to get a list of (x,y) points.

Iniciar sesión para comentar.


tafteh
tafteh el 21 de Dic. de 2012
Hi again, I have updated the image to make it more clearer regarding my problem explained in the first post. Please find the link below:
Thanks,

Categorías

Más información sobre Surface and Mesh Plots 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!

Translated by