图形上的点标记问题 ( 积分: 100 )

  • 主题发起人 主题发起人 ujin
  • 开始时间 开始时间
U

ujin

Unregistered / Unconfirmed
GUEST, unregistred user!
有多张图,每张图上需要标记多个不同的点,要实现以下功能:
在IMAGE中调入一张图,
当鼠标移动到这些点上方时进行响应,显示一个框,表示这儿有一个点,还要处理其他一些事务,比如显示这个点的相关信息等等。
怎么实现?能不能给个思路?
 
有多张图,每张图上需要标记多个不同的点,要实现以下功能:
在IMAGE中调入一张图,
当鼠标移动到这些点上方时进行响应,显示一个框,表示这儿有一个点,还要处理其他一些事务,比如显示这个点的相关信息等等。
怎么实现?能不能给个思路?
 
首先你要知道这些点的坐标
你如何将一个点和其相关信息关联的?
 
是这样的,针对于每一幅图片,在数据库中都有相关记录,这些记录包括点的坐标信息和要显示的信息。
如:
图片编号 点编号 X Y 信息
1 1 10 10 a
1 2 10 23 b
......

考虑在TImage上放其他控件,通过TImage的MouseMove来判断在哪个点上方,再显示,但图片上的点太多,好像这样做也太笨了。
 
楼主是不是在做gis?呵呵
一种简单的方法是,把该图片相关的点都存放在一个数组里,然后OnMouseMove的时候将当前(X, Y)与数组中的各点一一比较,直到找到一个相同的点或者遍历结束;通常这样的效率也不会很低
另外如果要高效,可以考虑类似对稀疏矩阵的处理方法,建立一套二维链表,结构如下
[Header] → [10] → [17] → ... →(指回Header)
↓ ↓ ↓
[10] → {1} → ↓ → ... →(指回[10])
↓ ↓ ↓
[23] → {2} → ↓ → ... →(指回[23])
↓ ↓ ↓
[31] → ↓ → {3} → ... →(指回[31])
↓ ↓ ↓
... ... ...
↓ ↓ ↓
(回Header) (回[10])(回[17])

以上是以下点阵的二维链表结构示意图
====
图片编号 点编号 X Y 信息
1 1 10 10 a
1 2 10 23 b
1 3 17 31 c
====
这样在OnMouseMove时都通过这个链表查询是否有符合当前X和Y的结点,例如当前X=10,Y=23,首先通过横坐标找到[10]这列有两个结点,然后通过Y=23向下遍历找到第二个结点即与当前鼠标坐标相同,然后通过这个结点的{2}(表示该点在数据库中的点编号),然后到上面说过的那个数组里,用这个编号做下标,即可得其点信息
其实,直接把点信息放到{2}中就更加简便了,修改一下结点得结构即可
 
每张图大约有四、五十个点吧,用第一种方法,效率不会太低吧。
说是四、五十个点不太合适,应该说是四、五十个区域,比如(10,10)是以10,10位中心的一个正方形区域。
另一个问题是:找到这个点,我要在这个点上显示一个框,这个框以什么形式比较好?因为我要随着图片的放大,这个框也要相应的放大。
 
既然是一个以指定坐标为中心的范围,那一般用直接遍历应该没问题,我用这样在图上有上百个点的时候cpu占用也比较小
当然应该有更好的,偷懒了
这种类似矢量的图形操作我觉得用DirectDraw要比Image控件好很多,尤其是如果你这几十个点是程序动态draw上去的,那Image控件在鼠标移动过程中会闪烁的很厉害
简单点的话就用个Edit(或Memo)做信息显示框(去掉控件的边框),另外为什么要跟着图片放大信息框?一般某个点的信息提示都是保持在一定字体(字号)下不变的。gis系统通常都这么做
 
我做的不是GIS,这些点也不用draw,只是鼠标移动到每个点周围时,在这个点的上方显示框,这一点我是用一个背景透明的Image来做的,这样只需要不断的移动这个Image的位置就可以了,通过设置Image的Visible来表示当前是否在点的周围。
不是放大信息框,而是放大图片,就是有点的图片。
信息框不用放大,它是放在另一个窗体,浮动在当前窗体之上。
 
接受答案了.
 
后退
顶部