前言
监控系统领域常常碰到压力、水位、温度等各种图形各种显示形式,日常中组态软件这类图形很多都是定制。为了解决复杂的填充问题,计算机图形学上也出现各种填充算法。
本文将讲述另一种简单实现机制过程,基于裁剪区域而填充封闭图形的方法研究。使用这种方式能够灵活地覆盖到绝大数常见的封闭图形;使用这种方式,在绘图软件实现过程中,并没有增加非常多的开发工作。
动画属性定义
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);
}
结语
本文以一种简单的方法实现复杂的填充问题,用此方法实现过程并不会给原有的系统增加非常多的工作。
封闭图形的填充问题研究
最新推荐文章于 2024-05-06 22:23:24 发布