封闭图形的填充问题研究

前言
       监控系统领域常常碰到压力、水位、温度等各种图形各种显示形式,日常中组态软件这类图形很多都是定制。为了解决复杂的填充问题,计算机图形学上也出现各种填充算法。
       本文将讲述另一种简单实现机制过程,基于裁剪区域而填充封闭图形的方法研究。使用这种方式能够灵活地覆盖到绝大数常见的封闭图形;使用这种方式,在绘图软件实现过程中,并没有增加非常多的开发工作。

动画属性定义
       1)、最小值,最大值
       定义封闭图形的最小值和最大值。
       2)、填充颜色
       根据实际的业务需求,我们可以分3种情况:
   单色
   两点渐变
   三点渐变
       3)、方向
      每种不同的测量设备或仪表,测量的模拟量有多种,如压力、温度、水位、浓度等。我们可以定义如下四种方向:
   从下到上
   从上到下
   从左到右
   从右到左

普通多边形填充图
      
                                                                 图1 裁剪区的划分
       我们要实现上述图形的填充风格,首先确定填充的颜色和方向,然后根据最小值和最大值确定填充所占用的宽度比例:
       S = (nCurrentValue – nMinValue) / (nMaxValue – nMinValue)
       注:其中nMaxValue > nMinValue>=0,否则图形填充无意义。

       偏移量的计算如下:
       1)、如果S <= 0.0f,则无效不填充;
       2)、如果S>0.0f,并且S<=1.0f则填充;
                nOffset = 图形轮廓的宽度 * S。
       3)、如果S>1.0f则S=1.0f填充;
                nOffset = 图形轮廓的宽度。

分阶段填充图
       
                                                                   图2 特殊填充分级划分
        图形组态时可以把这种图形填充分为三个区域处理,确定每个区域的最小和最大值,每个区域是单色、双色或三色显示方式。因此,三个区域其实就是三个离散的图形,只不过它们都跟同一个测量值绑定关系。由上面普通封闭图形的填充,可以推广到特殊图形填充。也说明特殊可以转变成简单的过程。所以,我们依据上述的公式即可绘制这种填充图形。

裁剪的区域简单伪代码
       void drawClipShape(CDC* pDC, const CRgn& rgn1, const CRgn& rgn2)
       {
              int nSavedDC = pDC->SaveDC();
    
               // 第1个裁剪区绘制图形
              pDC->SelectObject(&m_brush1);
              pDC->SelectClipRgn(&rgn1, RGN_DIFF);
              drawObject(pDC); // 绘制封闭对象图形
              pDC->SelectClipRgn(NULL);

              // 第2个裁剪区绘制图形
              pDC->SelectClipRgn(&rgn2, RGN_DIFF);
              pDC->SelectObject(&m_brush2);
              drawObject(pDC); // 绘制封闭对象图形
              pDC->SelectClipRgn(NULL);

              pDC->RestoreDC(nSavedDC);
       }
结语
       本文以一种简单的方法实现复杂的填充问题,用此方法实现过程并不会给原有的系统增加非常多的工作。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值