datacursormode & slope calculation

1 visualización (últimos 30 días)
Eric Hong
Eric Hong el 8 de Sept. de 2015
Comentada: Image Analyst el 9 de Sept. de 2015
I'm trying to calculate the slope between two points. I've tried some other methods such as imline, but none of them allows the snapping to a curve. I found out this morning that I can possibly use the data tips in the datacursormode.
So, what I want to do is:
  1. Select two points showing the black dot for both points
  2. Upon the second left-clicking, a line is drawn connecting the two points and a text box shows the calculated slope
  3. If I move either black dot, the text box is updated with a new slope
  4. I can have as many pairs as I want, many lines between a part of black dots
  5. If either dot is deleted, the associated text box disappears along with it
I've tried things like
waitforbuttonpress;
point1 = getCursorInfo(data_cursor_mode_obj);
waitforbuttonpress;
point2 = getCursorInfo(data_cursor_mode_obj);
slope = abs((y2-y1)/(x2-x1));
text((x1+x2)/2,(y1+y2)/2,[' \leftarrow' num2str(slope) ])
This of course doesn't update the text. In fact, for some reason, Matlab complains and I don't know how to fix it.
Another thing I tried was using UpdateFcn, but a problem with it is that I can only pass one point data by doing event_obj.Position.
Your help will be greatly appreciated.
Thanks,
Eric
  2 comentarios
Steven Lord
Steven Lord el 8 de Sept. de 2015
Define "Matlab[sic] complains" -- does it issue a warning? Does it throw an error? In either of those cases, what is the FULL text of the error message you receive?
You probably want to use a WHILE loop with a PAUSE inside to wait until getCursorInfo returns a struct array with at least two elements, to ensure you have at least two points selected.
Eric Hong
Eric Hong el 8 de Sept. de 2015
Field reference for multiple structure elements that is followed by more reference blocks is an error.

Iniciar sesión para comentar.

Respuestas (1)

Image Analyst
Image Analyst el 8 de Sept. de 2015
Have you considered using imline()? I've attached an example using multiple imlines. Feel free to adapt it.
  2 comentarios
Eric Hong
Eric Hong el 8 de Sept. de 2015
yes. I have and that's currently what I'm using. However, I really want the snapping to a curve. imline doesn't do that, as far as I understand. Is that true?
Image Analyst
Image Analyst el 9 de Sept. de 2015
No, you'd have to do that manually. There is no "snapping" of the imline() endpoints to other data that may happen to be living in your plot/graph.
I do something similar in one app. I have a curve (plot of a 1-D signal) and I have two scrollbars, one to move a vertical line that defines the left boundary, and one to move a vertical line that defines the right limit. I identify the Y value for those x limit locations and then draw a line from (x1,y1) to (x2,y2). Then I calculate the slope. Each time they move a scroll bar, it calls a function I wrote called ScrollBarMoved() which erases all the lines, then draws the two vertical lines and a slanted line between where the vertical lines cross the y curve.
Maybe that method would work for you.

Iniciar sesión para comentar.

Categorías

Más información sobre Loops and Conditional Statements 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