Problems with plotting multiple objects over each other

I'm using the rectangle function to fill in a circle located at the center point (x,y) of a grid square and width and weigth (1,1) with curvature (1,1)...in other words a circle that touches the bounds of a grid square. This happens whenever I left click on the plot. I want to be able to right click in a grid square a have the filled in circle erase. For some reason Matlab won't overlay rectangles with the same center point. I was hoping to use the rectangle function again but with a black color (since my background is black). Once I get this part working, I want to extend it to replace any circle I click on with another circle of a different color I've picked already. Is there work around that I could use?

2 Comments

I do not understand the question. What does this mean: "have the filled in circle erase"? Or "For some reason Matlab won't overlay rectangles with the same center point."?
What I mean is I want to be able to delete the filled circle when I right click on it or if I left click on it with a different color selected. For example, in the picture here http://i50.tinypic.com/23if88j.jpg I first selected the blue color and left clicked on the grid squares. I then change to the red color and click on the grid squares. That blue circle should of been replaced with a red circle when I left clicked on it. I have the same problem when I try to right click on the circle. When I right click within the bounds of a grid square, the circle should be replaced with a circle colored in black (essentially erasing that circle from the board).

Sign in to comment.

Answers (2)

You could try to edit the renderer of the figure window:
set(gcf,'renderer','opengl') % changes the renderer of the current fig to opengl
set(gcf,'renderer','painters') %changes the renderer to painters
set(gcf,'renderer','zbuffer') %changes the renderer to buffer
A different renderer might be able to get rid of your visualisation problems.

1 Comment

Wouter,
Unfortunately editing the renderer did not work.

Sign in to comment.

When you call rectangle, store the handle of it in a 6 by 6 array at the location of the circle in the grid. Then when you have to change the color, delete the handle before drawing the new one.
% Draw.
handleArray(row, column) = rectangle(.....
When it comes time to draw a new circle of a different color:
% Erase that handle to clear the circle.
delete(handleArray(row, column));
% Draw new circle at that location.
handleArray(row, column) = rectangle(.....

2 Comments

I am trying to implement this code and I seem to be encountering a problem. When I right click in a grid square that has a circle, nothing happens. If I right click in a grid square that does not have a circle, an error appears stating "Invalid or deleted object". Which makes sense since there is no data to be deleted at that particular (row,col). I have no clue as to why your code is not working when there is a right click action in a grid square that contains a circle. I think the problem has to do with checking the button type.
Edit: Another problem I am having is that if I try and draw more than one circle of the same color one after the other, only the handle of the last circle drawn is kept in the array. Also, if I try and left click on a circle that already contains a circle the old circle will not get replaced by the new color choice.
As of now this is my code structure:
1) Get position of mouse in the figure.
2) If mouse is within bounds of axis (by comparing mouse location in figure to axis bounds by get(gca,'Position')), call @select_point.
3) Logic condition within select_point.m
if strcmp(btn_type,'normal')
handleArray(row_num, col_num) = rectangle...
hold on
elseif strcmp(btn_type,'alt')
delete(handleArray(row_num, col_num))
end
4) Plot grid lines using plot_grid.m. The variable div sets how many divisions each side of the grid will have. I decided to make my own grid due to resizing issues.
function plot_grid(div)
% specify the minor grid vector
xg = [0:1:div];
% specify the Y-position and the height of minor grids
yg = [0:1:div];
%vertical lines
x = repmat(xg,length(xg),1);
y = repmat(flipud(yg'),1,length(yg));
plot([x,x'],[y,y'],'w')
set(gca,'Color',[0, 0, 0]);
set(gca, 'XTick',[]);
set(gca, 'YTick',[]);
box off
axis square
No other suggestions? If you would like here is the fully developed code as of thus far. Flow_FreeGUI is the main program that you should run.

Sign in to comment.

Categories

Find more on Graphics Performance in Help Center and File Exchange

Asked:

on 21 Mar 2013

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!