经纬度格网类LatLongGrid继承自可渲染对象类RenderableObject,是WorldWind中用来在星球外表绘制经纬度格网的封装类。其类图如下所示。

绘制经纬网格的主体函数为Render(),其内部主要调用以下函数完成绘制:

ComputeGridValues()//计算格网值

RenderTropicLine()//绘制回归线

计算格网值ComputeGridValues()内部通过相机的真实视场角drawArgs.WorldCamera.TrueViewRange.Radians来指定经纬网格的纬度分割间隔为1、2、5、10四类,然后指定经度分割间隔等于纬度间隔。接下来,判断当前相机的视景体是否包含南北极点,如果包含,则将指定经度分割间隔等于10度,从而使极点部分的经纬网格分割间隔比较大,而不用绘制的非常密集。接着,计算相机可视场景的最大/小可见经度值,最大/小可见纬度值,均取整型。且当经度分割间隔等于10度时,最小可见经度等于-180度,最大可见经度等于180度。接着,计算沿经度方向分割时每一行分割点数,沿纬度方向分割时每一列分割点数,均比分割出来的单元格行数、列数大1,这和我先前一篇博客文章《基于DirectX的半球形天空类的C++和C#实现》中的做法是一样的,这样做都是为了使球体首尾互相衔接。然后求出经度点数(行向)和纬度点数(列向)之间的较大值,然后利用该值来申请星球体划分时所需要的存储的三维坐标点空间:

if (lineVertices == null || vertexPointCount > lineVertices.Length)

  lineVertices = new CustomVertex.PositionColored[Math.Max(LatitudePointCount, LongitudePointCount)];

接着,设置星球的经纬网格所在的球体半径为为构造该类对象时传入的星球对象World所携带的半径值。 接下来要判断当前相机的高度是否小于0.1*WorldRadius;如果是则不开启Zbuffer深度测试。如果否则开启Zbuffer深度测试,且设置1.01* WorldRadius和(WorldRadius + 0.015f * drawArgs.WorldCamera.Altitude)两个值之间的较大者,最终为星球的经纬网格所在的球体半径。

接下来,就按照DirectX 3D的固定图形渲染管线设置是否开启Zbuffer深度测试、设置纹理阶段颜色操作ColorOperation、设置顶点格式VertexFormat、设置世界变换矩阵drawArgs.device.Transform.World、设置关闭渲染状态光照效果drawArgs.device.RenderState.Lighting。经纬网格每一个交点都是通过将格网点的球面坐标转换为笛卡尔控件直角坐标得到的,通过下面的公式将网格定点的球面坐标转换为空间直角坐标来获得逼近的半球面格网剖分模型。

其中,其中B和L分别为球体的经度和纬度,取值范围为:-PI/2≤B≤PI/2,-PI≤L≤PI,R为设定的球体半径。可以使用、、、坐标来生成所需要的球面格网。根据不同的精度要求,可对纬向和经向剖分间隔设置不同的值。

纹理坐标可以首先根据纬向和经向剖分间隔分别计算出纬向和经向剖分网格点数,然后根据当前球面坐标计算出格网点所在的纬向和经向网格行列号,最后根据下面公式计算出云彩贴图的纹理坐标。其中,先将当前行号和列号强制取浮点型是为了保证除法运算按浮点型运算,使最终结果落在[0.0,1.0]之间。详细代码请参照我先前的一篇博客文章《基于DirectX的半球形天空类的C++和C#实现》。

最后,通过两个双重循环依次绘制经度格网线、经度值标签、纬度格网线、纬度值标签。绘制经纬格网时指定的图元类型为线条带PrimitiveType.LineStrip,分别是沿经线方向和纬线方向绘制。详细实现代码请参见PluginSDK工程下面的LatLongGrid.cs文件。

注意:(1)经度是由经度线和经度标签构成。(2)纬度是由纬度线和纬度标签构成。

