2014-06-10 45 views
1

有什麼辦法可以將imline限制爲始終垂直於在同一個對象上繪製的另一個imline。爲前。我使用「imline」畫出第一條線,現在我想在第一條線上畫第二條線以便與之垂直。如果有辦法強制第二條直線與第一條直線垂直,保持延伸長度的靈活性,它將在一定程度上解決我的問題。 我想要像我的圖像上的柔性十字準線(可以沿着軸線旋轉並具有柔性兩側)來測量某個對象的高度和寬度。繪製2 imline與每個其他matlab相互垂直

回答

2

代碼:

function perpline() 

    imshow(rand(200),[]); 

    line1 = imline(gca,[50 50; 150 150]); 
    setColor(line1,'r'); 
    line2 = imline(gca,[50 150; 150 50]); 
    setColor(line2,'g'); 

    addNewPositionCallback(line2,@(pos)callback_line(pos)); 

    function callback_line(pos) 
     % Must update line1 based on line2's position 
     pos_line1 = getPosition(line1); 
     pos_line2 = getPosition(line2); 

     % Get middle 
     pos_center = [(pos_line2(1,1)+pos_line2(2,1))/2 (pos_line2(1,2)+pos_line2(2,2))/2]; 

     % Find displacement 
     vec_disp = [pos_line2(2,1)-pos_line2(1,1) pos_line2(2,2)-pos_line2(1,2)]; 

     % Get normal unit vector 
     vec_perp = [-vec_disp(2) vec_disp(1)]/norm(vec_disp); 

     % Preserve length of line2 
     length_line1 = norm([pos_line1(2,1)-pos_line1(1,1) pos_line1(2,2)-pos_line1(1,2)]); 

     pos_line1_update = [-vec_perp*length_line1/2+pos_center; 
          vec_perp*length_line1/2+pos_center]; 

     % Set position 
     setPosition(line1,pos_line1_update);     
    end 
end 

保存它作爲一個函數,然後調用它。您可以拖動綠線,紅線保持垂直。請注意,您必須定義您希望如何保持垂直度。我選擇保留紅線的長度並將其保持在綠線的中心。

enter image description here

+0

嗨jucetain,非常感謝你,我會試試這個,這肯定看起來我想要的。 –

+0

一旦我完成調整線的大小,我不能雙擊並退出,有沒有辦法獲得兩個端點的位置或距離 –

+1

在'callback_line'中,您可以使用'disp'在位置上。或者,您可以讓該函數返回該行的句柄,然後在您想要更新的位置時使用'getPosition'。 – Justin