Hi!    遇到一个问题,我希望能快速判断一些点是否在某个区域内,但是对于1024x768这样多的点来说,调用这么多次 PtInRegion 函数,成本太高,我承担不起。    我的做法是,创建一个蒙版,跟图像一样大,BYTE[Y][X],如果某个点(x,y)有BYTE[y][x] == 1,则这个点在区域内。    可是我还是得调用 PtInRegion 来创建这么一个蒙版,在创建的时候,速度很慢。Debug模式下测试,对于 1024x768 左右的区域,差不多要 2秒 的时间。太慢了!
    我的问题:
        有没有什么好的办法,能够快速的创建我的“蒙版”?
        或者更好的主意也成。
非常感谢您的帮助!

解决方案 »

  1.   

    我的做法:<从袁峰袁大侠书上看到的>使用 GetRegionData函数:)
        其实我也猜到用这个函数,只是这个函数msdn上语焉不详,大侠的书上讲的很详细.
      

  2.   

    呵呵,学习。请问, ddddh(叶君临) ,你知道如何判断点在边缘上么?
      

  3.   

    呵呵 学习
    请问 ddddh(叶君临) 兄,你知道如何判断,点是否在边界上么?
      

  4.   

    如果你说的详细一些,再举一个小例子,让大家都学习一下,我会把分数都加到你自己的专家分里去的,再给你加入精华和FAQ,你赚死了,呵呵
      

  5.   

    我靠,这么多人都没睡觉。
    呵呵,我道不孤啊:)楼上的,我倒不是很在乎专家分(我的可用分够我用的了)也不是不想写详细一点,只是写详细的话,难免会引用到Feng Yuan的那本书上去。
    主要就是 GetRegionData 把 区域 变成一个个的RECT的累加了。通过这个函数可以得到这些个RECTs的指针。我觉得点到为止比较好,再往下说就没意思了:)
      

  6.   

    搂主,你说的那个函数比PTINREGIN
    的速度快多少?原理有什么差别!?谢谢
    !
      

  7.   

    我有个方法没有试弄一个memory dc,然后将一个黑白的dib bitmap select进去,将整个dc填 充成白色的,使用这个region进行FillRgn,将这个region填充成黑色的。之后你可以GetDIBData来获得你在第一篇里面提到的蒙版,这个应该更好
      

  8.   

    回复人: puhuofeie(扑火飞蛾) ( ) 信誉:100  2004-04-07 07:56:00  得分:0 
     
     
      搂主,你说的那个函数比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(叶君临) ,你知道如何判断点在边缘上么?-------------------------------------------------------
    判断一个点是否边缘,只要判断它的四连通或者八连通有没有区域外的点就可以了。这个和我的问题不是一个概念。呵呵:)
      

  9.   

    1、FillRgn肯定内部有优化的,至少不会比你写的差。另外自己写还可能碰到很难察觉的笔误等问题2、bitmap不是彩色的,只有黑白两色,这样一个点只占用一个bit,1024*768 = 786432bit,也才96k字节。占的内存根本不多。
      

  10.   

    回复人: xstring(麻雀) ( ) 信誉:134  2004-04-07 13:07:00  得分:0 
     
     
      1、FillRgn肯定内部有优化的,至少不会比你写的差。另外自己写还可能碰到很难察觉的笔误等问题2、bitmap不是彩色的,只有黑白两色,这样一个点只占用一个bit,1024*768 = 786432bit,也才96k字节。占的内存根本不多。
    -----------------------------------------------您说的也有道理,不过对于黑白两色的图来说,得到一个点的值少不了位操作。可能慢一些。
    不过这个速度再慢也慢不到哪里。也是满足我的需求的。如果我没有用 GetRegionData 的话,很可能就会采用您的方案:)
     谢谢了,晚上回家结贴