WorldWind源码剖析系列:经纬度格网类LatLongGrid的更多相关文章

  1. WorldWind源码剖析系列:表面影像类SurfaceImage

    表面影像类SurfaceImage描述星球类(如地球)表面纹理影像.该类的类图如下. 表面影像类SurfaceImage包含的主要的字段.属性和方法如下: string m_ImageFilePath ...

  2. WorldWind源码剖析系列:影像图层类ImageLayer

    影像图层类ImageLayer 影像图层类ImageLayer将单张影像作为纹理映射到星球表面上去.源影像必须是平面笛卡尔坐标系.该类的类图如下. 影像图层类ImageLayer提供的主要字段.属性和 ...

  3. WorldWind源码剖析系列:影像存储类ImageStore、Nlt影像存储类NltImageStore和WMS影像存储类WmsImageStore

    影像存储类ImageStore 影像存储类ImageStore提供了计算本地影像路径和远程影像影像URL访问的各种接口,是WmsImageStore类和NltImageStore类的基类.当划分完层次 ...

  4. WorldWind源码剖析系列:数学引擎类MathEngine

    PluginSDK中的MathEngine类是密封类.不可继承,主要完成通用的数学计算功能.由于按平面展开层层划分,所以在WW里用到一个row,col的概念,类MathEngine封装了从行/列到经/ ...

  5. WorldWind源码剖析系列:表面瓦片类SurfaceTile

    表面瓦片类SurfaceTile描述星球类(如地球)表面纹理影像的瓦片模型.其类图如下. 表面瓦片类SurfaceTile包含的主要的字段.属性和方法如下: int m_Level;//该瓦片所属金字 ...

  6. WorldWind源码剖析系列:四叉树瓦片类QuadTile

    四叉树瓦片类QuadTile提供了对影像和地形数据的四叉树访问模型.该类的类图如下. 四叉树瓦片类QuadTile提供的主要字段.属性和方法简要描述如下: public QuadTileSet Qua ...

  7. WorldWind源码剖析系列:下载请求类DownloadRequest

    下载请求类DownloadRequest是各种下载请求的抽象基类,先派生出网络下载请求类WebDownloadRequest,再派生出地理空间下载请求类GeoSpatialDownloadReques ...

  8. WorldWind源码剖析系列:绘制参数类DrawArgs

    绘制参数类DrawArgs主要对绘制时需要的对象如:设备对象Microsoft.DirectX.Direct3D.Device.Microsoft.DirectX.Direct3D.Font字体对象. ...

  9. WorldWind源码剖析系列:代理助手类ProxyHelper

    代理助手类ProxyHelper通过平台调用的互操作技术封送了若干Win32结构体和函数.该类类图如下. 提供的主要处理方法基本上都是静态函数,简要描述如下: 内嵌类型WINHTTP_AUTOPROX ...

  10. WorldWind源码剖析系列:网络下载类WebDownload

    网络下载类WebDownload封装了对请求的瓦片进行网络下载的相关操作.该类使用了两个委托类型和一个枚举类型. 该类的类图如下. 网络下载类WebDownload各个字段和属性的含义说明如下: st ...

随机推荐

  1. mongdb基本操作和更新操作

    1.创建数据库 use hqj 不会真正的创建db,只有insert之后才会创建2.查看数据库show dbs3.插入文档db.hqj.insert({name:'111'})4.查看所有的文档sho ...

  2. Hadoop Mapreduce 参数 (一)

    参考 hadoop权威指南 第六章,6.4节 背景 hadoop,mapreduce就如MVC,spring一样现在已经是烂大街了,虽然用过,但是说看过源码么,没有,调过参数么?调过,调到刚好能跑起来 ...

  3. Entity FrameWork(实体框架)是以ADO.NET Entity FrameWork ,简称为EF

    Entity FrameWork(实体框架)是以ADO.NET Entity FrameWork ,简称为EF Entity FrameWork的特点 1.支持多种数据库(MSSQL.Oracle.M ...

  4. centos7 mysql8.0 RPM软件包方式安装

    1下载安装包:https://dev.mysql.com/downloads/mysql/8.0.html 2.解压安装包后可以看下如下文件列表 3.在当前目录打开终端 查看并卸载 mariadbrp ...

  5. [性能调优]在PeopleSoft中使用函数索引

    那些没有在PeopleSoft系统遇到性能问题的人,特别是基于Oracle数据库的PeopleSoft,可能不知道基于函数的索引. 根据定义,基于函数的索引是使用如下方法定义的: 基于表达式,例如算术 ...

  6. IIS8发布Asp.net MVC程序后出现404错误,处理程序staticFile

    新部署的虚拟机,运行Asp.net MVC程序,出现如下图错误: 解决方法: 添加功能和角色->添加角色->Web服务器IIS->应用程序开发->Asp.net3.5 /Asp ...

  7. Python+Selenium笔记(二):配置谷歌+IE环境

    #有的时候可能要访问外国的网站下载资料或工具,这时可能出现各种问题,例如谷歌人机验证显示不了.网站打不开等,建议使用一个FQ软件 (一)  设置IE (1)   http://docs.seleniu ...

  8. 白盒测试实践-DAY1

    时间:2017.12.11 地点:软件学院 成员:张玉.周静.张双双 会议内容:讨论题目要求,分配任务 针对第一阶段的任务进行部署,共同学习白盒测试方法,根据自己选择的系统--餐厅网站,针对其中的管理 ...

  9. .NET(C#)如何遍历Dictionary

    我们知道.NET中的Dictionary是键/值对的集合,使用起来也是比较方便,Dictionary也可以用KeyValuePair来迭代遍历,具体如下: using System; using Sy ...

  10. APP性能测试指标和测试方法

    流量 常用方法 方法一:Android系统自带统计功能(总体流量数值) Proc/uid_stat/{UID}/tcp_snd和tcp_rcv UID是每个app安装时候分配的唯一编号用于识别该app ...