绘图上的三个可拖动点

Three draggable points on a plot

我正在尝试创建执行以下操作的回调函数:

  1. 用户点击一行
  2. 每次点击都会生成一个捕捉到最近数据点的小圆圈
  3. 作为一个新的数据点(一个新圆),在两个点之间创建了一条线(最终在三个点之间总共有两行)
  4. 选中第三个数据点时,会出现一个文本框,根据三组XY坐标进行一定的计算
  5. 当用户拖动三个点中的任意一个时,文本框中的计算将更新
  6. 我希望在曲线的不同部分有任意多组三点及其关联的文本框

我想我必须使用 "impoint" 来生成可拖动点并使用 "bsxfun" 进行捕捉。我在类似的上下文中有一些使用 "imline" 的东西,如果有任何帮助,下面提供了这些功能。

function calc_slope(handle,event)

axis_h = findobj(gcf,'Type','axes');   
line = get(gco);

xdata = line.XData;
ydata = line.YData;

tb_h = text(0,0,'');

fcn_constr = @(pos) imline_snap(pos, [xdata(:) ydata(:)],tb_h); 

imline_h = imline(axis_h, 'PositionConstraintFcn', fcn_constr);

addlistener(imline_h, 'ObjectBeingDestroyed', @(obj,event) delete(tb_h));

function constr_pos = imline_snap(new_pos, positions, tb_h)

[~, ind1] = min(sum(bsxfun(@minus, new_pos(1,:), positions).^2, 2));
[~, ind2] = min(sum(bsxfun(@minus, new_pos(2,:), positions).^2, 2));

constr_pos = [positions(ind1,:); positions(ind2,:)];

    set(tb_h, 'String',...
              sprintf(['    \DeltaY/\DeltaX = ',...
                       num2str((constr_pos(2,2)-constr_pos(1,2))/(constr_pos(2,1)-constr_pos(1,1))),...
                       '\n    \DeltaX = ',num2str(constr_pos(2,1)-constr_pos(1,1)),...
                       ', \DeltaY = ',num2str(constr_pos(2,2)-constr_pos(1,2))]),...
              'Position', mean(constr_pos));

核心功能是由@Luis Mendo 编写的,即使是现在我也无法理解所有这些功能是如何工作的:所有功劳都归功于他。有人可以修改脚本或从头开始创建来解决上述问题吗?

我使用了 datacursormode 和 getCursorInfo。没有线或自动更新,但点被捕捉和拖动。