[WorldWind学习]20.修改ShapeFileLayer类及托管D3D文字绘制方法
1.[WorldWind学习]1.接触WorldWind项目2.[WorldWind学习]2.WorldWindow控件3.[WorldWind学习]3.Device对象4.[WorldWind学习]4.DrawArgs对象5.[WorldWind学习]5.相机对象6.[WorldWind学习]6.World类7.[WorldWind学习]7.RenderableObject对象8.[WorldWind学习]8.Cache对象9.[WorldWind学习]9.WW的屏幕坐标到经纬度坐标计算10.[WorldWind学习]10.插件结构11.[WorldWind学习]11.TerrainViewer插件和双线程12.[WorldWind学习]12.WavingFlags和WavingFlagLayer13.[WorldWind学习]13.日志类Log14.[WorldWind学习]14.ConfigurationLoader类15.[WorldWind学习]15.模型加载16.[WorldWind学习]16.Lod技术(1)17.[WorldWind学习]17.视域调度(视域体裁剪)18.[转载]WorldWind实时确定、更新、初始化和渲染地形和纹理数据19.[WorldWind学习]18.High-Performance Timer in C#20.[WorldWind学习]19.WebDownload
21.[WorldWind学习]20.修改ShapeFileLayer类及托管D3D文字绘制方法
22.[World Wind学习]21.影像切割23.[World Wind学习]22.相机高度和瓦片等级计算24.[WorldWind学习]23.TerrainAccessorPluginSDK\ShapeFileLayer.cs Line:1027
char[] fieldDataChars = dbfReader.ReadChars(fieldHeaders[j].FieldLength);
string fieldData = new string( fieldDataChars );
为
byte[] fieldDataChars = dbfReader.ReadBytes(fieldHeaders[j].FieldLength);
string fieldData = System.Text.Encoding.Default.GetString( fieldDataChars );
1 if(m_LabelList.Count > 0) 2 { 3 System.Drawing.Color iconColor = System.Drawing.Color.FromArgb(m_IconOpacity, 255, 255, 255); 4 foreach(Shapefile_Point p in m_LabelList) 5 { 6 Vector3 cartesianPoint = MathEngine.SphericalToCartesian(p.Y, p.X, drawArgs.WorldCamera.WorldRadius + drawArgs.WorldCamera.TerrainElevation); 7 if(!drawArgs.WorldCamera.ViewFrustum.ContainsPoint(cartesianPoint) ||MathEngine.SphericalDistanceDegrees(p.Y, p.X, drawArgs.WorldCamera.Latitude.Degrees, drawArgs.WorldCamera.Longitude.Degrees) > 90.0) 8 continue; 9 Vector3 projectedPoint = drawArgs.WorldCamera.Project(cartesianPoint - referenceCenter); 10 11 m_Sprite.Begin(SpriteFlags.AlphaBlend); 12 if(m_IconTexture != null) 13 { 14 float xscale = (float)m_IconWidth / m_IconTextureDescription.Width; 15 float yscale = (float)m_IconHeight / m_IconTextureDescription.Height; 16 m_Sprite.Transform = Matrix.Scaling(xscale,yscale,0); 17 m_Sprite.Transform *= Matrix.Translation(projectedPoint.X, projectedPoint.Y, 0); 18 m_Sprite.Draw( m_IconTexture, 19 new Vector3( m_IconWidth>>1, m_IconHeight>>1,0), 20 Vector3.Empty, 21 iconColor.ToArgb() ); 22 23 // Reset transform to prepare for text rendering later 24 m_Sprite.Transform = Matrix.Identity; 25 } 26 27 if(m_ShapeTileArgs.ShowLabels && m_ShapeTileArgs.DataKey != null) 28 { 29 // Render label 30 if(p.Tag != null) 31 { 32 // Render name field 33 const int labelWidth = 1000; // Dummy value needed for centering the text 34 if(m_IconTexture==null) 35 { 36 // Center over target as we have no bitmap 37 Rectangle rect = new Rectangle( 38 (int)projectedPoint.X - (labelWidth>>1), 39 (int)(projectedPoint.Y - (drawArgs.defaultDrawingFont.Description.Height >> 1)), 40 labelWidth, 41 drawArgs.screenHeight ); 42 43 drawArgs.defaultDrawingFont.DrawText(m_Sprite, p.Tag.ToString(), rect, DrawTextFormat.Center, m_ShapeTileArgs.LabelColor); 44 } 45 else 46 { 47 // Adjust text to make room for icon 48 int spacing = (int)(m_IconWidth * 0.3f); 49 if(spacing>10) 50 spacing = 10; 51 int offsetForIcon = (m_IconWidth>>1) + spacing; 52 53 Rectangle rect = new Rectangle( 54 (int)projectedPoint.X + offsetForIcon, 55 (int)(projectedPoint.Y - (drawArgs.defaultDrawingFont.Description.Height >> 1)), 56 labelWidth, 57 drawArgs.screenHeight ); 58 59 drawArgs.defaultDrawingFont.DrawText(m_Sprite, p.Tag.ToString(), rect, DrawTextFormat.WordBreak, m_ShapeTileArgs.LabelColor); 60 } 61 } 62 } 63 m_Sprite.End(); 64 } 65 }
有一个文字3D世界坐标点投影到屏幕的过程,在屏幕绘制。
作者:太一吾鱼水
文章未经说明均属原创,学习笔记可能有大段的引用,一般会注明参考文献。
欢迎大家留言交流,转载请注明出处。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!