• [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.Geometries
    10 {
    11 
    12     /// <summary>
    13     /// LineString.
    14     /// </summary>
    15     public class LineString
    16     {
    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 Outline
    105         {
    106             get { return m_outline; }
    107             set
    108             {
    109                 m_outline = value;
    110                 if (m_topVertices != null)
    111                 {
    112                     NeedsUpdate = true;
    113                     //UpdateVertices();
    114                 }
    115             }
    116         }
    117 
    118         public Point3d[] Points
    119         {
    120             get
    121             {
    122                 // if the array size is correct just return it
    123                 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             set
    135             {
    136                 m_points = value;
    137                 m_numPoints = m_points.LongLength;
    138                 NeedsUpdate = true;
    139             }
    140         }
    141 
    142         public long NumPoints
    143         {
    144             get { return m_numPoints; }
    145         }
    146 
    147         public double MinimumDisplayAltitude
    148         {
    149             get { return m_minimumDisplayAltitude; }
    150             set { m_minimumDisplayAltitude = value; }
    151         }
    152 
    153         public double MaximumDisplayAltitude
    154         {
    155             get { return m_maximumDisplayAltitude; }
    156             set { m_maximumDisplayAltitude = value; }
    157         }
    158 
    159         public override byte Opacity
    160         {
    161             get
    162             {
    163                 return base.Opacity;
    164             }
    165             set
    166             {
    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 image
    223                 //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                 //else
    240                 //{
    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             try
    278             {
    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             try
    411             {
    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                     else
    430                     {
    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                 else
    454                 {
    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);
            }

     

  • 相关阅读:
    异常练习一 throw
    MAP排序
    Java正则表达式应用详解
    java多线程 sleep()和wait()的区别
    面向对象的15、18位中国大陆身份证号码解析、工具
    java学习笔记--this 关键字的理解
    Java六大问题你都懂了吗?
    Java类的声明和访问介绍
    java的五种数据类型解析
    Java集合框架的总结
  • 原文地址:https://www.cnblogs.com/yhlx125/p/3959849.html
Copyright © 2020-2023  润新知