Hi! 遇到一个问题,我希望能快速判断一些点是否在某个区域内,但是对于1024x768这样多的点来说,调用这么多次 PtInRegion 函数,成本太高,我承担不起。 我的做法是,创建一个蒙版,跟图像一样大,BYTE[Y][X],如果某个点(x,y)有BYTE[y][x] == 1,则这个点在区域内。 可是我还是得调用 PtInRegion 来创建这么一个蒙版,在创建的时候,速度很慢。Debug模式下测试,对于 1024x768 左右的区域,差不多要 2秒 的时间。太慢了!
我的问题:
有没有什么好的办法,能够快速的创建我的“蒙版”?
或者更好的主意也成。
非常感谢您的帮助!
我的问题:
有没有什么好的办法,能够快速的创建我的“蒙版”?
或者更好的主意也成。
非常感谢您的帮助!
解决方案 »
- GDI过滤黑色
- sdk 为窗口添加其它控件的代码该往哪里写?
- 请问如何使用Installshield创建Uninstall.exe卸载程序?
- 哪位好心人知道8086的指令使用频度?
- 如何得到combo box下拉框某一列的值???
- VC++ / SQL Server 2000 开发基于WEB的信息管理系统,需要哪些关键技术,求教!!
- 请教一个关于获取文档指针的问题?
- 怎么填充一个数组?
- 请问VC中1024*1024*1024*50这样大的数,用什么数据类型可以表示.
- 在VC6下如何编译纯DOS程序
- 请问如何编程实现更改Windows系统字体的大小??
- 求-Windows IFS KIT 2003下载
其实我也猜到用这个函数,只是这个函数msdn上语焉不详,大侠的书上讲的很详细.
请问 ddddh(叶君临) 兄,你知道如何判断,点是否在边界上么?
呵呵,我道不孤啊:)楼上的,我倒不是很在乎专家分(我的可用分够我用的了)也不是不想写详细一点,只是写详细的话,难免会引用到Feng Yuan的那本书上去。
主要就是 GetRegionData 把 区域 变成一个个的RECT的累加了。通过这个函数可以得到这些个RECTs的指针。我觉得点到为止比较好,再往下说就没意思了:)
的速度快多少?原理有什么差别!?谢谢
!
搂主,你说的那个函数比PTINREGIN
的速度快多少?原理有什么差别!?谢谢
!
----------------------------------------------------------------------
速度上,以前是1.9秒,现在是20-40毫秒,速度的提升是很明显的(DEBUG模式,release版估计更快)。
原理就是,一方面几十万次的函数调用(PtInRegion),这个开销很大(参数入栈出栈,以及IP的变化引起cpu cache命中率的降低)。另外一个方面,我猜测在PtInRegion内部,也需要调用 GetRegionData() 来得到表示这个region的rect array,这个开销也很大。回复人: xstring(麻雀) ( ) 信誉:134 2004-04-07 08:04:00 得分:0
我有个方法没有试弄一个memory dc,然后将一个黑白的dib bitmap select进去,将整个dc填 充成白色的,使用这个region进行FillRgn,将这个region填充成黑色的。之后你可以GetDIBData来获得你在第一篇里面提到的蒙版,这个应该更好
----------------------------------------------------------------呵呵,想法很巧妙:)
不过我觉得肯定没有GetRegionData快。理由如下:1. FillRgn的操作,内部一定有调用 GetRegionData(),来得到 rect array,然后
for each rect (fillRect), 而我既然得到了这个Rectarray,我就可以直接用这些rect fill我自己的mask[][],无需经过bitmap这一次间接。
2. CreateDIBitmap这样的函数,本身开销也很大,毕竟要allocate一大块的内存。
回复人: xuanzg(小钢娃) ( ) 信誉:100 2004-4-7 1:00:17 得分:0
呵呵,学习。请问, ddddh(叶君临) ,你知道如何判断点在边缘上么?-------------------------------------------------------
判断一个点是否边缘,只要判断它的四连通或者八连通有没有区域外的点就可以了。这个和我的问题不是一个概念。呵呵:)
1、FillRgn肯定内部有优化的,至少不会比你写的差。另外自己写还可能碰到很难察觉的笔误等问题2、bitmap不是彩色的,只有黑白两色,这样一个点只占用一个bit,1024*768 = 786432bit,也才96k字节。占的内存根本不多。
-----------------------------------------------您说的也有道理,不过对于黑白两色的图来说,得到一个点的值少不了位操作。可能慢一些。
不过这个速度再慢也慢不到哪里。也是满足我的需求的。如果我没有用 GetRegionData 的话,很可能就会采用您的方案:)
谢谢了,晚上回家结贴