【发布时间】:2014-06-10 21:59:36
【问题描述】:
有什么方法可以限制边缘线始终垂直于绘制在同一对象上的其他边缘线。例如。我使用“imline”绘制第一条线现在我想在第一条线上绘制第二条线以垂直于它。如果有办法强制第二条内线垂直于第一条线,保持延长长度的灵活性,它将在一定程度上解决我的问题。 我想要在我的图像上使用类似灵活的十字准线(可以沿轴旋转并具有灵活的侧面)来测量特定对象的高度和宽度。
【问题讨论】:
标签: matlab
有什么方法可以限制边缘线始终垂直于绘制在同一对象上的其他边缘线。例如。我使用“imline”绘制第一条线现在我想在第一条线上绘制第二条线以垂直于它。如果有办法强制第二条内线垂直于第一条线,保持延长长度的灵活性,它将在一定程度上解决我的问题。 我想要在我的图像上使用类似灵活的十字准线(可以沿轴旋转并具有灵活的侧面)来测量特定对象的高度和宽度。
【问题讨论】:
标签: matlab
代码:
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
将其保存为函数,然后调用它。您可以拖动绿线,红线保持垂直。请注意,您必须定义您希望它如何保持垂直度。我选择保留红线的长度,并保持在绿线的中心。
【讨论】:
callback_line 中,您可以在该位置上使用disp。或者,您可以让函数返回该行的句柄,然后在需要更新位置时对其使用getPosition。