2014-07-22 1 views
0

안녕하세요, 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 개의 새 스테이션의 좌표가 될 5 포인트를 선택하거나 클릭해야합니다.

p.s : 더 나은 이해를 위해 현재 상태를 보여주는 그림을 참조하십시오. 사전에

blah

감사합니다 :)

+0

Enter 키나 ESCAPE와 같은 센티넬 키를 누르기 전까지는'ginput'을 사용하고'while' 루프를 사용합니다. 또는, 당신이 할 수있는 것은 당신이 가지고있는 포인트만큼 루프를 반복하는 것입니다. 나는 너에게 대답을 쓸거야. – rayryeng

+0

정말 고맙습니다. 고마워요! – Atlan

+0

당신을 진심으로 환영합니다. 나는 방금 대답을 썼다. 행운을 빕니다! – rayryeng

답변

2

당신이 할 수있는 것은 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 번까지 이미지에서 원하는 위치를 클릭 할 수 있습니다. 작업이 끝나면 XY 좌표는 XY 변수에 배치됩니다. X은 수평으로 가정하고 Y은 수직으로 가정합니다. 또한 원점은 왼쪽 상단에 있습니다.

포인트를 배치하는 위치를 어떻게 구성하는지 살펴보면 첫 번째 행에는 X 포인트가 모두 포함되어 있고 두 번째 행에는 모두 Y 포인트가 모두 포함되어 있다고 가정합니다. 따라서 defaultstatCoords 배열을 확장하면 첫 번째 행은 새로운 X 점으로 확장되고 두 번째 행은 새로운 Y 점으로 확장됩니다. 그런 다음 이들을 다시 statCoords에 할당합니다.

한 가지 작은 메모는 데이터 커서 모드에서와 같이 화면에 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 명령 프롬프트와 figure 창 사이를 오가는 것이 끊임없이 번거로 롭습니다. 그러나이 방법은 마우스를 드래그하여 점을 선택할 수 있다는 점에서 좋습니다. 마침내 준비가되면 ENTER을 누르십시오. ginput으로, 마우스 클릭은 이것이 최종 포인트라고 가정하고, 따라서 다음 포인트를 선택합니다.

원하는 작업에 따라 다르지만 두 방법 중 하나를 사용해야합니다.


희망이 있습니다. 행운을 빕니다!

+0

나는 그것을 최대한 빨리 시도 할 것이다, 당신의 노력에 감사드립니다! +1 당신을 위해 그리고 그것이 작동하는 경우 (그리고 나는 그것이 확실하다고 생각합니다!) 나는 당신의 대답을 받아 들일 것입니다 :) 좋은 저녁 되세요! – Atlan

+1

@Atlan 대단히 환영합니다. 희망이 작동합니다! – rayryeng

+1

@Atlan - 데이터 커서 모드를 사용하여 솔루션을 제공했습니다. 그러나 나는'ginput' 메서드를 사용하는 것이 더 빠르다고 추천하지만 정확성을 원한다면 데이터 커서 모드를 사용하십시오. 당신은'for' 루프에서 메소드를 포함하는 것이 옳았습니다. 나는 그것을 작동시키기위한 몇 가지 추가 논리를 넣었습니다. 그 해결책은 내 게시물의 끝에 찾을 수 있습니다. 둘 중 하나가 작동해야합니다. 행운을 빕니다! – rayryeng

관련 문제