[英]Retrieve multiple hand-chosen points from data cursor mode
尊敬的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位置)
我現在停留在編寫一個循環上,該循環不僅允許像當前解決方案一樣添加一個測站(在添加一個測站后數據光標模式關閉,此刻),還可以檢索盡可能多的點(又稱為新測站坐標) )為默認電台數與所需nr之差。 站。 想象一下:我有5個默認電台,我總共想要10個電台。 兩者之間的差異為5,因此我需要手動選擇/單擊5個點,這些點將成為五個新測站的坐標。
ps:為了更好地理解,請查看隨附的顯示當前狀態的圖片。
提前致謝 :)
您可以使用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
時間。 完成后, 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
,單擊鼠標將假定這是您要選擇的最后一個點,因此繼續選擇下一個點。
這取決於您要執行的操作,但是任何一種方法都應該起作用。
希望這可以幫助。 祝好運!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.