在matlab中捕获鼠标点击位置

Capturing mouse click locations in matlab

我正在使用 MATLAB 内置函数 getpts 允许用户在图形上放置点,然后在这些点上应用贝塞尔曲线。问题是用户第一次点击的时候,鼠标第一次点击的地方和getpts显示的点不一样。这里有什么问题?

在这张图中你可以看到鼠标点击的真实位置的红色星星,在第二张图中你可以看到点击后的结果点!

您描述的问题是因为您启用了 automatic resizing of the axesaxis auto,这是默认设置)。当您第一次显示 axes 时,xrange 是 [0, 1],yrange 是 [0, 1]。一旦你绘制一些东西,轴就会限制调整大小以自动适应新数据。

因此,如果我们看一下您最初单击的位置,它就是坐标轴的左下角。

现在查看您绘制的 x,y 坐标,这些坐标由 getpts 返回。如果您认为 x 的坐标轴限制是 [0,1],y 的坐标轴限制是 [0,1],那么您会发现返回的 x,y 坐标 左下角正是你的星星所在的位置。

问题是,一旦您绘制该点 plot(x,y),轴就会限制 shift 将这个新点放置在轴的中心(注意您发布的图中的 x 和 y 轴限制)。结果,它 看起来 好像它在错误的地方,而实际上它是正确的地方并且 视图 已经改变。您可以在绘制新点时通过观察 xticklabels 和 yticklabels 来观察轴的这种变化限制了自己。

解决此问题(并确保这是实际发生的事情)的最简单方法是使用 axis 命令在调用 getpts.[=25 之前禁用自动轴大小调整=]

axis manual

在此之后,x and y limits 个轴只有在您手动更改它们时才会更改,您应该不会再遇到您所描述的问题。

应该工作的完整代码是。

fig = figure();
hax = axes('Parent', fig);
axis(hax, 'manual')
[x,y] = getpts();

您可以使用 CurrentPoint 属性 图形或轴来做您想要的。 在轴对象中: 最后一次鼠标单击的位置,指定为坐标区坐标系中的 2×3 数组。 CurrentPoint 属性 包含最后一次单击鼠标时指针位置定义的两点相对于请求轴的坐标。

如果点击在正交投影的轴内,则两点位于垂直于屏幕平面并通过指针的线上。对于 2-D 和 3-D 视图都是如此。

3-D 坐标是轴坐标系中的点,该线与轴体积的前表面和后表面相交(由轴 x、y 和 z 限制定义)。

返回的矩阵形式为:

[xfront yfront zfront
xback  yback  zback]

第一行定义离相机位置最近的点。第二行指定距离相机位置最远的点。

如果点击在正交投影轴外,但在图中,则返回值为:

Back point — 相机目标平面中的点(垂直于观察轴)。

Front point — 相机位置平面中的点(垂直于观察轴)。

这些点位于通过指针并垂直于相机目标平面和相机位置平面的线上。

使用透视投影时当前点的值可能与正交投影中的相同点不同,因为轴体积的形状可能不同。

在透视投影中单击坐标轴体积外 returns 前点始终作为当前相机位置。只有后点更新为位于从相机位置延伸通过指针并与相机目标相交于该点的直线上的点的坐标。

以及图形对象: 此图中最后一次单击按钮的位置,以二元素向量形式返回。 CurrentPoint 属性 值是从图 window 的左下角开始测量的,单位由 Units 属性 确定。每当用户在指针位于图中 window.

时按下鼠标按钮,MATLAB 就会更新此 属性

如果用户选择图中的一个点,并且您使用 CurrentPoint 属性 返回的值绘制该点,由于四舍五入,位置可能会有所不同错误。

例如

a=figure
plot(1:100)
location=a.CurrentPoint