情节上有三个可拖动的点

时间:2017-07-25 21:45:04

标签: matlab matlab-figure

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

  1. 用户点击一行
  2. 每次点击都会产生一个与最近的数据点对齐的小圆圈
  3. 选择新数据点(新圆圈)时,会在两点之间创建一条线(最终,三点之间总共有两条线)
  4. 当选择第三个数据点时,将出现一个文本框,根据三组XY坐标进行特定计算
  5. 当用户拖动三个点中的任何一个时,文本框中的计算将会更新
  6. 我希望在曲线的不同部分有任意多组三个点及其相关文本框
  7. 我想我必须使用" 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编写的,即使现在我也无法理解所有这些功能:所有功能都归功于他。有人可以修改脚本或从头开始创建以解决上述问题吗?

1 个答案:

答案 0 :(得分:0)

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