zoukankan      html  css  js  c++  java
  • 使用DEM生成彩色的立体图像

    在上篇博客中,使用GDAL提供的函数生成彩色渲染图,但是不是立体的。在之前有一篇翻译的博文中可以使用Mapnik进行立体渲染详见“http://blog.csdn.net/liminlu0314/article/details/8550781”。仔细研究了下Mapnik中的渲染方式,发现使用的是一个很著名的开源库——AGG。
    AGG,全名:Anti-Grain Geometry,是一个开源的、高效的2D图形库,它的网站:http://www.antigrain.com/。  AGG是一个用标准的平台无关的C++写成的通用图形工具包。它可以应用在计算机程序中需要高质量的2D图形的许多方面。例如,AGG可以用于渲染2D地图。AGG只使用了C++和标准C的函数,如memcpy,sin,cos,sqrt等。基本的算法甚至没有使用C++ Standard Template Library。因此,AGG能够在大量的应用软件中使用,包括嵌入式系统中。另一方面,AGG允许对库的一部分进行替换,比如在它不能适应性能的要求时。如果需要,你也能够添加其他的颜色空间。因为AGG是基于C++的模板机制的。
    关于AGG的介绍就这么多了,想多了解的可以搜相关的内容,或者参考下面的参考链接。通过查看Mapnik的源代码和AGG的源代码,写了一个简单的使用DEM进行立体渲染的函数。函数的核心如下:

    static void CalcResult(DT_8U *piR, DT_8U *piG, DT_8U *piB, DT_8U *piP, double dOpacity = 0.6)
    {
    	DT_8U sP = *piP;
    	DT_8U sA = 255;
    
    	DT_8U cover = static_cast<DT_8U> (dOpacity * 255 + 0.5);
    
    	if(cover < 255)
    	{
    		sP = (sP * cover + 255) >> 8;
    		sA = (sA * cover + 255) >> 8;
    	}
    
    	//这里千万不能直接代入到下面的公式,否则会出错,DT_8U是无符号整数
    	DT_8U s1a = -sA;
    	sP = sP + s1a;
    	if(sP == 0)	//如果SP为0,将其设置为255
    		sP = 255;
    
    	*piR = (DT_8U)(( *piR*sP ) >> 8);
    	*piG = (DT_8U)(( *piG*sP ) >> 8);
    	*piB = (DT_8U)(( *piB*sP ) >> 8);
    }
    
    上面的函数的前三个参数,就是使用DEM直接进行颜色渲染的RGB值,第四个参数是计算山体阴影的灰度值,第五个参数就是一个透明度的选项。有了上面的函数就可以结合之前的博客中的彩色渲染和山体阴影得到一个具有立体效果的彩色图像。具体效果如下图所示。


    图1 原始DEM数据


    图2 使用颜色表1,透明度为60%


    图3 使用颜色表1,透明度为90%


    图4 使用颜色表2,透明度为60%

    颜色表1

    0 110 220 110
    900 240 250 160
    1300 230 220 170
    1900 220 220 220
    2500 250 250 250
    颜色表2
    100%	255	0	0	255
    45.5%	255	255	0	255
    20.5%	0	255	0	255
    6.7%	0	250	255	255
    3.5%	0	128	255	255
    1.7%	0	64	255	255
    0%	0	10	255	255
    nv	0	0	0	0
    上面的处理效果没有GlobeMapper 的效果好,和Erdas的效果没进行比较过(主要是现在的电脑没装)。希望对大家有用,关于立体渲染,关键就是上面的渲染函数,即dst(RGB) = F(R,G,B ,P)。

    参考资料:
    http://www.antigrain.com/
    http://en.wikipedia.org/wiki/Anti-Grain_Geometry
    http://www.cnblogs.com/Kane_zzt/archive/2008/08/19/1271793.html
    http://blog.csdn.net/liminlu0314/article/details/8688486
    http://blog.csdn.net/liminlu0314/article/details/8550781

  • 相关阅读:
    [华为oj]放苹果
    [华为oj]iNOC产品部-杨辉三角的变形
    值传递和引用传递
    Struts2+Jquery+Json集成
    使用堆栈结构进行字符串表达式("7*2-5*3-3+6/3")的计算
    使用环形链表解决约瑟夫(丢手帕)问题
    tomcat配置数据源
    ORA-01652:无法通过128(在表空间TEMP中)扩展temp段
    (转)Java 代码优化过程的实例介绍
    (转)走进JVM,浅水也能捉鱼
  • 原文地址:https://www.cnblogs.com/xiaowangba/p/6313972.html
Copyright © 2011-2022 走看看