Hello everyone,
I am attempting to make it so I can have as many iterations as I want in the for loop. I want to choose when I am done using ginput rather than relying on a preset number ("num" in the code below). This would mean running the loop until I press a key, after which the loop is exited. I have attached an image of the plot.
EDIT: I edited the code posted below to reflect my final script that works. If enter is pressed, ginput will not throw an error, and the loop will be exited. If another key is pressed, the loop will also stop. NOTE that when a different key other than 'ENTER' is used to break from the loop, an additional point will be plotted wherever the cursor is located. I am too lazy to fix this at the moment.
clc;clear;close all
rng default
xq = rand(500,1)*5;
yq = rand(500,1)*5;
f = figure;
j = 1;
plot(xq,yq,'b+'); hold on;
axis equal
while true
try % ginput(number) throws error when 'ENTER' is pressed
[xv(j), yv(j)] = ginput(1);
plot(xv(j),yv(j),'ro','MarkerFaceColor','r','MarkerSize',3)
if j > 1
plot(xv(j-1:j),yv(j-1:j),'LineWidth',2,'color','red') % polygon
end
j=j+1;
catch
break;
end
% In case something other than enter is pressed
if f.CurrentCharacter > 0
break;
end
end
in = inpolygon(xq,yq,xv,yv);
figure
plot(xv,yv,'LineWidth',2,'color','red') % polygon
axis equal
hold on
plot(xq(in),yq(in),'r+') % points inside
plot(xq(~in),yq(~in),'bo') % points outside

 Akzeptierte Antwort

Scott MacKenzie
Scott MacKenzie am 15 Jul. 2021
Bearbeitet: Scott MacKenzie am 15 Jul. 2021

2 Stimmen

Here's an arrangement I've used with good success in the past. The loop executes indefinitely until a key is pressed.
f = figure;
% other code
while true
% put your loop code here
if f.CurrentCharacter > 0
break;
end
end

5 Kommentare

Addison Collins
Addison Collins am 15 Jul. 2021
Bearbeitet: Addison Collins am 15 Jul. 2021
Scott, I modified my code to include yours.
I get the following error when I press a key. I think ginput doesn't like it much. I don't know much about adding exceptions to errors, is there anything I can do? I am able to plot as many points as I want, the issue only arrises when I press a key to exit the loop.
Figure: plotting several points
Error: when I attempt to leave via key press (ginput causes issues)
clc;clear;close all
rng default
xq = rand(500,1)*5;
yq = rand(500,1)*5;
f = figure;
j = 1;
plot(xq,yq,'b+'); hold on;
axis equal
while true
% [xv(j,1), yv(j,1)] = ginput(1);
[xv(j), yv(j)] = ginput(1);
plot(xv(j),yv(j),'ro','MarkerFaceColor','r','MarkerSize',3)
if j > 1
plot(xv(j-1:j),yv(j-1:j),'LineWidth',2,'color','red') % polygon
end
j=j+1;
if f.CurrentCharacter > 0
break;
end
end
in = inpolygon(xq,yq,xv,yv);
figure
plot(xv,yv,'LineWidth',2,'color','red') % polygon
axis equal
hold on
plot(xq(in),yq(in),'r+') % points inside
plot(xq(~in),yq(~in),'bo') % points outside
hold off
Scott MacKenzie
Scott MacKenzie am 15 Jul. 2021
Bearbeitet: Scott MacKenzie am 15 Jul. 2021
Hmm, OK. Actually, I didn't even look at your code. I was just thinking "exit a loop when a key is pressed". Try this (instead of the code in my answer). Hit 'q' when you want to exit the loop.
while true
...
[xv(j), yv(j), key] = ginput(1);
if key == 'q'
break;
end
end
I found that adding a pause gives me a time window to press a key without ginput freaking out. But it's not optimal to use this in my code because if I miss the timing, the program crashes due to the error...
while true
% [xv(j,1), yv(j,1)] = ginput(1);
[xv(j), yv(j)] = ginput(1);
plot(xv(j),yv(j),'ro','MarkerFaceColor','r','MarkerSize',3)
if j > 1
plot(xv(j-1:j),yv(j-1:j),'LineWidth',2,'color','red') % polygon
end
j=j+1;
if f.CurrentCharacter > 0
break;
end
pause(.3) %THIS IS THE PAUSE
end
Scott MacKenzie
Scott MacKenzie am 15 Jul. 2021
Bearbeitet: Scott MacKenzie am 15 Jul. 2021
I've deleted this comment, as I see in your next comment that you've now got things working just fine.
I realized that ginput just doesn't like 'ENTER'. It attempts to return an invalid 0x0 or something along those lines. Instead, if I press any other key, it works (spacebar, etc.). Additionally, I added a catch so if enter is pressed it will break rather than throw an error.
I will edit my orignal post for anyone who sees this thread in the future.
clc;clear;close all
rng default
xq = rand(500,1)*5;
yq = rand(500,1)*5;
f = figure;
j = 1;
plot(xq,yq,'b+'); hold on;
axis equal
while true
try % ginput(number) throws error when 'ENTER' is pressed
[xv(j), yv(j)] = ginput(1);
plot(xv(j),yv(j),'ro','MarkerFaceColor','r','MarkerSize',3)
if j > 1
plot(xv(j-1:j),yv(j-1:j),'LineWidth',2,'color','red') % polygon
end
j=j+1;
catch
break;
end
% In case something other than enter is pressed
if f.CurrentCharacter > 0
break;
end
end
in = inpolygon(xq,yq,xv,yv);
figure
plot(xv,yv,'LineWidth',2,'color','red') % polygon
axis equal
hold on
plot(xq(in),yq(in),'r+') % points inside
plot(xq(~in),yq(~in),'bo') % points outside

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (0)

Kategorien

Mehr zu Data Exploration finden Sie in Hilfe-Center und File Exchange

Produkte

Community Treasure Hunt

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

Start Hunting!

Translated by