我正在使用MATLAB内置函数getpts
来允许用户在图上放置点,然后在这些点上应用贝塞尔曲线。问题是当用户第一次点击时,首次点击鼠标的位置与getpts
显示的点不同。这是什么问题?
在此图像中,您可以看到点击鼠标的真实位置的红色星形,在第二个图像上,您可以看到点击后的结果点!
答案 0 :(得分:2)
您所描述的问题是因为您启用了automatic resizing of the axes(默认为axis 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
之前禁用自动轴调整大小。
axis manual
在此之后,只有在您手动更改轴时才会更改x和y limits轴,并且您不应再遇到任何问题,例如您所描述的问题。
应该有效的整个代码。
fig = figure();
hax = axes('Parent', fig);
axis(hax, 'manual')
[x,y] = getpts();
答案 1 :(得分:1)
您可以使用图形或轴的CurrentPoint
属性来执行您想要的操作。
在轴对象:
最后一次鼠标单击的位置,在轴坐标系中指定为2×3阵列。 CurrentPoint
属性包含两个点的坐标,这两个点由最后一次鼠标单击时指针位置相对于请求的轴定义。
如果咔嗒声位于正交投影中的轴内,则这两个点位于垂直于屏幕平面且穿过指针的线上。对于2-D和3-D视图都是如此。
三维坐标是轴坐标系中的点,此线与轴体积的前后表面相交(由轴x,y和z限制定义)。
返回的矩阵格式为:
[xfront yfront zfront
xback yback zback]
第一行定义最靠近摄像机位置的点。第二行指定距离摄像机位置最远的点。
如果单击位于正交投影中的轴外,但在图中,则返回的值为:
Back point
- 指向相机目标平面(垂直于观察轴)。
Front point
- 指向相机位置平面(垂直于视轴)。
这些点位于穿过指针的线上,垂直于相机目标和相机位置平面。
使用透视投影时当前点的值可能与正投影中的相同点不同,因为轴体积的形状可能不同。
在透视投影中单击轴体积外部将前点始终作为当前摄像机位置返回。只有后点更新时,点的坐标位于从摄像机位置延伸到指针并在该点与摄像机目标相交的直线上。
和图形对象:
在此图中单击最后一个按钮的位置,作为双元素向量返回。 CurrentPoint
属性值是从图窗口的左下角开始测量的,单位由Units属性确定。只要用户在指针位于图形窗口中时按下鼠标按钮,MATLAB就会更新此属性。
如果用户选择图中的一个点,并使用CurrentPoint
属性返回的值来绘制该点,则由于舍入误差,位置可能会有差异。
例如
a=figure
plot(1:100)
location=a.CurrentPoint