【问题标题】:Draw 2 imline to be perpendicular to each other matlab绘制2个imline相互垂直matlab
【发布时间】:2014-06-10 21:59:36
【问题描述】:

有什么方法可以限制边缘线始终垂直于绘制在同一对象上的其他边缘线。例如。我使用“imline”绘制第一条线现在我想在第一条线上绘制第二条线以垂直于它。如果有办法强制第二条内线垂直于第一条线,保持延长长度的灵活性,它将在一定程度上解决我的问题。 我想要在我的图像上使用类似灵活的十字准线(可以沿轴旋转并具有灵活的侧面)来测量特定对象的高度和宽度。

【问题讨论】:

    标签: matlab


    【解决方案1】:

    代码:

    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
    

    将其保存为函数,然后调用它。您可以拖动绿线,红线保持垂直。请注意,您必须定义您希望它如何保持垂直度。我选择保留红线的长度,并保持在绿线的中心。

    【讨论】:

    • 嗨 jucetain,非常感谢你,我会试试这个,这绝对是我想要的。
    • 调整线大小后如何恢复位置,无法双击退出,有没有办法恢复两个端点的位置或距离
    • callback_line 中,您可以在该位置上使用disp。或者,您可以让函数返回该行的句柄,然后在需要更新位置时对其使用getPosition
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-09
    • 1970-01-01
    相关资源
    最近更新 更多