我有一个关于我的 GUI 的问题已经困扰了我几个小时,但我无法修复它。功能:我加载图像,对其进行子集化并将其绘制为冲浪图。然后我启动一个 GUI,它让我可以选择矩形的左上角和右下角坐标。矩形被绘制到冲浪图上。
我有两个问题:我想用红色小块表示鼠标点击,用红线表示矩形。
1)小红块工作正常,除了第一个非常大并且几乎填满了整个绘图窗口。一旦我为第一个坐标选择第二个点,一切都会恢复正常,并且补丁会以我希望它们的小方式绘制。我调试了代码以查看坐标是否有问题,但它们似乎没问题!
2)线条的绘制不准确!尤其是前几行,鼠标点击最多偏移 100 个像素,通常在左侧。有时它们甚至在添加下一行时会四处移动。以这种方式放置几个矩形后,它们通常会变得更好并且就位。知道这是为什么吗?这是代码:
function resampdem
clc;clear;clear all
%% read DEMs and header
img1 = imread('srtm_55_06.tif');
% subset
img1 = img1(1:500,1:500);
[x y] = meshgrid(1:500,1:500);
%%
f = figure;
imageHandle = surfl(x,y,img1);
colormap jet
shading interp
view(0,90);
set(imageHandle,'ButtonDownFcn',@ImageClickCallback)
hold on
a = axes;
set(a, 'Visible', 'off');
%# Create controls.
uicontrol('Parent', f, 'Style', 'edit', 'String', 'Input...');
m = 1;
bin = [];
%%% Funktion zur Auswertung des Mouseklicks
helpdlg('Corner: Upper Left');
function ImageClickCallback ( objectHandle , eventData )
% if mod(m,2) == 0
% string = 'Upper Left';
% else
% string = 'Lower Right';
%
% end
% message = sprintf('Corner: %s',string);
% helpdlg(message);
axesHandle = get(objectHandle,'Parent');
coordinates = get(axesHandle,'CurrentPoint');
coordinates = coordinates(1,1:2);
bin(m,1) = coordinates(1)
bin(m,2) = coordinates(2)
patch([bin(m,1)-3 bin(m,1)+3 bin(m,1)+3 bin(m,1)-3], [bin(m,2)+3 bin(m,2)+3 bin(m,2)-3 bin(m,2)-3],'r','Parent',a);
if mod(size(bin,1),2) == 0
resamp_area(bin,m);
end
m = m+1
end
%%% Funktion zum Zeichnen der Rechtecke
function resamp_area(coords,m)
x1 = coords(m-1,1);
x2 = coords(m,1);
y1 = coords(m-1,2);
y2 = coords(m,2);
patch([x1 x1+20 x1+20 x1], [y1 y1 y1-20 y1-20],'w','Parent',a);
%horizontal lines
line([x1, x2], [y1, y1], 'Parent', a, 'Color',[1 0 0], 'LineWidth',2.0);
line([x1, x2], [y2, y2], 'Parent', a, 'Color',[1 0 0], 'LineWidth',2.0);
%vertical lines
line([x1, x1], [y1, y2], 'Parent', a, 'Color',[1 0 0], 'LineWidth',2.0);
line([x2, x2], [y1, y2], 'Parent', a, 'Color',[1 0 0], 'LineWidth',2.0);
%get(t)
end
end