File Exchange

image thumbnail

Moveit2 - Move a graphical object with the mouse.

version 1.0 (1.67 KB) by

Move graphical objects with your mouse. Works for pcolor, plot, patches and perhaps more.

9 Downloads

Updated

View License

This is really a small hack that I wanted to share just to inspire more people to make interactive Matlab graphics. Use it as is or use the code as a template to do more advanced stuff.

Here is how it works (for a 2-D patch):

% First make the patch ...
t = 0:2*pi/20:2*pi;
X = 3 + sin(t); Y = 2 + cos(t); Z = X*0;
h = patch(X,Y,Z,'g')
axis([-10 10 -10 10]);
% Then make it movable
moveit2(h);

It also works for e.g. pcolor and plot:

% Adjust data to fit hypothesis using the mouse ... :-)
a = plot(rand(10,10));
moveit2(a);

Comments and Ratings (12)

Kajal Raut

The code works great. Thank you. I want to now apply it on 2D images. How does one work around this?

Currently I am trying to convert the image to a patch, however when displayed its not anything like the original. How does convert the image to the patch, so that when it displays on the screen it looks like the original?

Brandon

This works great, Anders! Is there a way to return the new position of the graphical object?

Hi! I use your code as you post it but didn't work it say's:

Undefined function 'moveit2' for input arguments of
type 'double'.

Error in Moveimageexample (line 8)
moveit2(h);

Any help!!!

Jonathan

Gang Wang

Gang Wang (view profile)

Hi Anders, I am using Moveit2 and find this interactive tool is great!

For my curiosity, I produced a 3D object patch (triangulated) and input to the function.

It can be observed that the object translates on XY plane. But the shape of the object is no longer preserved.

I did debugging and observed that the size of 'Vertices' matrix under the gui.currenthandle is automatically changed after line 66:
set(gui.currenthandle,'XData',XYData{1} + pos(1,1));

In other words, if the size of 'X' or 'YData' is [3 by 100];
then the new vertices size will always be updated to [3*100 by 3].

I guess some private functions updates the 'Vertices' whenever the XYZData is changed. But I cannot find the mechanism behind this.

Jan Simon

Jan Simon (view profile)

Sorry, too confusing typos.
If the original WindowButton-Motion/-Up functions are restored after your function has finished, I will rate it with 5 stars.

Jan Simon

Jan Simon (view profile)

No, please do not use a global variable. The need of an obscure name is a warning already! I'd suggest using the ApplicationData of the object, see setappdata.
Itr would restore the original WindowButtonMotionUp functions after your function is finished.
H1-Line, comments, it works.

Anders Brun

Anders Brun (view profile)

thanks a lot for the 5 star... Just a comment, there are still things that can be simplified. In particular I think it would be possible to store state of the object in a smarter and even more invisible way, instead of using the UserData attributes. Perhaps a global variable with an obscure name would do it.

Jveer

Jveer (view profile)

5* for simplicity

Jveer

Jveer (view profile)

MATLAB Release
MATLAB 7.8 (R2009a)
Tags Add Tags

Download apps, toolboxes, and other File Exchange content using Add-On Explorer in MATLAB.

» Watch video