Извлечение нескольких точек, выбранных вручную, из режима курсора данных

Вопрос:

Дорогое сообщество stackoverflow,

В настоящее время я работаю над программированием симулятора обмена автомобилями для диссертации. Однако сеть обмена автомобилями состоит из различных станций обмена автомобилями, которые, следовательно, имеют координаты, которые могут быть получены из карты города. Поскольку изменение количества станций является обязательной функцией моего симулятора, и поэтому добавление станций является обязательным, я искал способ извлечения данных положения из режима курсора данных. К счастью, перед мной стояли программисты, чьи усилия я использовал:

statDiff = length(statCoords)- length(defaultstatCoords);
hf5 = figure(5);
set(0,'CurrentFigure',hf5)
[B, map] = imread('Hannoverosm.png');
C = imresize(B, 0.975);
imshow(C, map)
dcmObject = datacursormode;
pause
datacursormode off
cursor = getCursorInfo(dcmObject);
newStat = [cursor.Position(1), cursor.Position(2)].';
defaultstatCoords(:,end + 1) = newStat;
statCoords = defaultstatCoords;

(в то время как cursor.Position(1) – это x и cursor.Position(2) – позиция y)

Я теперь застрял в написании цикла, который позволяет мне не только добавить одну станцию (в настоящий момент режимы курсора данных закрываются после добавления одной станции), как в текущем решении, но и для извлечения как можно большего количества точек (ака новых координат станции ) в качестве разницы между числом станций по умолчанию и желаемым номером. станций. Представьте себе: у меня есть 5 станций по умолчанию, и я хочу всего 10 станций. Разница между ними будет равна 5, поэтому мне нужно будет вручную выбрать 5 пунктов, которые станут координатами пяти новых станций.

ps: для лучшего понимания просмотрите прилагаемое изображение, отображающее текущий статус.

blah

Заранее спасибо 🙂

Лучший ответ:

Что вы можете сделать, это использовать ginput и указать, сколько точек вы хотите щелкнуть по своему изображению. Затем будут возвращены массивы координат x и y, которые задают те координаты, которые вы нажали на своем изображении. Обратите внимание, что они будут возвращены как векторы столбцов. Без дальнейших церемоний сделайте следующее:

%// Your code from before
statDiff = length(statCoords)- length(defaultstatCoords);
hf5 = figure(5);
set(0,'CurrentFigure',hf5)
[B, map] = imread('Hannoverosm.png');
C = imresize(B, 0.975);
imshow(C, map);

%// New
[X,Y] = ginput(statsDiff); 

%// Transpose the results to make them row vectors
%// X and Y are column vectors from the output of ginput
X = X.';
Y = Y.';

% // Add to array
defaultstatCoords = [defaultstatCoords [X; Y]];

%// Assign back
statCoords = defaultstatCoords;

То, что сделал вышеприведенный код, – это создать свой образ, как раньше. Когда вы столкнулись с ginput, фокус будет размещен на вашем изображении, и вам будет разрешено щелкнуть в любом месте на изображении до тех statsDiff пока не будет установлено значение statsDiff. Когда вы закончите, координаты X и Y будут помещены в переменные X и Y X считается горизонтальным, а Y считается вертикальным. Кроме того, источник находится в верхнем левом углу.

Рассматривая, как вы строите, где вы размещаете свои очки, я предполагаю, что первая строка содержит все ваши X точки, а вторая строка содержит все ваши Y точки. Таким образом, я расширяю массив defaultstatCoords так, чтобы первая строка была расширена, чтобы иметь эти новые точки X, а вторая строка расширена, чтобы иметь эти новые точки Y Затем я назначаю их обратно statCoords для ваших целей.

Небольшая заметка заключается в том, что ginput не отображает координаты X и Y на экране, как в режиме курсора данных. Таким образом, единственный способ увидеть, какие точки вы нажали, – это когда ginput завершает работу.


Однако, если вы действительно хотите использовать режим курсора данных, вы можете инкапсулировать это в цикле следующим образом:

for count = 1 : statsDiff
    dcmObject = datacursormode;
    pause
    datacursormode off
    cursor = getCursorInfo(dcmObject);
    newStat = [cursor.Position(1), cursor.Position(2)].';
    defaultstatCoords(:,end + 1) = newStat;
end 
statCoords = defaultstatCoords;

Проблема с этим подходом заключается в том, что после выбора точки вы должны нажать ENTER, затем снова щелкнуть по окну и выбрать следующую точку. Это, безусловно, будет делать то, что вы сделали, но раздражает постоянно идти туда и обратно между командной строкой MATLAB и окном цифры. Однако этот метод хорош тем, что вы можете перетащить мышью и выбрать точку. Когда вы, наконец, будете готовы, затем нажмите ENTER. С ginput щелчок мышью предполагает, что это конечная точка, которую вы хотите выбрать, и, следовательно, переходит к выбору следующей точки.

Это зависит от того, что вы хотите сделать, но любой из этих методов должен работать.


Надеюсь это поможет. Удачи!

Оцените статью
TechArks.Ru
Добавить комментарий