温度图显示三维控件

Posted 三维控件研究

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了温度图显示三维控件相关的知识,希望对你有一定的参考价值。

 

  1             OpenFileDialog dlg = new OpenFileDialog();
  2             dlg.Filter = "Result (*.txt)|*.txt|All Files(*.*)|*.*";
  3 
  4             if (DialogResult.OK != dlg.ShowDialog())
  5                 return;
  6 
  7             double[] xdata = { -8.37, -7.87, -7.37, -6.87, -6.37, -5.87, -5.37, -4.87, -4.37, -3.87, -3.37, -2.87, -2.37, -1.87, -1.37, -0.87, -0.37, 0.13, 0.63, 1.13, 1.63, 2.13, 2.63, 3.13, 3.63, 4.13, 4.63, 5.13, 5.63, 6.13, 6.63, 7.13, 7.63, 8.13 };
  8             double[] ydata = { 0, 0.5, 1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5, 5.5, 6, 6.5, 7, 7.5, 8, 8.5, 9, 9.5, 10, 10.5, 11, 11.5, 12, 12.5, 13, 13.5, 14, 14.5, 15, 15.5, 16, 16.5, 17, 17.5, 18, 18.5, 19, 19.5, 20, 20.5 };
  9             double[,] results = new double[xdata.Length, ydata.Length];
 10 
 11             double minValue = 10000000;
 12             double maxValue = -10000000;
 13             StreamReader sr = new StreamReader(dlg.FileName, Encoding.Default);
 14             String line;
 15             int numLine = 0;
 16             while ((line = sr.ReadLine()) != null)
 17             {
 18                 String[] items = line.Split(\'\\t\');
 19                 if (items.Length < 1)
 20                     continue;
 21 
 22                 for (int ii = 0; ii < items.Length; ++ii)
 23                 {
 24                     double val = double.Parse(items[ii]);
 25                     results[ii, numLine] = val;
 26 
 27                     minValue = Math.Min(minValue, val);
 28                     maxValue = Math.Max(maxValue, val);
 29                 }
 30 
 31                 ++numLine;
 32             }
 33 
 34             double range = maxValue - minValue;
 35             const long MaxValue = 0xff0000;
 36             const long MinValue = 0xffff00;
 37             const double Range = MaxValue - MinValue;
 38 
 39 
 40             float[] positionBuffer = new float[xdata.Length * ydata.Length * 3];
 41             float[] normalBuffer = new float[positionBuffer.Length];
 42             float[] colorBuffer = new float[positionBuffer.Length / 3 * 4];
 43 
 44             for (int jj = 0, lenjj = ydata.Length; jj < lenjj; ++jj)
 45                 for (int ii = 0, lenii = xdata.Length; ii < lenii; ++ii)
 46                 {
 47                     int idx = jj * lenii + ii;
 48 
 49 
 50 
 51                     positionBuffer[idx * 3] = (float)xdata[ii] * 10;
 52                     positionBuffer[idx * 3 + 1] = (float)ydata[jj] * 10;
 53                     positionBuffer[idx * 3 + 2] = 0;
 54 
 55                     normalBuffer[idx * 3] = 0;
 56                     normalBuffer[idx * 3 + 1] = 0;
 57                     normalBuffer[idx * 3 + 2] = 1;
 58 
 59                     double rst = results[ii, jj];
 60                     double ratio = (rst - minValue) / range;
 61                     long rgb = (long)(Range * ratio) + MinValue;
 62 
 63                     long red = rgb >> 16 & 0xFF;
 64                     long green = rgb >> 8 & 0xFF;
 65                     long blue = rgb & 0xFF;
 66 
 67                     colorBuffer[idx * 4] = red / 255.0f;
 68                     colorBuffer[idx * 4 + 1] = green / 255.0f;
 69                     colorBuffer[idx * 4 + 2] = blue / 255.0f;
 70                     colorBuffer[idx * 4 + 3] = 1.0f;
 71                 }
 72 
 73 
 74             int faceCount = (xdata.Length - 1) * (ydata.Length - 1) * 2;
 75             uint[] facets = new uint[faceCount * 3];
 76             int faceId = 0;
 77             for (uint jj = 0, lenjj = (uint)ydata.Length; jj < lenjj - 1; ++jj)
 78                 for (uint ii = 0, lenii = (uint)xdata.Length; ii < lenii - 1; ++ii)
 79                 {
 80                     uint a = jj * lenii + ii;
 81                     uint b = a + 1;
 82                     uint c = (jj + 1) * lenii + ii;
 83                     uint d = c + 1;
 84                     /*
 85                     c----------d
 86                     |          |
 87                     |          |
 88                     |          |
 89                     a----------b
 90                     */
 91                     facets[faceId * 3] = a;
 92                     facets[faceId * 3 + 1] = d;
 93                     facets[faceId * 3 + 2] = c;
 94 
 95                     ++faceId;
 96                     facets[faceId * 3] = a;
 97                     facets[faceId * 3 + 1] = b;
 98                     facets[faceId * 3 + 2] = d;
 99 
100                     ++faceId;
101                 }
102 
103             AABox bbox = new AABox();
104             bbox.MinPt = new Vector3(positionBuffer[0], positionBuffer[1], positionBuffer[3]);
105             bbox.MaxPt = new Vector3(positionBuffer[positionBuffer.Length - 3], positionBuffer[positionBuffer.Length - 2], positionBuffer[positionBuffer.Length - 1]);
106 
107             var entity = GlobalInstance.TopoShapeConvert.CreateColoredFaceEntity(positionBuffer, facets, normalBuffer, colorBuffer, bbox);
108 
109             var node = new EntitySceneNode();
110             node.SetEntity(entity);
111 
112 
113             renderView.ShowSceneNode(node);

 

 

以上是关于温度图显示三维控件的主要内容,如果未能解决你的问题,请参考以下文章

基于WebGLCesium技术的三维空间可视化

labview如何调用漂亮的可视化图表

Android之自定义控件实现天气温度折线图和饼状图

Cesium专栏-气象要素(温度降水)色斑图制作

如何用TECPLOT画温度云图,求高手指教

地质钻孔数据的三维可视化Matlab