DrawCylinderClass.cs
上传用户:lslight
上传日期:2022-01-10
资源大小:14248k
文件大小:10k
源码类别:

DirextX编程

开发平台:

C#

  1. ///////////////////////////////////////////////////////////////////////
  2. //      ■■■■     ■■■■■       ■■■■       ■       ■      //
  3. //    ■                 ■         ■               ■       ■      //
  4. //    ■                 ■         ■    ■■■     ■       ■      //
  5. //    ■                 ■         ■       ■      ■       ■      //
  6. //      ■■■■         ■           ■■■■         ■■■■       //
  7. // Copyright (c) 三峡大学水利与环境学院 肖泽云. All rights reserved.  //
  8. ////////////////////////////////////////////////////////////////////////
  9. using System;
  10. using System.Collections.Generic;
  11. using System.Text;
  12. using System.Drawing;
  13. using Microsoft.DirectX;
  14. using Microsoft.DirectX.Direct3D;
  15. namespace 绘制基本几何体
  16. {
  17.     class DrawCylinderClass
  18.     {
  19.          /// <summary>
  20.         /// <param name="device">device:设备对象</param>
  21.         /// </summary>
  22.         public Device device;//定义设备
  23.         /// <summary>
  24.         /// <param name="topCircleCenterVector">topCircleCenterVector:圆柱顶部圆心坐标</param>
  25.         /// </summary>
  26.         public Vector3 topCircleCenterVector;//定义圆柱顶部圆心坐标
  27.         /// <summary>
  28.         /// <param name="underCircleCenterVector">underCircleCenterVector:圆柱底部圆心坐标</param>
  29.         /// </summary>
  30.         public Vector3 underCircleCenterVector;//定义圆柱底部圆心坐标
  31.         ///<summary>
  32.         ///<param name="radius">radius:圆柱半径</param>
  33.         ///</summary>        
  34.         public float radius;//定义圆柱半径
  35.         /// <summary>
  36.         /// <param name="mNumber">mNumber:沿切向的分块数目</param>
  37.         /// </summary>
  38.         public int mNumber;//定义沿切向的分块数目
  39.         /// <summary>
  40.         /// <param name="nNumber">nNumber:沿径向的分块数目</param>
  41.         /// </summary>
  42.         public int nNumber;//定义沿径向的分块数目
  43.         /// <summary>
  44.         /// <param name="hNumber">hNumber:沿高度方向的分块数目</param>
  45.         /// </summary>
  46.         public int hNumber;//定义沿高度方向的分块数目
  47.         private CustomVertex.PositionColored[] vertices;//定义圆柱网格顶点
  48.         private int[] indexData;//定义圆柱网格中三角形索引
  49.         /// <summary>
  50.         /// 定义一个绘制圆柱对象
  51.         /// </summary>
  52.         /// <param name="_device">设备对象</param>
  53.         /// <param name="_topCircleCenterVector">圆柱顶部圆心坐标</param>
  54.         /// <param name="_underCircleCenterVector">圆柱底部圆心坐标</param>
  55.         /// <param name="_radius">圆半径</param>
  56.         /// <param name="_mNumber">沿切向的分块数目</param>
  57.         /// <param name="_nNumber">沿径向的分块数目</param>
  58.         /// <param name="_hNumber">沿高度方向的分块数目</param>
  59.         public DrawCylinderClass(Device _device, Vector3 _topCircleCenterVector, Vector3 _underCircleCenterVector, float _radius, int _mNumber, int _nNumber, int _hNumber)
  60.         {
  61.             device = _device;
  62.             topCircleCenterVector = _topCircleCenterVector;
  63.             underCircleCenterVector = _underCircleCenterVector;
  64.             radius = _radius;
  65.             mNumber = _mNumber;
  66.             nNumber = _nNumber;
  67.             hNumber = _hNumber;
  68.             VertexDeclaration();//定义顶点
  69.             IndicesDeclaration();//定义索引
  70.         }
  71.         private void VertexDeclaration()//定义顶点
  72.         {
  73.             Vector3 circleNormalVectors = Vector3.Subtract(topCircleCenterVector,underCircleCenterVector);
  74.             vertices = new CustomVertex.PositionColored[2 * (mNumber + 1) * (nNumber + 1) + (mNumber + 1) * (hNumber+1)];
  75.             float cosAlpha = circleNormalVectors.Y / circleNormalVectors.Length();
  76.             float sinAlpha = (float)Math.Sqrt(1 - cosAlpha * cosAlpha);
  77.             float sinBeta = circleNormalVectors.Z / (float)Math.Sqrt(circleNormalVectors.X * circleNormalVectors.X + circleNormalVectors.Z * circleNormalVectors.Z);
  78.             float cosBeta = (float)Math.Sqrt(1 - sinBeta * sinBeta);
  79.             Vector3 R0Vector = new Vector3();
  80.             R0Vector.X = radius * cosAlpha * cosBeta;
  81.             R0Vector.Y = -radius * sinAlpha;
  82.             R0Vector.Z = radius * cosAlpha * sinBeta;
  83.             float theta = (float)Math.PI * 2 / mNumber;            
  84.             //定义圆柱顶部和底部网格节点坐标  
  85.             int baseIndex = (mNumber + 1) * (nNumber + 1);
  86.             for (int i = 0; i < mNumber + 1; i++)
  87.             {
  88.                 Vector4 tempRVector = Vector3.Transform(R0Vector, Matrix.RotationAxis(circleNormalVectors, theta * i));
  89.                 for (int j = 0; j < nNumber + 1; j++)
  90.                 {
  91.                     float scaleFactor = (float)j / nNumber;
  92.                     //圆柱体顶部圆
  93.                     vertices[j + i * (nNumber + 1)].X = topCircleCenterVector.X + tempRVector.X * scaleFactor;
  94.                     vertices[j + i * (nNumber + 1)].Y = topCircleCenterVector.Y + tempRVector.Y * scaleFactor;
  95.                     vertices[j + i * (nNumber + 1)].Z = topCircleCenterVector.Z + tempRVector.Z * scaleFactor;
  96.                     vertices[j + i * (nNumber + 1)].Color = Color.Yellow.ToArgb();
  97.                     //圆柱体底部圆
  98.                     vertices[j + i * (nNumber + 1) + baseIndex].X = underCircleCenterVector.X + tempRVector.X * scaleFactor;
  99.                     vertices[j + i * (nNumber + 1) + baseIndex].Y = underCircleCenterVector.Y + tempRVector.Y * scaleFactor;
  100.                     vertices[j + i * (nNumber + 1) + baseIndex].Z = underCircleCenterVector.Z + tempRVector.Z * scaleFactor;
  101.                     vertices[j + i * (nNumber + 1) + baseIndex].Color = Color.Yellow.ToArgb();
  102.                 }
  103.             }
  104.             //定义圆柱四周网格节点坐标
  105.             baseIndex = 2 * (mNumber + 1) * (nNumber + 1);
  106.             for (int i = 0; i < mNumber + 1; i++)
  107.             {
  108.                 Vector4 tempRVector = Vector3.Transform(R0Vector, Matrix.RotationAxis(circleNormalVectors, theta * i));
  109.                 for (int j = 0; j < hNumber + 1; j++)
  110.                 {                    
  111.                     Vector3 tempOPVector = Vector3.Scale(circleNormalVectors, (float)j / hNumber);
  112.                     vertices[j + i * (hNumber + 1) + baseIndex].X = underCircleCenterVector.X + tempRVector.X + tempOPVector.X;
  113.                     vertices[j + i * (hNumber + 1) + baseIndex].Y = underCircleCenterVector.Y + tempRVector.Y + tempOPVector.Y;
  114.                     vertices[j + i * (hNumber + 1) + baseIndex].Z = underCircleCenterVector.Z + tempRVector.Z + tempOPVector.Z;
  115.                     vertices[j + i * (hNumber + 1) + baseIndex].Color = Color.Yellow.ToArgb();
  116.                 }
  117.             } 
  118.         }
  119.         private void IndicesDeclaration()//定义索引
  120.         {
  121.             indexData = new int[12 * mNumber * nNumber + 6 * mNumber*hNumber];
  122.             //定义圆柱顶部和底部网格节点索引  
  123.             int baseIndex01 = 6 * mNumber * nNumber;
  124.             int baseIndex02 = (mNumber + 1) * (nNumber + 1);
  125.             for (int i = 0; i < mNumber; i++)
  126.             {
  127.                 for (int j = 0; j < nNumber; j++)
  128.                 {
  129.                     //顶部圆
  130.                     indexData[6 * (j + i * nNumber)] = j + i * (nNumber + 1);
  131.                     indexData[6 * (j + i * nNumber) + 1] = j + i * (nNumber + 1) + 1;
  132.                     indexData[6 * (j + i * nNumber) + 2] = j + (i + 1) * (nNumber + 1);
  133.                     indexData[6 * (j + i * nNumber) + 3] = j + i * (nNumber + 1) + 1;
  134.                     indexData[6 * (j + i * nNumber) + 4] = j + (i + 1) * (nNumber + 1) + 1;
  135.                     indexData[6 * (j + i * nNumber) + 5] = j + (i + 1) * (nNumber + 1);
  136.                     //底部圆
  137.                     indexData[6 * (j + i * nNumber) + baseIndex01] = j + i * (nNumber + 1) + baseIndex02;
  138.                     indexData[6 * (j + i * nNumber) + 1 + baseIndex01] = j + (i + 1) * (nNumber + 1) + baseIndex02;
  139.                     indexData[6 * (j + i * nNumber) + 2 + baseIndex01] = j + i * (nNumber + 1) + 1 + baseIndex02;
  140.                     indexData[6 * (j + i * nNumber) + 3 + baseIndex01] = j + i * (nNumber + 1) + 1 + baseIndex02;
  141.                     indexData[6 * (j + i * nNumber) + 4 + baseIndex01] = j + (i + 1) * (nNumber + 1) + baseIndex02;
  142.                     indexData[6 * (j + i * nNumber) + 5 + baseIndex01] = j + (i + 1) * (nNumber + 1) + 1 + baseIndex02;
  143.                 }
  144.             }
  145.             //定义圆柱侧面索引
  146.             baseIndex01 = 12 * mNumber * nNumber;
  147.             baseIndex02 = 2*(mNumber + 1) * (nNumber + 1);
  148.             for (int i = 0; i < mNumber; i++)
  149.             {
  150.                 for (int j = 0; j < hNumber; j++)
  151.                 {
  152.                     indexData[6 * (j + i * hNumber) + baseIndex01] = j + i * (hNumber + 1) + baseIndex02;
  153.                     indexData[6 * (j + i * hNumber) + 1 + baseIndex01] = j + (i + 1) * (hNumber + 1) + baseIndex02;
  154.                     indexData[6 * (j + i * hNumber) + 2 + baseIndex01] = j + i * (hNumber + 1) + 1 + baseIndex02;
  155.                     indexData[6 * (j + i * hNumber) + 3 + baseIndex01] = j + i * (hNumber + 1) + 1 + baseIndex02;
  156.                     indexData[6 * (j + i * hNumber) + 4 + baseIndex01] = j + (i + 1) * (hNumber + 1) + baseIndex02;
  157.                     indexData[6 * (j + i * hNumber) + 5 + baseIndex01] = j + (i + 1) * (hNumber + 1) + 1 + baseIndex02;
  158.                 }
  159.             }
  160.         }
  161.         /// <summary>
  162.         /// 绘制圆柱
  163.         /// </summary>
  164.         public void DrawCylinder()
  165.         {
  166.             device.DrawIndexedUserPrimitives(PrimitiveType.TriangleList, 0, 2 * (mNumber + 1) * (nNumber + 1) + (mNumber + 1) * (hNumber + 1), 4 * mNumber * nNumber + 2 * mNumber * hNumber, indexData, false, vertices);
  167.         }
  168.     }
  169. }