2013-12-12 2 views
1

В настоящее время я работаю без проблем, создавая программу Win32 (.net), которая отображает данные, поступающие из последовательного порта. Я смог получить данные из последовательного порта и настроить куб сюжета ilnumerics и т. Д. Но то, что я не могу сделать, это преобразовать (x, y, z) в один ILAray для построения точек.Нанесение данных из последовательного порта в ILNumerics

public void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e) 
    { 
     if (serialPort1.IsOpen == true) 
     { 
      Varriables.numberOfSerialBytes = serialPort1.BytesToRead; 

      if (Varriables.numberOfSerialBytes >= Varriables.numberOfSerialBytesPerLine) //change 13 to number of bytes, changes for number of stars (stars x3 x BytesPerInt) 
      { 
       string serialText = serialPort1.ReadExisting(); 
       if (serialText != "") RecievedText(serialText); 
       else { } 
      } 
     } 
    } 

    public void RecievedText(string text) 
    { 
     if (richTextBox1.InvokeRequired) 
     { 
      SetTextCallBack x = new SetTextCallBack(RecievedText); 
      this.Invoke(x, new object[] { text }); 
     } 
     else 
     { 
      richTextBox1.Text = text; 
      try { CalculatePoints(text); } 
      catch { } 
     } 
    } 

    public void CalculatePoints(string positionsString) 
    { 
     string[] starpositionStringList = positionsString.Split(" ".ToCharArray()); 
     List<float> starPositionFloatListX = new List<float>(); 
     List<float> starPositionFloatListY = new List<float>(); 
     List<float> starPositionFloatListZ = new List<float>(); 
     System.Console.WriteLine(starpositionStringList.Count()); 

     for (int i = 0; i < starpositionStringList.Count()/3; i += 3) 
     { 
      int iy = i + 1; 
      int iz = i + 2; 

      float x = float.Parse(starpositionStringList[i]); 
      float y = float.Parse(starpositionStringList[iy]); 
      float z = float.Parse(starpositionStringList[iz]); 

      starPositionFloatListX.Add(x); 
      starPositionFloatListY.Add(y); 
      starPositionFloatListZ.Add(z); 
     } 

     float[] xArray = starPositionFloatListX.ToArray<float>(); 
     float[] yArray = starPositionFloatListY.ToArray<float>(); 
     float[] zArray = starPositionFloatListZ.ToArray<float>(); 

     PlotPoints(xArray, yArray, zArray); 
    } 

    public void PlotPoints(float[] x, float[] y, float[] z) 
    { 
     //could send data through PlotPoints(x,y,z); 
     //or make a long array using a for loop and send that 
     //either way i still need to make an array to plot and use ilPlanel2.Scene = Scene to continue upadating the scene 

     ILArray<float> starPositionsX = x; 
     ILArray<float> starPositionsY = y; 
     ILArray<float> starPositionsZ = z; 
     ILArray<float> starPositions = ???????????????; //need to convert (x,y,z) to ILArray<float> 

     ilPanel2.Scene.First<ILPlotCube>().Animations.AsParallel(); 

     if(Varriables.pointsPlotted == false) 
     { 
      //ilPanel2.Scene.First<ILPlotCube>(){ new ILPoints { Positions = starPositions, Colors } }; 
      //Cube.Add(new ILPoints { Positions = starPositions }); 
      ilPanel2.Scene.First<ILPlotCube>().Add<ILPoints>(new ILPoints{ Positions = starPositions }); 

      Varriables.pointsPlotted = true; 
     } 

     else 
     { 
      ilPanel2.Scene.First<ILPoints>().Positions.Update(starPositions); 
     } 
     ilPanel2.Refresh(); 
    } 

есть функция IL.Math, которую я могу использовать для этого?

ответ

1

Создание ILArray из нужного размера и использовать входящий поплавок [] System.Arrays непосредственно для того, чтобы заполнить значение:

public void PlotPoints(float[] x, float[] y, float[] z) { 

    using (ILScope.Enter()) { 

     ILArray<float> starPositions = ILMath.zeros<float>(3, x.Length); 
     starPositions["0;:"] = x; 
     starPositions["1;:"] = y; 
     starPositions["2;:"] = z; 

     ilPanel1.Scene.First<ILPlotCube>().Add<ILPoints>(new ILPoints { Positions = starPositions }); 
     // (... or update accordingly, if the shape exists already) 

     // at the end of all modifications, call Configure() 

     ilPanel1.Scene.Configure(); 
     ilPanel1.Refresh(); 
    } 
} 

Не забудьте позвонить Настройке() на модифицированном виде (или любой родительский узел на пути к корню). Кроме того, я обычно обертываю все связанные с ILArray коды в блоке using (ILScope.Enter()) { ... Это помогает значительно повысить производительность для частого обновления.

+0

работает как шарм, благодаря которому – AstroPy