绘图上的三个可拖动点
Three draggable points on a plot
我正在尝试创建执行以下操作的回调函数:
- 用户点击一行
- 每次点击都会生成一个捕捉到最近数据点的小圆圈
- 作为一个新的数据点(一个新圆),在两个点之间创建了一条线(最终在三个点之间总共有两行)
- 选中第三个数据点时,会出现一个文本框,根据三组XY坐标进行一定的计算
- 当用户拖动三个点中的任意一个时,文本框中的计算将更新
- 我希望在曲线的不同部分有任意多组三点及其关联的文本框
我想我必须使用 "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。没有线或自动更新,但点被捕捉和拖动。
我正在尝试创建执行以下操作的回调函数:
- 用户点击一行
- 每次点击都会生成一个捕捉到最近数据点的小圆圈
- 作为一个新的数据点(一个新圆),在两个点之间创建了一条线(最终在三个点之间总共有两行)
- 选中第三个数据点时,会出现一个文本框,根据三组XY坐标进行一定的计算
- 当用户拖动三个点中的任意一个时,文本框中的计算将更新
- 我希望在曲线的不同部分有任意多组三点及其关联的文本框
我想我必须使用 "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。没有线或自动更新,但点被捕捉和拖动。