【发布时间】:2015-09-09 17:33:00
【问题描述】:
这篇文章是线程的延续:“Matlab imline snapping”已解决。下面是将 imline 对象捕捉到曲线的工作代码。
function calc_slope(handle,event)
axis_h = findobj(gcf,'Type','axes');
obj_h = get(axis_h,'Children');
obj_type = get(obj_h,'Type');
if ~iscell(obj_type),obj_type = cellstr(obj_type);end
for i=1:length(obj_type)
if strcmpi(obj_type{i},'line'),data = obj_h(i);end
end
xdata = get(data,'XData');
ydata = get(data,'YData');
on = get(handle,'State');
if strcmpi(on,'on') || strcmpi(on,'off'),
fcn_constr = @(pos) imline_snap(pos, [xdata(:) ydata(:)]);
xy = imline(axis_h, 'PositionConstraintFcn', fcn_constr);
addNewPositionCallback(xy,@(pos) disp_slope(pos));
end
function constr_pos = imline_snap(new_pos, positions)
[~, 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,:)];
function disp_slope(pos)
delete(findobj(gca,'Type','text'));
text((pos(1)+pos(2))/2,(pos(3)+pos(4))/2,['\DeltaY/\DeltaX = ',num2str((pos(4)-pos(3))/(pos(2)-pos(1))),...
' [\DeltaX = ',num2str(pos(2)-pos(1)),', \DeltaY = ',num2str((pos(4)-pos(3))),']']);
每次切换图形工具栏上的切换按钮(打开和关闭)时,都会抛出一个新的imline对象。有许多具有不同参数的图形,因此必须从图形中提取数据。在给定的图中,可以有多个对象:imline 对象、文本和/或线条;因此,calc_slope 函数的前七行。
imline 对象捕捉到曲线的最近数据点,它由 imline_snap 函数完美完成,这是“Luis Mendo”的回答。非常感谢。这是最令人头疼的问题。
现在的最后一个问题是在文本框(而不是标题或浮动框)中显示 imline 对象的斜率。在 disp_slope 函数中尝试过(而且很糟糕)。
我正在做“删除(findobj(gca,'Type','text'));”只是因为没有这样的东西,当 imline 对象被移动时,它会留下数百万个文本框。我只想显示一个最新的斜率计算。
“delete(findobj(gca,'Type','text'));”存在多个问题。如果我停止移动这条线,它将很好地显示最后的斜率计算。但是,只要我放入另一个 imline 对象并移动新的对象,第一个 imline 对象中的文本框就会被删除,当然。
另外一个问题是,即使我删除了imline对象,关联的文本框也会保留。
总之,
- 我想在文本框中显示当前计算的斜率
- 我希望每个 imline 对象的文本框保留,即使有多个 imline 对象。
- 最后,我希望在删除特定的 imline 对象时相应的文本框也消失。
这可以吗?请帮忙。
谢谢,
埃里克
【问题讨论】:
标签: matlab matlab-figure