楼层平面图如何表示房间的使用状态和鼠标点击进行操作?(200分)

  • 主题发起人 主题发起人 Thinboy
  • 开始时间 开始时间
T

Thinboy

Unregistered / Unconfirmed
GUEST, unregistred user!
近期开发的一套沐足场所的管理系统,其中监控部分需要用到场所的平面图来表示
各地方的使用情况,这平面图上有各房间的位置分布,每个房间椅子的数量和位置,
因为这平面图是来源于AutoCad的设计图纸,所以房间的分布和形状、椅子的位置和形状,
都不可能是规则的横线和竖线。
现在要求,每个房间用不同的颜色表示不同的状态,房间里有多少客人,相应地,
占用的椅子的颜色也要改变。点击房间可以查询到房间的使用情况;点击椅子可以改变
椅子是否占用的状态。
现在问题就是,因为这张平面图只是一张图片,那么如何在图片上以不同的颜色显示每间
房间/每张椅子的状态;如何知道鼠标点击的是哪间房间、哪张椅子?

我想了很久,在DFW、CSDN里查了很多问题,还是找不到什么办法解决!
敬请大家一起讨论,谢谢!
 
其实我觉得你是自己把问题复杂化了,为什么一定要用这张图呢?
这样的话可能还要用到边缘查找等复杂的算法,我觉得不值。

完全可以以这个图纸为背景,然后放一些SpeedButton上去,然后在
点击相应的按钮后,显示指定的图片,这些图片可以从你现在的这张
图片中切出来,比如说一些房间的形状了什么的。

这只是个思路,你看看可不可行?
 
我想可以这样
1、对图片进行分区——将整张图分成若干个相同的正方形格(具体个数要看你的图纸了,要达到 整数 个正方形格填满一个房间、椅子)。
2、这样再将你的方形格子们 编号,最好是二维表格的形式,用一组数(x,y)唯一表示一个格子。
3、建立一个与之对应的数组,每个元素(对应了每一个格子)存储一个标志该方格类型的值(这就自己定义了)。
4、程序中通过鼠标点击的坐标换算出方型格的坐标(即对应数组的坐标),取出该格的类型值,检索周围相同类型的区域,
确定一个房间或椅子,换算出一个房间或椅子在图片上的实际位置,再改变他们的颜色,或其他操作。
5、至于 如何知道鼠标点击的是哪间房间、哪张椅子 就依托与数组元素中存储的类型值了,设计好这些值就迎刃而解了。
 
还是 娃娃 的方法好
在图纸上作一些 无 caption 的lable框(设定好它们的大小),再将它们串联起来共同响应一个事件(需传递一个标志类型的参数)
就搞好了。
咳,打了这么多,还不如 一个娃娃的几句话,老了老了,咳咳:)
 
哈哈,Yves,你是在骂我啊,你都老的咳成那样了,我不是该老死了^_^

谢谢你的夸奖,我会继续努力的。^_^
 
娃娃的方法倒是简单,但是好像不能达到点击一个图形内的任一点,达到选中它的目的(因为图形是不规则的)
 
谢谢大家的帮助!

娃娃和Yves的提议都很好,可以综合使用,但正如locka所说的“像不能达到点击一个图形内的任一点,达到选中它的目的(因为图形是不规则的)


但是如何“对图片进行分区——将整张图分成若干个相同的正方形格”?
 
也是,如果有SpeedButton的确会有这样的问题,但是如果继承一下SpeedButton
实现一个异型按钮的话,应该也不是很难,这样的话就可能解决这个问题了。
关于异形按钮的做法,我有文章在天极网,可以去看看。(不过我也不知道能不
能找到了^_^)
 
一个办法——在内存中构造一个对象数组(可以采用TList)存放图中包含的所有对象,以及
一个尺寸和原始图形一样的二维数组,其中的每个元素和图片上的像素相对应,数组元素的
值对应于内存中的对象数组序号。例如:MemMap[x][y]:=5; 意味着(x,y)像素对应的是数组
中的第五个对象——可以根据对象本身的信息确定它是个椅子。
这样,我们就可以通过在Image.OnClick事件中用API获得的X,Y座标确定点击的对象。
 
我来解释一下:
对图片进行分区——将整张图分成若干个相同的正方形格
这个并不是指 真的让你 把 好好的 一张图 画上横竖线 —— 一格一格的,
而是指,你脑子 里 把他看成一块一块的 然后将每块映射为一个数组元素,
在你的程序中,程序本身并不知道有一张平面图,只知有一个数组
其实你也不用知道 这个平面图 是什么样子,你只要得到描述这个图片的数据(即这个映射后的数组)
这个程序也就可以编了,这也应叫做 地图的数字化吧,把地图分为一个个小方格,就是为了采集数据;

为什么要分成若干个格子呢?原因有二:
1、因为地图上的物体各不相同,所以 对应于 描述它们的数据 也就不同,如果一张图上就一个房间(充满图片),
那也不用分了,就一个格子行了(当然这是不合题意的);
2、如果如 1 所说 一个物体一个格子 也是不行的,
这就是locka所担心的事,
需要将格子多分一些,每个分的很小,一个图上物体,要由 多个格子 来填充(当然这“多个格子”要有统一的类型值),
由此就做到了 用微元近似不规则图形,这样 用户 对图片的 不规则边缘部分的 选取就可以被计算机识别出来,
当然这也不能达到locka所说“点击图形内 任一点 都可选中”这是显而易见的,
这需要无限分割——这计算机怎么能做到!对图描述越精细,数据量越大以至无穷。
相信 用户 不会成心给你挑刺,想选椅子 能点椅子面,他就不会点椅子腿接地的那一点。

至于为什么要分成 “相同” 的格子,原因是:
分成相同的格子后,整个平面图就对应了一张二维表格,这样一张表格 由数组来描述 是十分方便的。

我应该解释清了吧


 
creation-zy的方法确实达到了 任意点 都能 被捕获的要求
不过这样数据量可就太大了,这可是楼层平面图,不是小地方,一个楼层都不一定是一屏幕能显示开的,
还 每个象素 都存储太夸张了,不必这么极端吧:)
如果 瘦男孩(thinboy) 的不规则 按钮 可以做出(当然可以作出),那还是娃娃的方法方便一些,
娃娃的方法需要的是大量的控件,代码量很少,
我的方法代码量大,控件少,
控件多了不要紧,代码多了错误也就都跟着来了,调试又得费一堆时间(就像我今天上午,跟鬼打墙似的)
 
谢谢Yves及各位网友的详细解答

关于不规则按钮的制作,应该如何做?
我倾向于使用不规则按钮,正如Yves说的,代码多了,错误的机会也就多了!

再次谢谢!
 
自己开发控件吧
Tchair
Troom
怎么样?这个方法可能还比较简单
 
不谢不谢:)
真高兴 有人谢我了:)

查查以前的帖子吧
 
http://www.codeidea.com
有个TCAD可以满足您的要求
 
用FLASH做,前段时间不是有人介绍在DELPHI里使用FLASH嘛!
 
又如何改变房间或者椅子的颜色呢?我想套图上去,但是如何在同一位置层叠多张图?
 
你是用 娃娃的 hutton 方法
贴图片就要贴在 button 上,
可我不知 speedbutton可不可以显示图片?
 
我是这样想的,因为房间两种颜色表示,我就堆叠放两个Image,
底图是缺省的颜色,顶图是激活的颜色,可不可以控制顶图,只显示(或者不显示),
就是透明某一区域的图像,而透出底图的图象?

谢谢!
 
要只显示某个 image
把他的 visable属性 设为 true
另一个 设为 false
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部