有没有一种方法可以让imline创建的一条线的末端到曲线上最近的数据点?
我试着测量曲线上两点之间的斜率。imline是伟大的,但由它创建的线的末端不与曲线上的数据点相一致。
我想知道我是否可以把这条线拖来绕去,而这条线的两端都在曲线上。
发布于 2015-09-08 23:49:15
它可以使用'PositionConstraintFcn'属性imline来完成。它的值指定一个函数句柄,每当使用鼠标拖动该行时都调用该句柄。
'PositionConstraintFcn':每当使用鼠标拖动行时调用的函数句柄fcn。 每当对象由于鼠标拖动而被移动时,都会使用语法:constrained_position = fcn(new_position)调用约束函数,其中new_position的形式是.
new_position的形式是2x2矩阵,其中每一行都是直线的端点;列分别表示x和y。
所以,您所要做的就是指定一个函数,该函数为每个端点找到最接近的点,并返回受约束的位置。这可以分为两个步骤:
2x2矩阵)和允许的位置集(Nx2,N表示曲线的点数)作为输入。输出为具有约束位置的2x2矩阵。
函数constr_pos = imline_snap(new_pos,ind2 ) ~,ind1 =min(sum(bsxfun(@减号,new_pos(1,:),.^2,2));~,ind2=min(sum(bsxfun(@减号,new_pos(2,:),ind2).^2,2);constr_pos =位置(ind1,:);位置(ind2,:)
在它自己的m文件(imline_snap.m)中定义这个函数,并将它放在Matlab可以找到的地方,例如在当前文件夹中。
这就是它的工作原理。该函数接收鼠标(new_pos)选择的两个点和定义曲线的点集(positions)。它计算第一个鼠标点到曲线中每个点的距离(sum(bsxfun(@minus, new_pos(1,:), positions).^2, 2)),并用最小距离(ind1)得到曲线中点的索引。第二点(给出索引ind2)也是如此。最后,将这些指标用于选择合适的曲线点和建立输出量(constr_pos)。imline_snap函数需要与曲线点对应的允许位置进行细化。这是必要的,因为PositionConstraintFcn只能接受一个输入,即imline_snap的第一个输入。这可以通过一个匿名函数来完成(参见下面的示例fcn = ...行);然后将其句柄传递给imline。示例代码:
h = plot(0:.01:1, (0:.01:1).^2); %// example curve. Get a handle to it
a = gca; %// handle to current axes
X = get(h,'XData'); %// x values of points from the curve
Y = get(h,'YData'); %// y values of points from the curve
fcn = @(pos) imline_snap(pos, [X(:) Y(:)]); %// particularize function using curve points
imline(a, 'PositionConstraintFcn', fcn) %// create imline with that PositionConstraintFcn应该注意的是,代码快照到实际曲线点。例如,它不会在曲线点之间进行插值。这可以相应地修改imline_snap函数(但如果操作的数量很大,则可能导致缓慢的移动)。
下面是上面的工作示例(在Matlab R2010b中)。曲线最右边的端点是用鼠标任意拖动的,但可以看到它被按在曲线上。

另外,修改函数以显示图形标题中的斜率是很容易的。只需在imline_snap函数的末尾添加以下行:
title(['Slope: ' num2str((constr_pos(2,2)-constr_pos(1,2))/(constr_pos(2,1)-constr_pos(1,1)))])显示斜率的例子:

https://stackoverflow.com/questions/32467969
复制相似问题