private void RenderParticles(ParticleRays[] Rays, double total_Frames, Pachyderm_Acoustic.Visualization.Phonon P) { List <Guid> Particle_IDS = new List <Guid>(); double Increment = CutOffLength() / (double)(Frame_Rate.Value * Seconds.Value); Point3d Point = default(Point3d); double PMin = (double)this.Param_Min.Value; double PMax = (double)this.Param_Max.Value; double PRange = PMax - PMin; int h = Rhino.RhinoDoc.ActiveDoc.Views.ActiveView.ActiveViewport.Bounds.Height; int w = Rhino.RhinoDoc.ActiveDoc.Views.ActiveView.ActiveViewport.Bounds.Width; for (int q = 0; q < (int)total_Frames; q++) { for (int i = 0; i < Rays.Length; i++) { for (int p = 0; p < Rays[i].Count(); p++) { Point3d N; double energy; if (Rays[i].RayPt(p, Increment * q, 4, out energy, out N, out Point)) { Vector3d V = new Vector3d(N - Point); V.Unitize(); double SPL = AcousticalMath.SPL_Intensity(energy); System.Drawing.Color C = scale.GetValue(SPL, PMin, PMax); Mesh M = P.Generate(Point, V); M.Scale((SPL - PMin) / PRange); System.Guid PG = Rhino.RhinoDoc.ActiveDoc.Objects.AddMesh(M); Rhino.RhinoDoc.ActiveDoc.Objects.Find(PG).Attributes.ObjectColor = C; Particle_IDS.Add(PG); } } } string number; if (q < 100) { if (q < 10) { number = "00" + q.ToString(); } else { number = "0" + q.ToString(); } } else { number = q.ToString(); } Rhino.RhinoApp.RunScript("-ViewCaptureToFile " + Folder_Status.Text + "\\"[0] + "frame" + number + string.Format(".jpg Width={0} Height={1} DrawGrid=No Enter", 2 * w, 2 * h), true); //Clean Up Model Rhino.RhinoDoc.ActiveDoc.Objects.Delete(Particle_IDS, true); Particle_IDS.Clear(); } }
private void Update_Graph(object sender, EventArgs e) { Analysis_View.GraphPane.CurveList.Clear(); int REC_ID = 0; try { REC_ID = int.Parse(Receiver_Choice.Text); int OCT_ID = PachTools.OctaveStr2Int(Graph_Octave.Text); Analysis_View.GraphPane.Title.Text = "Logarithmic Energy Time Curve"; Analysis_View.GraphPane.XAxis.Title.Text = "Time (seconds)"; Analysis_View.GraphPane.YAxis.Title.Text = "Sound Pressure Level (dB)"; List <int> SrcIDs = new List <int>(); foreach (int i in SourceList.CheckedIndices) { SrcIDs.Add(i); } //List<double[]> Filter = new List<double[]>(); List <System.Drawing.Color> C = new List <System.Drawing.Color> { System.Drawing.Color.Red, System.Drawing.Color.OrangeRed, System.Drawing.Color.Orange, System.Drawing.Color.DarkGoldenrod, System.Drawing.Color.Olive, System.Drawing.Color.Green, System.Drawing.Color.Aquamarine, System.Drawing.Color.Azure, System.Drawing.Color.Blue, System.Drawing.Color.Indigo, System.Drawing.Color.Violet }; double[][] Temp; switch (DistributionType.Text) { case "Monaural": Response = new double[1][]; Response[0] = (AcousticalMath.PTCurve(Direct_Data, IS_Data, Receiver, CutoffTime, SampleRate, REC_ID, SrcIDs, false)); break; case "First Order Ambisonics": Response = new double[4][]; Temp = AcousticalMath.PTCurve_Fig8_3Axis(Direct_Data, IS_Data, Receiver, CutoffTime, SampleRate, Receiver_Choice.SelectedIndex, SelectedSources(), false, (double)Alt_Choice.Value, (double)Azi_Choice.Value, true); Response[0] = AcousticalMath.PTCurve(Direct_Data, IS_Data, Receiver, CutoffTime, SampleRate, REC_ID, SrcIDs, false); Response[1] = Temp[0]; Response[2] = Temp[1]; Response[3] = Temp[2]; break; case "Second Order Ambisonics": Response = new double[9][]; Temp = AcousticalMath.PTCurve_Fig8_3Axis(Direct_Data, IS_Data, Receiver, CutoffTime, SampleRate, Receiver_Choice.SelectedIndex, SelectedSources(), false, (double)Alt_Choice.Value, (double)Azi_Choice.Value, true); Response[0] = AcousticalMath.PTCurve(Direct_Data, IS_Data, Receiver, CutoffTime, SampleRate, REC_ID, SrcIDs, false); Response[1] = Temp[0]; Response[2] = Temp[1]; Response[3] = Temp[2]; Temp = AcousticalMath.PTCurve_Ambisonics2(Direct_Data, IS_Data, Receiver, CutoffTime, SampleRate, Receiver_Choice.SelectedIndex, SelectedSources(), false, (double)Alt_Choice.Value, (double)Azi_Choice.Value, true); Response[4] = Temp[0]; Response[5] = Temp[1]; Response[6] = Temp[2]; Response[7] = Temp[3]; Response[8] = Temp[4]; break; case "Third Order Ambisonics": Response = new double[16][]; Temp = AcousticalMath.PTCurve_Fig8_3Axis(Direct_Data, IS_Data, Receiver, CutoffTime, SampleRate, Receiver_Choice.SelectedIndex, SelectedSources(), false, (double)Alt_Choice.Value, (double)Azi_Choice.Value, true); Response[0] = AcousticalMath.PTCurve(Direct_Data, IS_Data, Receiver, CutoffTime, SampleRate, REC_ID, SrcIDs, false); Response[1] = Temp[0]; Response[2] = Temp[1]; Response[3] = Temp[2]; Temp = AcousticalMath.PTCurve_Ambisonics2(Direct_Data, IS_Data, Receiver, CutoffTime, SampleRate, Receiver_Choice.SelectedIndex, SelectedSources(), false, (double)Alt_Choice.Value, (double)Azi_Choice.Value, true); Response[4] = Temp[0]; Response[5] = Temp[1]; Response[6] = Temp[2]; Response[7] = Temp[3]; Response[8] = Temp[4]; Temp = AcousticalMath.PTCurve_Ambisonics3(Direct_Data, IS_Data, Receiver, CutoffTime, SampleRate, Receiver_Choice.SelectedIndex, SelectedSources(), false, (double)Alt_Choice.Value, (double)Azi_Choice.Value, true); Response[9] = Temp[0]; Response[10] = Temp[1]; Response[11] = Temp[2]; Response[12] = Temp[3]; Response[13] = Temp[4]; Response[14] = Temp[5]; Response[15] = Temp[6]; break; default: Response = new double[Channel_View.Items.Count][]; for (int i = 0; i < Channel_View.Items.Count; i++) { double alt = -(double)Alt_Choice.Value + 180 * Math.Asin((Channel_View.Items[i] as channel).V.z) / Math.PI; double azi = (double)Azi_Choice.Value + 180 * Math.Atan2((Channel_View.Items[i] as channel).V.y, (Channel_View.Items[i] as channel).V.x) / Math.PI; if (alt > 90) { alt -= 180; } if (alt < -90) { alt += 180; } if (azi > 360) { azi -= 360; } if (azi < 0) { azi += 360; } Response[i] = AcousticalMath.PTCurve_Directional(Direct_Data, IS_Data, Receiver, CutoffTime, SampleRate, PachTools.OctaveStr2Int(Graph_Octave.Text), REC_ID, SrcIDs, false, alt, azi, true); } break; } //Get the maximum value of the Direct Sound double DirectMagnitude = 0; foreach (int i in SourceList.CheckedIndices) { double[] E = Direct_Data[i].EnergyValue(OCT_ID, REC_ID); for (int j = 0; j < E.Length; j++) { double D = AcousticalMath.SPL_Intensity(E[j]); if (D > DirectMagnitude) { DirectMagnitude = D; } } } double[] time = new double[Response[0].Length]; for (int i = 0; i < Response[0].Length; i++) { time[i] = (double)i / SampleRate - 1024f / SampleRate; } for (int i = 0; i < Response.Length; i++) { double[] filter = Audio.Pach_SP.FIR_Bandpass(Response[i], OCT_ID, SampleRate, 0); Analysis_View.GraphPane.AddCurve(String.Format("Channel {0}", i), time, AcousticalMath.SPL_Pressure_Signal(filter), C[i % 10], ZedGraph.SymbolType.None); } Analysis_View.GraphPane.XAxis.Scale.Max = time[time.Length - 1]; Analysis_View.GraphPane.XAxis.Scale.Min = time[0]; Analysis_View.GraphPane.YAxis.Scale.Max = DirectMagnitude + 15; Analysis_View.GraphPane.YAxis.Scale.Min = 0; //AuralisationConduit.Instance.set_direction(Receiver[0].Origin(Receiver_Choice.SelectedIndex), new Rhino.Geometry.Vector3d(Math.Cos((float)Azi_Choice.Value * Math.PI / 180.0f) * Math.Cos((float)Alt_Choice.Value * Math.PI / 180.0f), Math.Sin((float)Azi_Choice.Value * Math.PI / 180.0f) * Math.Cos((float)Alt_Choice.Value * Math.PI / 180.0f), Math.Sin((float)Alt_Choice.Value * Math.PI / 180.0f))); Rhino.RhinoDoc.ActiveDoc.Views.Redraw(); } catch { return; } Analysis_View.AxisChange(); Analysis_View.Invalidate(); Draw_Feedback(); }