【界面库设计】关于鼠标事件感知问题

飞天御剑流 2013-04-07 01:16:09
近日在一个界面库的设计过程中,遇到一个鼠标事件感知的问题,就是当鼠标在一系列图元上(考虑overlap)经过或点击时,如何获得鼠标当前所经过或点击的图元?现在的方案,是利用现有的一个由已产生图元按生成顺序组成的队列,图元的抽象基类添加一个成员Is_xxx,检测鼠标坐标是否在图元内部,这个方案需要消耗线性搜索时间,而且即使鼠标没有经过的图元也可能被查询一次;还考虑过在图元绘制时,保存像素的对应图元对象的标识,这个方案可以获得常数搜索时间,但需要消耗较多的空间。

这两种方案都不能令人满意,看看各位有没有更好的想法,谢谢!
...全文
254 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
ri_aje 2013-04-08
  • 打赏
  • 举报
回复
看起来应该用 quadtree 或 r-tree (http://en.wikipedia.org/wiki/R-tree),判断时间都是 logn 的。另外,如果绘图用的是 gl 的话,还可以用 shader 直接渲染 id,这样鼠标点击的时候直接读取对应像素的图元 id 即可。
飞天御剑流 2013-04-08
  • 打赏
  • 举报
回复
引用 8 楼 turingo 的回复:
判定坐标在哪个图元上是必须的啊,就像人总是要吃饭一样,考虑的方向应该是如何提高搜索效率。 引用 6 楼 supermegaboy 的回复:但现在不是鼠标坐标的问题啊,无论使用什么样的坐标也好,上一次的坐标也好,都需要判断这个坐标在哪个图元上啊。
嘿,偶现在纠结的就是如何更好、更有效率地“判定坐标在哪个图元上”。
ryfdizuo 2013-04-08
  • 打赏
  • 举报
回复
引用 11 楼 ri_aje 的回复:
看起来应该用 quadtree 或 r-tree (http://en.wikipedia.org/wiki/R-tree),判断时间都是 logn 的。另外,如果绘图用的是 gl 的话,还可以用 shader 直接渲染 id,这样鼠标点击的时候直接读取对应像素的图元 id 即可。
赞~ 2d中用四叉树管理所有2d 图元。如果ui用opengl绘制 可以通过裁剪测试实现帧缓存的局部更新。
赵4老师 2013-04-07
  • 打赏
  • 举报
回复
参考开源UI库源代码?
图灵狗 2013-04-07
  • 打赏
  • 举报
回复
判定坐标在哪个图元上是必须的啊,就像人总是要吃饭一样,考虑的方向应该是如何提高搜索效率。
引用 6 楼 supermegaboy 的回复:
但现在不是鼠标坐标的问题啊,无论使用什么样的坐标也好,上一次的坐标也好,都需要判断这个坐标在哪个图元上啊。
酱油党 2013-04-07
  • 打赏
  • 举报
回复
--应该在图元的基类里添加默认的点击的处理函数吧 。 想MFC那样,用消息队列。--没做过。只是感觉这样应该会对楼主的需求有帮助。
飞天御剑流 2013-04-07
  • 打赏
  • 举报
回复
但现在不是鼠标坐标的问题啊,无论使用什么样的坐标也好,上一次的坐标也好,都需要判断这个坐标在哪个图元上啊。
图灵狗 2013-04-07
  • 打赏
  • 举报
回复
那么可以记录上一次的鼠标位置,由于大部分的鼠标操作位置变化不太大,你从上一次的位置往四周查找,这样平均起来查找的次数较少,不可见的图元直接跳过。
引用 3 楼 supermegaboy 的回复:
引用 1 楼 turingo 的回复:1、图元更新的时候,同步计算好可见和非可见区域; 2、鼠标感知的时候,只需要搜索可见区域即可。 本来就分了区域了,仅可以降低判断的时间,但依然需要线性查找。
飞天御剑流 2013-04-07
  • 打赏
  • 举报
回复
引用 1 楼 turingo 的回复:
1、图元更新的时候,同步计算好可见和非可见区域; 2、鼠标感知的时候,只需要搜索可见区域即可。
本来就分了区域了,仅可以降低判断的时间,但依然需要线性查找。
引用 2 楼 Loaden 的回复:
应该得有一个Z轴吧。 谁处理鼠标事件谁负责发送消息及返回消息队列。 没设计过,凭感觉说的。:-)
2D,
飞天御剑流 2013-04-07
  • 打赏
  • 举报
回复
引用 1 楼 turingo 的回复:
1、图元更新的时候,同步计算好可见和非可见区域; 2、鼠标感知的时候,只需要搜索可见区域即可。
本来就分了区域了,仅可以降低判断的时间,但依然需要线性查找。
老邓 2013-04-07
  • 打赏
  • 举报
回复
应该得有一个Z轴吧。 谁处理鼠标事件谁负责发送消息及返回消息队列。 没设计过,凭感觉说的。:-)
图灵狗 2013-04-07
  • 打赏
  • 举报
回复
1、图元更新的时候,同步计算好可见和非可见区域; 2、鼠标感知的时候,只需要搜索可见区域即可。

64,266

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