判断鼠标是否在曲线上的有关问题,老有关问题,再次发问,希望各位帮忙看看,多谢

判断鼠标是否在曲线上的问题,老问题,再次发问,希望各位帮忙看看,谢谢



我想做的就是,当鼠标置于曲线上,既三条曲线任意之一上时,显示提示框,上面显示当前坐标及曲线的相关属性
曲线是自己做的,每条曲线对应一个数组,可以得到x-y值

现在的问题是:
如何能判断出鼠标是否在曲线上?因为要得到曲线的其他属性,所以在哪一个曲线上还是还知道的


这个问题应该是很多网友都问过的,我最近百度得到的解决方案大致如下:
1)通过去鼠标当前位置的屏幕颜色,和曲线颜色对比,一致的话,则可判定鼠标位于曲线上
--缺点是,我有可能存在颜色一样的多条曲线

2)通过当前鼠标的位置,换算为坐标轴中的X-Y值,然后跟每条曲线所对应的数组里的值比对,差值在一定范围内,则为位于曲线上
--一个曲线上上千个点,依次遍历效率太低了吧

3)将曲线变为一个封闭区域,然后判断鼠标是否在区域内
--这个方案没太弄懂怎么实现,不知道是否可行

上面是我查到的,不知道正确高效的方案是什么?希望各位指点一下

想想类似方案,Google地图导航路线上,就可以用鼠标拖动 导航点 ,我想这个实现起来比我这个更麻烦,不过这个也要先确定鼠标在 数据点 上,才可以做拖动吧,希望给位帮忙指点一下,谢谢啦

------解决方案--------------------
一个曲线上上千个点,依次遍历效率太低了吧

不用偏历吧,折半查找不就可以了。
当然值得思考的是,这么多点的坐标值如果排序,才能最快的实现2维折半查找。
------解决方案--------------------
方法2似乎不需要遍历吧?

曲线的坐标是存储在数组中的,这个数组中存放的坐标似乎可以有次序吧,例如按照x增加的次序存储在数组里,那么查询鼠标是否在数组中,不就不用遍历了吗?

------解决方案--------------------
探讨
引用:

一个曲线上上千个点,依次遍历效率太低了吧

不用偏历吧,折半查找不就可以了。
当然值得思考的是,这么多点的坐标值如果排序,才能最快的实现2维折半查找。


折半也不少吧,因为鼠标移动事件中就要判断一下,太频繁了,感觉还是不好呢

------解决方案--------------------
以曲线为中心,向两侧各扩3个点,生成很多个近似RECT ,再把RECT连成RGN,再判断光标在哪条曲线的RGN内,根据纵坐标显示值。

其实不用这么麻烦。只要根据光标的纵坐标值把每条的都显示出来就好了,显示不要重叠、易区分就行了。
------解决方案--------------------
最“快”的办法,在后台画一张一样的图,不用颜色直接用曲线的ID来描点
根据鼠标索引得到后台图像的像素值,即曲线ID
P.S.
一般图形处理类的软件在鼠标拾取时有个感应区域的说法,即使鼠标点下时差几个像素也能选到曲线
------解决方案--------------------
鼠标点扩大一个范围,如果和折线相交,就算选中了。用计算几何相关算法
------解决方案--------------------
只要根据光标的纵坐标值把每条的都显示出来就好了,显示不要重叠、易区分就行了。
----------------------------------

这样也好。
不过有一些挑剔的客户可能不喜欢。呵呵。挑剔的客户大概占总客户数量的10%。
------解决方案--------------------
不需要遍历。
只要你把数组按x或y排序,就不用遍历了,然后用对半查找就可以了。
------解决方案--------------------
如果和数组中的值一模一样就好办了,一般把鼠标正好放在曲线上很难吧,应该是接近靠近曲线时就应该算作,鼠标在曲线上了,这样,此刻鼠标所对应的值,在数组中就不存在
-------------------------------------
近似啊。
取三个曲线中与鼠标位置最近的一个作为被选中的曲线,当然这个最近的位置也需要设一个门限,小于这个门限,才认为用户选中了曲线,否则不管。
------解决方案--------------------
鼠标点扩大一个范围,如果和折线相交,就算选中了。用计算几何相关算法

-------------------------------
这个负荷也不小啊。
例如3×3范围,那么要检测9个点,对应每个曲线。
------解决方案--------------------
探讨

引用:

最“快”的办法,在后台画一张一样的图,不用颜色直接用曲线的ID来描点
根据鼠标索引得到后台图像的像素值,即曲线ID
P.S.
一般图形处理类的软件在鼠标拾取时有个感应区域的说法,即使鼠标点下时差几个像素也能选到曲线


你的意思我明白了,只是后台这种方案不知道怎么操作,可以举个例子吗?谢谢啦

------解决方案--------------------
我说的近似,首先查找每条曲线横坐标x与鼠标最近的数组元素,然后直接用点距离公式,求该点与鼠标点的距离,然后取三个曲线中与鼠标点最近的距离,判断这个最近的距离是否小于门限值,小于门限值,则显示对应的曲线。

计算距离也可以不用开方,直接取平方和。
那么门限可以取5×5或更多。
------解决方案--------------------
18楼的方法有趣。
------解决方案--------------------
探讨

引用:

引用:

引用:

最“快”的办法,在后台画一张一样的图,不用颜色直接用曲线的ID来描点
根据鼠标索引得到后台图像的像素值,即曲线ID
P.S.
一般图形处理类的软件在鼠标拾取时有个感应区域的说法,即使鼠标点下时差几个像素也能选到曲线


你的意思我明白了,只是后台这种……