首页 > 代码库 > [3D]绘制线

[3D]绘制线

数据实体:

 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Drawing; 6 using SlimDX; 7 using RGeos.SlimScene.Core; 8  9 namespace RGeos.Framework.OTL.Geometries10 {11 12     /// <summary>13     /// LineString.14     /// </summary>15     public class LineString16     {17         public Point3d[] Coordinates = null;18         public Color Color = Color.Yellow;19         public float LineWidth = 1.0f;20         public bool Visible = true;21         public bool Remove = false;22         public RenderableObject ParentRenderable = null;23 24         public BoundingBox GetBoundingBox()25         {26             if (Coordinates == null || Coordinates.Length == 0)27                 return new BoundingBox();28 29             double minX = Coordinates[0].X;30             double maxX = Coordinates[0].X;31             double minY = Coordinates[0].Y;32             double maxY = Coordinates[0].Y;33             double minZ = Coordinates[0].Z;34             double maxZ = Coordinates[0].Z;35 36             for (int i = 1; i < Coordinates.Length; i++)37             {38                 if (Coordinates[i].X < minX)39                     minX = Coordinates[i].X;40                 if (Coordinates[i].X > maxX)41                     maxX = Coordinates[i].X;42 43                 if (Coordinates[i].Y < minY)44                     minY = Coordinates[i].Y;45                 if (Coordinates[i].Y > maxY)46                     maxY = Coordinates[i].Y;47 48                 if (Coordinates[i].Z < minZ)49                     minZ = Coordinates[i].Z;50                 if (Coordinates[i].Z > maxZ)51                     maxZ = Coordinates[i].Z;52             }53 54             return new BoundingBox(new Vector3(55                 (float)maxY, (float)minY, (float)minX), new Vector3((float)maxX, (float)minZ, (float)maxZ));56         }57     }58 59 60 }
LineString

渲染对象

  1 using System;  2 using System.Collections.Generic;  3 using System.Linq;  4 using System.Text;  5 using RGeos.SlimScene.Core;  6 using SlimDX.Direct3D9;  7 using SlimDX;  8   9 namespace RGeos.Framework.OTL.Geometries 10 { 11     public class RenderableLineString : RenderableObject 12     { 13         #region Static Members 14         #endregion 15  16         #region Private Members 17         double m_distanceAboveSurface = 0; 18         Point3d[] m_points = null; 19         CustomVertex.PositionColoredTextured[] m_wallVertices = null; 20  21         CustomVertex.PositionColored[] m_topVertices = null; 22         CustomVertex.PositionColored[] m_bottomVertices = null; 23         CustomVertex.PositionColored[] m_sideVertices = null; 24  25         System.Drawing.Color m_lineColor = System.Drawing.Color.Black; 26         float m_verticalExaggeration = 1; 27         double m_minimumDisplayAltitude = 0; 28         double m_maximumDisplayAltitude = double.MaxValue; 29         string m_imageUri = null; 30         Texture m_texture = null; 31         System.Drawing.Color m_polygonColor = System.Drawing.Color.Black; 32         bool m_outline = true; 33         float m_lineWidth = 1.0f; 34         bool m_extrude = false; 35         AltitudeMode m_altitudeMode = AltitudeMode.Absolute; 36         long m_numPoints = 0; 37         #endregion 38  39         /// <summary> 40         /// Boolean indicating whether or not the line needs rebuilding. 41         /// </summary> 42         public bool NeedsUpdate = true; 43  44         public bool Extrude 45         { 46             get { return m_extrude; } 47             set { m_extrude = value; } 48         } 49  50         public AltitudeMode AltitudeMode 51         { 52             get { return m_altitudeMode; } 53             set { m_altitudeMode = value; } 54         } 55  56         public System.Drawing.Color LineColor 57         { 58             get { return m_lineColor; } 59             set 60             { 61                 m_lineColor = value; 62                 NeedsUpdate = true; 63             } 64         } 65  66         public float LineWidth 67         { 68             get { return m_lineWidth; } 69             set 70             { 71                 m_lineWidth = value; 72                 NeedsUpdate = true; 73             } 74         } 75  76         public double DistanceAboveSurface 77         { 78             get { return m_distanceAboveSurface; } 79             set 80             { 81                 m_distanceAboveSurface = value; 82                 if (m_topVertices != null) 83                 { 84                     NeedsUpdate = true; 85                     //UpdateVertices(); 86                 } 87             } 88         } 89  90         public System.Drawing.Color PolygonColor 91         { 92             get { return m_polygonColor; } 93             set 94             { 95                 m_polygonColor = value; 96                 if (m_topVertices != null) 97                 { 98                     NeedsUpdate = true; 99                     //UpdateVertices();100                 }101             }102         }103 104         public bool Outline105         {106             get { return m_outline; }107             set108             {109                 m_outline = value;110                 if (m_topVertices != null)111                 {112                     NeedsUpdate = true;113                     //UpdateVertices();114                 }115             }116         }117 118         public Point3d[] Points119         {120             get121             {122                 // if the array size is correct just return it123                 if (m_numPoints == m_points.LongLength)124                     return m_points;125 126                 // return an array the correct size.127                 Point3d[] points = new Point3d[m_numPoints];128                 for (int i = 0; i < m_numPoints; i++)129                 {130                     points[i] = m_points[i];131                 }132                 return points;133             }134             set135             {136                 m_points = value;137                 m_numPoints = m_points.LongLength;138                 NeedsUpdate = true;139             }140         }141 142         public long NumPoints143         {144             get { return m_numPoints; }145         }146 147         public double MinimumDisplayAltitude148         {149             get { return m_minimumDisplayAltitude; }150             set { m_minimumDisplayAltitude = value; }151         }152 153         public double MaximumDisplayAltitude154         {155             get { return m_maximumDisplayAltitude; }156             set { m_maximumDisplayAltitude = value; }157         }158 159         public override byte Opacity160         {161             get162             {163                 return base.Opacity;164             }165             set166             {167                 base.Opacity = value;168                 if (m_topVertices != null)169                 {170                     UpdateVertices();171                 }172             }173         }174 175         public RenderableLineString(string name, World parentWorld, Point3d[] points, System.Drawing.Color lineColor)176             : base(name, parentWorld)177         {178             m_points = points;179             m_lineColor = lineColor;180             m_polygonColor = lineColor;181             m_numPoints = m_points.LongLength;182 183             // RenderPriority = WorldWind.Renderable.RenderPriority.LinePaths;184         }185 186         public RenderableLineString(string name, World parentWorld, Point3d[] points, string imageUri)187             : base(name, parentWorld)188         {189             m_points = points;190             m_imageUri = imageUri;191             m_numPoints = m_points.LongLength;192 193             // RenderPriority = WorldWind.Renderable.RenderPriority.LinePaths;194         }195 196         public override void Dispose()197         {198             if (m_texture != null && !m_texture.Disposed)199             {200                 m_texture.Dispose();201                 m_texture = null;202             }203 204             if (m_lineString != null)205             {206                 m_lineString.Remove = true;207                 m_lineString = null;208             }209             NeedsUpdate = true;210         }211 212         public override void Initialize(DrawArgs drawArgs)213         {214             if (m_points == null)215             {216                 isInitialized = true;217                 return;218             }219 220             if (m_imageUri != null)221             {222                 //load image223                 //if (m_imageUri.ToLower().StartsWith("http://"))224                 //{225                 //    string savePath = string.Format("{0}\\image", ConfigurationLoader.GetRenderablePathString(this));226                 //    System.IO.FileInfo file = new System.IO.FileInfo(savePath);227                 //    if (!file.Exists)228                 //    {229                 //        WorldWind.Net.WebDownload download = new WorldWind.Net.WebDownload(m_imageUri);230 231                 //        if (!file.Directory.Exists)232                 //            file.Directory.Create();233 234                 //        download.DownloadFile(file.FullName, WorldWind.Net.DownloadType.Unspecified);235                 //    }236 237                 //    m_texture = ImageHelper.LoadTexture(file.FullName);238                 //}239                 //else240                 //{241                 //    m_texture = ImageHelper.LoadTexture(m_imageUri);242                 //}243             }244 245             UpdateVertices();246 247             isInitialized = true;248         }249 250         /// <summary>251         /// Adds a point to the line at the end of the line.252         /// </summary>253         /// <param name="point">The Point3d object to add.</param>254         public void AddPoint(Point3d point)255         {256             // if the array is too small grow it.257             if (m_numPoints >= m_points.LongLength)258             {259                 long growSize = m_points.LongLength / 2;260                 if (growSize < 10) growSize = 10;261 262                 Point3d[] points = new Point3d[m_points.LongLength + growSize];263 264                 for (int i = 0; i < m_numPoints; i++)265                 {266                     points[i] = m_points[i];267                 }268                 m_points = points;269             }270             m_points[m_numPoints] = point;271             m_numPoints++;272             NeedsUpdate = true;273         }274 275         private void UpdateVertices()276         {277             try278             {279                 // m_verticalExaggeration = World.Settings.VerticalExaggeration;280 281                 UpdateTexturedVertices();282 283                 if (m_lineString != null && m_outline && m_wallVertices != null && m_wallVertices.Length > m_topVertices.Length)284                 {285                     UpdateOutlineVertices();286                 }287 288                 NeedsUpdate = false;289             }290             catch (Exception ex)291             {292                 Utility.Log.Write(ex);293             }294         }295 296         private void UpdateOutlineVertices()297         {298             m_bottomVertices = new CustomVertex.PositionColored[m_numPoints];299             m_sideVertices = new CustomVertex.PositionColored[m_numPoints * 2];300 301             for (int i = 0; i < m_numPoints; i++)302             {303                 m_sideVertices[2 * i] = m_topVertices[i];304 305                 Vector3 xyzVertex = new Vector3(306                     m_wallVertices[2 * i + 1].Position.X,307                     m_wallVertices[2 * i + 1].Position.Y,308                     m_wallVertices[2 * i + 1].Position.Z);309 310                 m_bottomVertices[i].Position.X = xyzVertex.X;311                 m_bottomVertices[i].Position.Y = xyzVertex.Y;312                 m_bottomVertices[i].Position.Z = xyzVertex.Z;313                 m_bottomVertices[i].Color = m_lineColor.ToArgb();314 315                 m_sideVertices[2 * i + 1] = m_bottomVertices[i];316             }317         }318 319         LineString m_lineString = null;320         private void UpdateTexturedVertices()321         {322             if (m_altitudeMode == AltitudeMode.ClampedToGround)323             {324                 if (m_lineString != null)325                 {326                     m_lineString.Remove = true;327                     m_lineString = null;328                 }329 330                 m_lineString = new LineString();331                 m_lineString.Coordinates = Points;332                 m_lineString.Color = LineColor;333                 m_lineString.LineWidth = LineWidth;334                 m_lineString.ParentRenderable = this;335                 // this.World.ProjectedVectorRenderer.Add(m_lineString);336 337                 if (m_wallVertices != null)338                     m_wallVertices = null;339 340                 return;341             }342 343             if (m_extrude || m_altitudeMode == AltitudeMode.RelativeToGround)344             {345                 m_wallVertices = new CustomVertex.PositionColoredTextured[m_numPoints * 2];346             }347 348             float textureCoordIncrement = 1.0f / (float)(m_numPoints - 1);349             // m_verticalExaggeration = World.Settings.VerticalExaggeration;350             int vertexColor = m_polygonColor.ToArgb();351 352             m_topVertices = new CustomVertex.PositionColored[m_numPoints];353 354             for (int i = 0; i < m_numPoints; i++)355             {356                 double terrainHeight = 0;357 358 359                 Vector3 xyzVertex = new Vector3((float)m_points[i].X, (float)m_points[i].Y, (float)m_points[i].Z);360 361                 m_topVertices[i].Position.X = xyzVertex.X;362                 m_topVertices[i].Position.Y = xyzVertex.Y;363                 m_topVertices[i].Position.Z = xyzVertex.Z;364                 m_topVertices[i].Color = m_lineColor.ToArgb();365 366                 if (m_extrude || m_altitudeMode == AltitudeMode.RelativeToGround)367                 {368                     m_wallVertices[2 * i].Position.X = xyzVertex.X;369                     m_wallVertices[2 * i].Position.Y = xyzVertex.Y;370                     m_wallVertices[2 * i].Position.Z = xyzVertex.Z;371                     m_wallVertices[2 * i].Color = vertexColor;372                     m_wallVertices[2 * i].Tu = i * textureCoordIncrement;373                     m_wallVertices[2 * i].Tv = 1.0f;374 375                     m_wallVertices[2 * i + 1].Position.X = xyzVertex.X;376                     m_wallVertices[2 * i + 1].Position.Y = xyzVertex.Y;377                     m_wallVertices[2 * i + 1].Position.Z = xyzVertex.Z;378                     m_wallVertices[2 * i + 1].Color = vertexColor;379                     m_wallVertices[2 * i + 1].Tu = i * textureCoordIncrement;380                     m_wallVertices[2 * i + 1].Tv = 0.0f;381                 }382             }383         }384 385         public override bool PerformSelectionAction(DrawArgs drawArgs)386         {387             return false;388         }389 390         public override void Update(DrawArgs drawArgs)391         {392             if (drawArgs.WorldCamera.Distance >= m_minimumDisplayAltitude && drawArgs.WorldCamera.Distance <= m_maximumDisplayAltitude)393             {394                 if (!isInitialized)395                     Initialize(drawArgs);396 397                 if (NeedsUpdate)398                     UpdateVertices();399             }400 401         }402 403         public override void Render(DrawArgs drawArgs)404         {405             if (!isInitialized || drawArgs.WorldCamera.Distance < m_minimumDisplayAltitude || drawArgs.WorldCamera.Distance > m_maximumDisplayAltitude)406             {407                 return;408             }409 410             try411             {412                 if (m_lineString != null)413                     return;414 415                 int currentCull = drawArgs.Device.GetRenderState(RenderState.CullMode);416                 drawArgs.Device.SetRenderState(RenderState.CullMode, Cull.None);417 418                 if (m_wallVertices != null)419                 {420                     drawArgs.Device.SetRenderState(RenderState.ZEnable, true);421 422                     if (m_texture != null && !m_texture.Disposed)423                     {424                         drawArgs.Device.SetTexture(0, m_texture);425                         drawArgs.Device.SetTextureStageState(0, TextureStage.AlphaOperation, TextureOperation.Modulate);426                         drawArgs.Device.SetTextureStageState(0, TextureStage.ColorOperation, TextureOperation.Add);427                         drawArgs.Device.SetTextureStageState(0, TextureStage.AlphaArg1, TextureArgument.Texture);428                     }429                     else430                     {431                         drawArgs.Device.SetTextureStageState(0, TextureStage.ColorOperation, TextureOperation.Disable);432                     }433 434                     drawArgs.Device.VertexFormat = CustomVertex.PositionColoredTextured.Format;435 436                     drawArgs.Device.DrawUserPrimitives(PrimitiveType.TriangleStrip, m_wallVertices.Length - 2, m_wallVertices);437 438                     if (m_outline)439                     {440 441                         drawArgs.Device.SetTextureStageState(0, TextureStage.ColorOperation, TextureOperation.Disable);442                         drawArgs.Device.VertexFormat = CustomVertex.PositionColored.Format;443                         drawArgs.Device.DrawUserPrimitives(PrimitiveType.LineStrip, m_topVertices.Length - 1, m_topVertices);444 445                         if (m_bottomVertices != null)446                             drawArgs.Device.DrawUserPrimitives(PrimitiveType.LineStrip, m_bottomVertices.Length - 1, m_bottomVertices);447 448                         if (m_sideVertices != null)449                             drawArgs.Device.DrawUserPrimitives(PrimitiveType.LineList, m_sideVertices.Length / 2, m_sideVertices);450 451                     }452                 }453                 else454                 {455                     drawArgs.Device.SetTextureStageState(0, TextureStage.ColorOperation, TextureOperation.Disable);456                     drawArgs.Device.VertexFormat = CustomVertex.PositionColored.Format;457                     drawArgs.Device.DrawUserPrimitives(PrimitiveType.LineStrip, m_topVertices.Length - 1, m_topVertices);458                 }459 460                 drawArgs.Device.SetTransform(TransformState.World, drawArgs.WorldCamera.WorldMatrix);461                 drawArgs.Device.SetRenderState(RenderState.CullMode, currentCull);462             }463             catch//(Exception ex)464             {465                 //Utility.Log.Write(ex);466             }467         }468     }469 }
RenderableLineString

使用方法:

 private void tspPolyline_Click(object sender, EventArgs e)        {            Point3d[] pts=new Point3d[5];            Point3d pt1=new Point3d(0,0,0);            Point3d pt2=new Point3d(0,10,8);            Point3d pt3=new Point3d(0,20,5);            Point3d pt4=new Point3d(0,30,4);            Point3d pt5=new Point3d(0,40,2);            pts[0]=pt1;            pts[1]=pt2;            pts[2]=pt3;            pts[3]=pt4;            pts[4]=pt5;            RenderableLineString rend = new RenderableLineString("Hello", null, pts, Color.White);            rend.IsOn = true;            rend.RenderPriority = RenderPriority.Custom;            mSceneControl.CurrentWorld.RenderableObjects.ChildObjects.Add(rend);        }

 

[3D]绘制线