/// <summary> /// Constructor prepares image source calculation to run. /// </summary> /// <param name="Source"></param> /// <param name="Receiver"></param> /// <param name="Direct"></param> /// <param name="Rm"></param> /// <param name="MaxOrder_in">The maximum order to be calculated for.</param> public ImageSourceData(Source Source, Receiver_Bank Receiver, Direct_Sound Direct, Polygon_Scene Rm, int[] Octaves, int MaxOrder_in, bool Edge_Diffraction, int SourceID_in) { IncludeEdges = Edge_Diffraction; Diffraction = Edge_Diffraction; Oct_choice = new int[Octaves[1] - Octaves[0] + 1]; for (int i = 0; i < Octaves.Length; i++) Oct_choice[i] = i + Octaves[0]; SrcNo = SourceID_in; ValidPaths = new List<Deterministic_Reflection>[Receiver.Count]; Speed_of_Sound = Rm.Sound_speed(0); MaxOrder = MaxOrder_in; Src = Source; Rec = new Hare.Geometry.Point[Receiver.Count]; SampleCT = Receiver.SampleCT; SampleRate = Receiver.SampleRate; for(int i = 0; i < Receiver.Count; i++) { Rec[i] = Receiver.H_Origin(i); } Room = Rm; Direct_Time = new double[Receiver.Count]; for (int q = 0; q < Receiver.Count; q++) { Direct_Time[q] = Direct.Min_Time(q); } }
protected override Rhino.Commands.Result RunCommand(RhinoDoc doc, Rhino.Commands.RunMode mode) { //List<Rhino.DocObjects.RhinoObject> ObjectList = new List<Rhino.DocObjects.RhinoObject>(); Rhino.DocObjects.ObjectEnumeratorSettings settings = new Rhino.DocObjects.ObjectEnumeratorSettings(); settings.DeletedObjects = false; settings.HiddenObjects = false; settings.LockedObjects = true; settings.NormalObjects = true; settings.VisibleFilter = true; settings.ObjectTypeFilter = Rhino.DocObjects.ObjectType.Brep & Rhino.DocObjects.ObjectType.Surface & Rhino.DocObjects.ObjectType.Extrusion; List <Rhino.DocObjects.RhinoObject> RC_List = new List <Rhino.DocObjects.RhinoObject>(); foreach (Rhino.DocObjects.RhinoObject RHobj in Rhino.RhinoDoc.ActiveDoc.Objects.GetObjectList(settings)) { if (RHobj.ObjectType == Rhino.DocObjects.ObjectType.Brep || RHobj.ObjectType == Rhino.DocObjects.ObjectType.Surface || RHobj.ObjectType == Rhino.DocObjects.ObjectType.Extrusion) { RC_List.Add(RHobj); } } if (RC_List.Count != 0) { Ret_NURBS_Scene = new RhCommon_Scene(RC_List, Air_Temp, Rel_Humidity, Atm_pressure, Atten_Choice, Edge_Freq, false); if (!Ret_NURBS_Scene.Valid) { return(Rhino.Commands.Result.Failure); } Ret_Mesh_Scene = new RhCommon_PolygonScene(RC_List, Register_Edges, Air_Temp, Rel_Humidity, Atm_pressure, Atten_Choice, Edge_Freq, false); if (!Ret_Mesh_Scene.Valid) { return(Rhino.Commands.Result.Failure); } } C_Result = Rhino.Commands.Result.Success; return(Rhino.Commands.Result.Success); }
public IS_Trace(Source Source_in, Receiver_Bank Receiver_in, Polygon_Scene Room_in, double CutOffLength_in, int RayCount_in, int ImageOrder_in, double Speed_of_sound, int Bincount_in) { C_Sound = Speed_of_sound; CO_Time = CutOffLength_in / Speed_of_sound; Room = Room_in; Receiver = Receiver_in; Raycount = RayCount_in; CutoffLength = CutOffLength_in; ImageOrder = ImageOrder_in; Source = Source_in; }
public Acoustic_Compact_FDTD(Polygon_Scene Rm_in, ref Signal_Driver_Compact S_in, ref Microphone_Compact M_in, double fmax_in, double tmax_in) { Rm = Rm_in; SD = S_in; Mic = M_in; fmax = fmax_in; tmax = tmax_in; Rm.partition(20); Build_FVM13(ref xDim, ref yDim, ref zDim, true); }
private void CalculateSim_Click(object sender, EventArgs e) { FC = new ForCall(Forw_proc); Polygon_Scene Rm = PachTools.Get_Poly_Scene((double)Rel_Humidity.Value, (double)Air_Temp.Value, (double)Air_Pressure.Value, Atten_Method.SelectedIndex, EdgeFreq.Checked); if (!Rm.Complete) { return; } Rhino.Geometry.Point3d[] Src = PachTools.GetSource(); Rhino.Geometry.Point3d[] Rec = PachTools.GetReceivers().ToArray(); if (Src.Length < 1 || Rm == null) { Rhino.RhinoApp.WriteLine("Model geometry not specified... Exiting calculation..."); } Numeric.TimeDomain.Microphone_Compact Mic = new Numeric.TimeDomain.Microphone_Compact(Rec); double fs = 137.8125 * Math.Pow(2, Selected_Extent.SelectedIndex); samplefrequency = fs; double df = 1d / ((double)CO_TIME.Value / 1000); Numeric.TimeDomain.Signal_Driver_Compact SD = new Numeric.TimeDomain.Signal_Driver_Compact(Numeric.TimeDomain.Signal_Driver_Compact.Signal_Type.Sine_Pulse, df, 1, PachTools.GetSource()); FDTD = new Numeric.TimeDomain.Acoustic_Compact_FDTD(Rm, ref SD, ref Mic, fs, (double)CO_TIME.Value); for (double f = df; f < fs; f += df) { FDTD.reset(f, Numeric.TimeDomain.Signal_Driver_Compact.Signal_Type.Sine_Pulse); FDTD.RuntoCompletion(); Frequencies.Items.Add(string.Format("{0} Hz.", f), true); } Receiver_Choice.Text = "0"; result_signals = Mic.Recordings; }
private void CalculateScattering_Click(object sender, EventArgs e) { Chosenfreq = 0; double radius = (double)ScatteringRadius.Value; double t = 3 * (radius + (double)Sample_Depth.Value) / C_Sound() * 1000; if (LabCenter == null) { return; } if (Analysis_Technique.SelectedIndex == 0) { Polygon_Scene Rm = RC_PachTools.Get_Poly_Scene((double)Rel_Humidity.Value, false, (double)Air_Temp.Value, (double)Air_Pressure.Value, Atten_Method.SelectedIndex, EdgeFreq.Checked); Empty_Scene Rm_Ctrl = new Empty_Scene((double)Air_Temp.Value, (double)Rel_Humidity.Value, (double)Air_Pressure.Value, Atten_Method.SelectedIndex, EdgeFreq.Checked, true, Rm.Min(), Rm.Max()); Rm_Ctrl.PointsInScene(new List <Hare.Geometry.Point> { Rm.Min(), Rm.Max() }); Rm_Ctrl.partition(); if (!Rm.Complete && Rm_Ctrl.Complete) { return; } Hare.Geometry.Point ArrayCenter = new Hare.Geometry.Point(LabCenter.X, LabCenter.Y, LabCenter.Z + (double)Sample_Depth.Value); Hare.Geometry.Point[] Src = new Hare.Geometry.Point[1] { new Hare.Geometry.Point(LabCenter.X, LabCenter.Y, LabCenter.Z + radius + (double)Sample_Depth.Value) }; List <Hare.Geometry.Point> Rec = new List <Hare.Geometry.Point>(); for (int phi = 0; phi < 18; phi++) { for (int theta = 0; theta < 36; theta++) { double anglePhi = phi * Math.PI / 18; double angleTheta = theta * Utilities.Numerics.PiX2 / 36; Rec.Add(ArrayCenter + radius * new Hare.Geometry.Point(Math.Cos(angleTheta) * Math.Cos(anglePhi), Math.Sin(angleTheta) * Math.Cos(anglePhi), Math.Sin(anglePhi))); } } //for (int phi = 0; phi < 18; phi++) // { // double anglePhi = phi * Math.PI / 18; // Rec.Add(ArrayCenter + radius * new Rhino.Geometry.Point3d(Math.Cos(anglePhi), 0, Math.Sin(anglePhi))); // } double fs = 62.5 * Utilities.Numerics.rt2 * Math.Pow(2, comboBox2.SelectedIndex); t += 60 / fs; Numeric.TimeDomain.Microphone_Compact Mic = new Numeric.TimeDomain.Microphone_Compact(Rec.ToArray()); Numeric.TimeDomain.Signal_Driver_Compact SD = new Numeric.TimeDomain.Signal_Driver_Compact(Numeric.TimeDomain.Signal_Driver_Compact.Signal_Type.Sine_Pulse, fs, 1, Src); Numeric.TimeDomain.Acoustic_Compact_FDTD FDTDS = new Numeric.TimeDomain.Acoustic_Compact_FDTD(Rm, ref SD, ref Mic, fs, t, Numeric.TimeDomain.Acoustic_Compact_FDTD.GridType.ScatteringLab, Utilities.RC_PachTools.RPttoHPt(LabCenter), radius * 2, radius * 2, radius * 1.2 + (double)Sample_Depth.Value); FDTDS.RuntoCompletion(); Numeric.TimeDomain.Microphone_Compact Micf = new Numeric.TimeDomain.Microphone_Compact(Rec.ToArray()); Numeric.TimeDomain.Signal_Driver_Compact SDf = new Numeric.TimeDomain.Signal_Driver_Compact(Numeric.TimeDomain.Signal_Driver_Compact.Signal_Type.Sine_Pulse, fs, 1, Src); Numeric.TimeDomain.Acoustic_Compact_FDTD FDTDF = new Numeric.TimeDomain.Acoustic_Compact_FDTD(Rm_Ctrl, ref SDf, ref Micf, fs, t, Numeric.TimeDomain.Acoustic_Compact_FDTD.GridType.ScatteringLab, Utilities.RC_PachTools.RPttoHPt(LabCenter), radius * 2, radius * 2, radius * 1.2 + (double)Sample_Depth.Value); FDTDF.RuntoCompletion(); samplefrequency = FDTDS.SampleFrequency; Mic.reset(); result_signals = Mic.Recordings[0]; Micf.reset(); result_signals = Micf.Recordings[0]; //Calculate Scattering Coefficients double[][] TimeS = Mic.Recordings[0]; double[][] TimeF = Micf.Recordings[0]; //Zero packing for (int i = 0; i < TimeS.Length; i++) { Array.Resize(ref TimeS[i], (int)(samplefrequency / 2)); Array.Resize(ref TimeF[i], (int)(samplefrequency / 2)); } System.Numerics.Complex[][] FS = new System.Numerics.Complex[TimeS.Length][]; System.Numerics.Complex[][] FF = new System.Numerics.Complex[TimeS.Length][]; for (int i = 0; i < TimeS.Length; i++) { FS[i] = Audio.Pach_SP.FFT_General(TimeS[i], 0); FF[i] = Audio.Pach_SP.FFT_General(TimeF[i], 0); } Scattering = new double[FS[0].Length]; for (int i = 0; i < FS[0].Length; i++) { System.Numerics.Complex sumFS2 = 0; System.Numerics.Complex sumFF2 = 0; System.Numerics.Complex sumFSFF = 0; for (int j = 0; j < FS.Length; j++) { sumFS2 += System.Numerics.Complex.Pow(FS[j][i].Magnitude, 2); sumFF2 += System.Numerics.Complex.Pow(FF[j][i].Magnitude, 2); sumFSFF += FS[j][i] * System.Numerics.Complex.Conjugate(FF[j][i]); //sumFS2 += System.Numerics.Complex.Pow(FS[j][i], 2); //sumFF2 += System.Numerics.Complex.Pow(FF[j][i], 2); //sumFSFF += FS[j][i] * System.Numerics.Complex.Conjugate(FF[j][i]); } System.Numerics.Complex sumReflected = sumFSFF / sumFF2; System.Numerics.Complex Ratio = sumFF2 / sumFS2; Scattering[i] = 1 - System.Numerics.Complex.Abs(sumReflected * sumReflected * Ratio); } } else if (Analysis_Technique.SelectedIndex == 1) { Polygon_Scene Rm = RC_PachTools.Get_Poly_Scene((double)Rel_Humidity.Value, false, (double)Air_Temp.Value, (double)Air_Pressure.Value, Atten_Method.SelectedIndex, EdgeFreq.Checked); Empty_Scene Rm_Ctrl = new Empty_Scene((double)Air_Temp.Value, (double)Rel_Humidity.Value, (double)Air_Pressure.Value, Atten_Method.SelectedIndex, EdgeFreq.Checked, true, Rm.Min(), Rm.Max()); Rm_Ctrl.PointsInScene(new List <Hare.Geometry.Point> { Rm.Min(), Rm.Max() }); Rm_Ctrl.partition(); if (!Rm.Complete && Rm_Ctrl.Complete) { return; } //if (!Rm.Complete) return; Hare.Geometry.Point ArrayCenter = new Hare.Geometry.Point(LabCenter.X, LabCenter.Y, LabCenter.Z + (double)Sample_Depth.Value); Hare.Geometry.Point[] Src = new Hare.Geometry.Point[1] { new Hare.Geometry.Point(LabCenter.X, LabCenter.Y, LabCenter.Z + radius + (double)Sample_Depth.Value) }; List <Hare.Geometry.Point> Rec = new List <Hare.Geometry.Point>(); for (int phi = 0; phi < 18; phi++) { for (int theta = 0; theta < 36; theta++) { double anglePhi = phi * Math.PI / 18; double angleTheta = theta * Utilities.Numerics.PiX2 / 36; Rec.Add(ArrayCenter + radius * new Hare.Geometry.Point(Math.Cos(angleTheta) * Math.Cos(anglePhi), Math.Sin(angleTheta) * Math.Cos(anglePhi), Math.Sin(anglePhi))); } } //for (int phi = 0; phi < 18; phi++) // { // double anglePhi = phi * Math.PI / 18; // Rec.Add(ArrayCenter + radius * new Rhino.Geometry.Point3d(Math.Cos(anglePhi), 0, Math.Sin(anglePhi))); // } double fs = 62.5 * Utilities.Numerics.rt2 * Math.Pow(2, Analysis_Technique.SelectedIndex); Numeric.TimeDomain.Microphone_Compact Mic = new Numeric.TimeDomain.Microphone_Compact(Rec.ToArray()); Numeric.TimeDomain.Signal_Driver_Compact SD = new Numeric.TimeDomain.Signal_Driver_Compact(Numeric.TimeDomain.Signal_Driver_Compact.Signal_Type.Sine_Pulse, fs, 1, Src); Numeric.TimeDomain.Acoustic_Compact_FDTD FDTDS = new Numeric.TimeDomain.Acoustic_Compact_FDTD(Rm, ref SD, ref Mic, fs, t, Numeric.TimeDomain.Acoustic_Compact_FDTD.GridType.TransparencyLab, Utilities.RC_PachTools.RPttoHPt(LabCenter), radius * 4, radius * 4, radius * 1.2 + (double)Sample_Depth.Value); FDTDS.RuntoCompletion(); Numeric.TimeDomain.Microphone_Compact Micf = new Numeric.TimeDomain.Microphone_Compact(Rec.ToArray()); Numeric.TimeDomain.Signal_Driver_Compact SDf = new Numeric.TimeDomain.Signal_Driver_Compact(Numeric.TimeDomain.Signal_Driver_Compact.Signal_Type.Sine_Pulse, fs, 1, Src); Numeric.TimeDomain.Acoustic_Compact_FDTD FDTDF = new Numeric.TimeDomain.Acoustic_Compact_FDTD(Rm_Ctrl, ref SDf, ref Micf, fs, t, Numeric.TimeDomain.Acoustic_Compact_FDTD.GridType.ScatteringLab, Utilities.RC_PachTools.RPttoHPt(LabCenter), radius * 4, radius * 4, radius * 1.2 + (double)Sample_Depth.Value); FDTDF.RuntoCompletion(); int start = (int)Math.Round((2.25 * radius / Rm.Sound_speed(Src[0])) / FDTDS.dt); samplefrequency = FDTDS.SampleFrequency; Mic.reset(); result_signals = Mic.Recordings[0]; //Calculate Scattering Coefficients double[][] TimeS = Mic.Recordings[0]; double[][] TimeF = Micf.Recordings[0]; System.Numerics.Complex[][] FS = new System.Numerics.Complex[TimeS.Length][]; System.Numerics.Complex[][] FF = new System.Numerics.Complex[TimeS.Length][]; for (int i = 0; i < TimeS.Length; i++) { double[] ts = new double[TimeS[i].Length - start]; double[] tf = new double[TimeS[i].Length - start]; for (int ti = start; ti < TimeS[i].Length; ti++) { ts[ti - start] = TimeS[i][ti]; tf[ti - start] = TimeF[i][ti]; } FS[i] = Audio.Pach_SP.FFT_General(ts, 0); FF[i] = Audio.Pach_SP.FFT_General(TimeF[i], 0); } Scattering = new double[FS[0].Length]; for (int i = 0; i < FS[0].Length; i++) { System.Numerics.Complex sumFF2 = 0; for (int j = 0; j < FS.Length; j++) { sumFF2 += System.Numerics.Complex.Pow(FS[j][i], 2) / System.Numerics.Complex.Pow(FF[j][i], 2); } Scattering[i] = Utilities.AcousticalMath.SPL_Pressure(System.Numerics.Complex.Abs(sumFF2)); } } Update_Scattering_Graph(null, null); }
private void Calculate_Click(object sender, System.EventArgs e) { FC = new ForCall(Forw_proc); Polygon_Scene Rm = RC_PachTools.Get_Poly_Scene((double)Rel_Humidity.Value, false, (double)Air_Temp.Value, (double)Air_Pressure.Value, Atten_Method.SelectedIndex, EdgeFreq.Checked); if (!Rm.Complete) { return; } if (P == null) { P = new WaveConduit(scale, new double[2] { (double)this.Param_Min.Value, (double)this.Param_Max.Value }); } Hare.Geometry.Point[] Src = RC_PachTools.GetSource(); Hare.Geometry.Point[] Rec = new Hare.Geometry.Point[0];//PachTools.GetReceivers().ToArray(); if (Src.Length < 1 || Rm == null) { Rhino.RhinoApp.WriteLine("Model geometry not specified... Exiting calculation..."); } Numeric.TimeDomain.Signal_Driver_Compact.Signal_Type s_type = Numeric.TimeDomain.Signal_Driver_Compact.Signal_Type.Dirac_Pulse; switch (SourceSelect.Text) { case "Dirac Pulse": s_type = Numeric.TimeDomain.Signal_Driver_Compact.Signal_Type.Dirac_Pulse; break; case "Sine Wave": s_type = Numeric.TimeDomain.Signal_Driver_Compact.Signal_Type.Sine_Tone; break; case "Sine Pulse": s_type = Numeric.TimeDomain.Signal_Driver_Compact.Signal_Type.Sine_Pulse; break; } Numeric.TimeDomain.Signal_Driver_Compact SD = new Numeric.TimeDomain.Signal_Driver_Compact(s_type, (double)Frequency_Selection.Value, 1, RC_PachTools.GetSource()); Numeric.TimeDomain.Microphone_Compact Mic = new Numeric.TimeDomain.Microphone_Compact(Rec); FDTD = new Numeric.TimeDomain.Acoustic_Compact_FDTD_RC(Rm, ref SD, ref Mic, (double)Freq_Max.Value, (double)CO_TIME.Value, Numeric.TimeDomain.Acoustic_Compact_FDTD.GridType.Freefield, null, 0, 0, 0); //FDTD = new Numeric.TimeDomain.Acoustic_Compact_FDTD(Rm, ref SD, ref Mic, (double)Freq_Max.Value, (double)CO_TIME.Value, Numeric.TimeDomain.Acoustic_Compact_FDTD.GridType.ScatteringLab, new Hare.Geometry.Point(0,0,0), 8, 6, 5); M = new Rhino.Geometry.Mesh[3][] { FDTD.m_templateX, FDTD.m_templateY, FDTD.m_templateZ }; P.SetColorScale(new Pach_Graphics.HSV_colorscale(Param_Scale.Height, Param_Scale.Width, 0, 4.0 / 3.0, 1, 0, 1, 1, false, 12), new double[] { (double)Param_Min.Value, (double)Param_Max.Value }); P.Enabled = true; if (AxisSelect.SelectedIndex == 0) { Pos_Select.Maximum = FDTD.xDim - 1; } else if (AxisSelect.SelectedIndex == 1) { Pos_Select.Maximum = FDTD.yDim - 1; } else if (AxisSelect.SelectedIndex == 2) { Pos_Select.Maximum = FDTD.zDim - 1; } if (Map_Planes.Items.Count == 0) { Pos_Select.Value = Pos_Select.Maximum / 2; AddPlane_Click(new object(), new EventArgs()); } Loop_Click(new object(), new EventArgs()); }
private void CalculateSim_Click(object sender, EventArgs e) { EigenFrequencies.Items.Clear(); Chosenfreq = 0; FC = new ForCall(Forw_proc); Polygon_Scene Rm = RC_PachTools.Get_Poly_Scene((double)Rel_Humidity.Value, false, (double)Air_Temp.Value, (double)Air_Pressure.Value, Atten_Method.SelectedIndex, EdgeFreq.Checked); if (!Rm.Complete) { return; } Hare.Geometry.Point[] Src = RC_PachTools.GetSource(); List <Hare.Geometry.Point> Rec = RC_PachTools.GetReceivers(); if (Src.Length < 1 || Rm == null) { Rhino.RhinoApp.WriteLine("Model geometry not specified... Exiting calculation..."); } Numeric.TimeDomain.Microphone_Compact Mic = new Numeric.TimeDomain.Microphone_Compact(Rec.ToArray()); double fs = 62.5 * Utilities.Numerics.rt2 * Math.Pow(2, Eigen_Extent.SelectedIndex); //samplefrequency = fs; Numeric.TimeDomain.Signal_Driver_Compact SD = new Numeric.TimeDomain.Signal_Driver_Compact(Numeric.TimeDomain.Signal_Driver_Compact.Signal_Type.Sine_Pulse, 1000, 1, RC_PachTools.GetSource()); FDTD = new Numeric.TimeDomain.Acoustic_Compact_FDTD_RC(Rm, ref SD, ref Mic, fs, (double)CO_TIME.Value, Numeric.TimeDomain.Acoustic_Compact_FDTD.GridType.Freefield, null, 0, 0, 0); FDTD.RuntoCompletion(); samplefrequency = FDTD.SampleFrequency; Mic.reset(); result_signals = Mic.Recordings[0]; //System.Numerics.Complex[] source_response = SD.Frequency_Response(result_signals[0].Length); //double f_limit = 0.8 * fs / samplefrequency * result_signals[0].Length; //double f_top = 1.3 * f_limit; //double dpi = Utilities.Numerics.PiX2 / (f_top - f_limit); //for (int c = 0; c < result_signals.Length; c++) //{ // System.Numerics.Complex[] result_response = Audio.Pach_SP.FFT_General(result_signals[c],0); // Array.Resize(ref result_response, result_response.Length / 2); // for (int s = 0; s < result_response.Length; s++) // { // System.Numerics.Complex mod = source_response[s].Magnitude; // if (s > f_limit) mod /= System.Numerics.Complex.Pow(source_response[s], (.5 * Math.Tanh((s-f_limit) * dpi) + 0.5)); // result_response[s] /= mod.Magnitude; // } // result_signals[c] = Audio.Pach_SP.IFFT_Real_General(Audio.Pach_SP.Mirror_Spectrum(result_response), 0); //} //Find Eigenfrequencies if (EigenFrequencies.Items.Count > 0) { return; } EigenFrequencies.Items.Clear(); Find_EigenFrequencies(); Receiver_Choice.Items.Clear(); for (int i = 0; i < result_signals.Length; i++) { Receiver_Choice.Items.Add(i); } Time = new double[result_signals[0].Length]; for (int i = 0; i < Time.Length; i++) { Time[i] = (double)i / samplefrequency; } Receiver_Choice.SelectedIndex = 0; Receiver_Choice.Update(); }
private void Calculate_Click(object sender, System.EventArgs e) { PachydermAc_PlugIn plugin = PachydermAc_PlugIn.Instance; string SavePath = null; if (plugin.Save_Results()) { SaveFileDialog sf = new System.Windows.Forms.SaveFileDialog(); sf.DefaultExt = ".pachm"; sf.AddExtension = true; sf.Filter = "Pachyderm Mapping Data File (*.pachm)|*.pachm|" + "All Files|"; if (sf.ShowDialog() == System.Windows.Forms.DialogResult.OK) { SavePath = sf.FileName; } } SourceList.Items.Clear(); Map = null; System.Threading.Thread.Sleep(500); PachydermAc_PlugIn p = PachydermAc_PlugIn.Instance; Pach_RunSim_Command command = Pach_RunSim_Command.Instance; if (!p.Source(out Source) || Rec_Srfs == null) { Rhino.RhinoApp.WriteLine("Model geometry not specified... Exiting calculation..."); return; } Point3d[] SPT; plugin.SourceOrigin(out SPT); Calculate.Enabled = false; List <Point3d> P = new List <Point3d>(); P.AddRange(SPT); Polygon_Scene PScene = Utilities.PachTools.Get_Poly_Scene((double)Rel_Humidity.Value, (double)Air_Temp.Value, (double)Air_Pressure.Value, Atten_Method.SelectedIndex, EdgeFreq.Checked); if (!PScene.Complete) { Calculate.Enabled = true; return; } WC = new WaveConduit(c_scale, new double[] { Current_SPLMin, Current_SPLMax }); PScene.partition(P); Scene Flex_Scene; if (PachydermAc_PlugIn.Instance.Geometry_Spec() == 0) { RhCommon_Scene NScene = Utilities.PachTools.Get_NURBS_Scene((double)Rel_Humidity.Value, (double)Air_Temp.Value, (double)Air_Pressure.Value, Atten_Method.SelectedIndex, EdgeFreq.Checked); if (!NScene.Complete) { return; } NScene.partition(P, plugin.VG_Domain()); Flex_Scene = NScene; } else { Flex_Scene = PScene; } Map = new PachMapReceiver[Source.Length]; for (int i = 0; i < Source.Length; i++) { Source[i].AppendPts(ref P); Map[i] = new PachMapReceiver(Rec_Srfs, Source[i], 1000, (double)Increment.Value * 0.01, Flex_Scene, (int)RT_Count.Value, (double)CO_TIME.Value, Disp_Audience.Checked, Sum_Time.Checked, DirectionalToggle.Checked, Rec_Vertex.Checked, Offset_Mesh.Checked); } for (int s_id = 0; s_id < Source.Length; s_id++) { command.Sim = new Direct_Sound(Source[s_id], Map[s_id], PScene, new int[8] { 0, 1, 2, 3, 4, 5, 6, 7 }); Rhino.RhinoApp.RunScript("Run_Simulation", false); Direct_Sound Direct_Data; if (command.CommandResult != Rhino.Commands.Result.Cancel) { Direct_Data = ((Direct_Sound)command.Sim); } else { Array.Resize(ref Source, s_id); Array.Resize(ref Map, s_id); command.Reset(); Calculate.Enabled = true; break; } command.Reset(); command.Sim = new SplitRayTracer(Source[s_id], Map[s_id], Flex_Scene, CutOffLength(), (int)RT_Count.Value, 0); Rhino.RhinoApp.RunScript("Run_Simulation", false); if (command.CommandResult == Rhino.Commands.Result.Success) { Map[s_id] = (PachMapReceiver)((SplitRayTracer)command.Sim).GetReceiver; } else { Array.Resize(ref Source, s_id); Array.Resize(ref Map, s_id); command.Reset(); Calculate.Enabled = true; break; } command.Reset(); Map[s_id].AddDirect(Direct_Data, Source[s_id]); } if (Source != null) { foreach (Source S in Source) { SourceList.Items.Add(String.Format("S{0}-", S.Source_ID()) + S.Type()); } if (SavePath != null) { Utilities.FileIO.Write_pachm(SavePath, ref Map); } } if (Map != null) { Create_Map(false); } Rhino.RhinoApp.WriteLine("Calculation has been completed. Have a nice day!"); /////// //for(int i = 0;i < 10000; i++) Rhino.RhinoDoc.ActiveDoc.Objects.AddPoint(((Source[0] as LineSource).D as LineSource.ANCON).Pt[i]); /////// Calculate.Enabled = true; }
protected override Rhino.Commands.Result RunCommand(RhinoDoc doc, Rhino.Commands.RunMode mode) { //List<Rhino.DocObjects.RhinoObject> ObjectList = new List<Rhino.DocObjects.RhinoObject>(); Rhino.DocObjects.ObjectEnumeratorSettings settings = new Rhino.DocObjects.ObjectEnumeratorSettings(); settings.DeletedObjects = false; settings.HiddenObjects = false; settings.LockedObjects = true; settings.NormalObjects = true; settings.VisibleFilter = true; settings.ObjectTypeFilter = Rhino.DocObjects.ObjectType.Brep & Rhino.DocObjects.ObjectType.Surface & Rhino.DocObjects.ObjectType.Extrusion; List<Rhino.DocObjects.RhinoObject> RC_List = new List<Rhino.DocObjects.RhinoObject>(); foreach (Rhino.DocObjects.RhinoObject RHobj in Rhino.RhinoDoc.ActiveDoc.Objects.GetObjectList(settings)) { if (RHobj.ObjectType == Rhino.DocObjects.ObjectType.Brep || RHobj.ObjectType == Rhino.DocObjects.ObjectType.Surface || RHobj.ObjectType == Rhino.DocObjects.ObjectType.Extrusion) { RC_List.Add(RHobj); } } if (RC_List.Count != 0) { Ret_NURBS_Scene = new RhCommon_Scene(RC_List, Air_Temp, Rel_Humidity, Atm_pressure, Atten_Choice, Edge_Freq, false); if (!Ret_NURBS_Scene.Valid) return Rhino.Commands.Result.Failure; Ret_Mesh_Scene = new Polygon_Scene(RC_List, Air_Temp, Rel_Humidity, Atm_pressure, Atten_Choice, Edge_Freq, false); if (!Ret_Mesh_Scene.Valid) return Rhino.Commands.Result.Failure; } C_Result = Rhino.Commands.Result.Success; return Rhino.Commands.Result.Success; }
public ImageSourceData(Source Source, Receiver_Bank Receiver, Direct_Sound Direct, Polygon_Scene Rm, int MaxOrder_in, bool ED, int SourceID_in) : this(Source, Receiver, Direct, Rm, new int[2] { 0, 7 }, MaxOrder_in, ED, SourceID_in) { }
private void CalculateScattering_Click(object sender, EventArgs e) { Chosenfreq = 0; double radius = (double)ScatteringRadius.Value; double t = 4 * (radius + (double)Sample_Depth.Value) / C_Sound() * 1000; if (LabCenter == null) { return; } Polygon_Scene Rm = PachTools.Get_Poly_Scene((double)Rel_Humidity.Value, (double)Air_Temp.Value, (double)Air_Pressure.Value, Atten_Method.SelectedIndex, EdgeFreq.Checked); Empty_Scene Rm_Ctrl = new Empty_Scene((double)Air_Temp.Value, (double)Rel_Humidity.Value, (double)Air_Pressure.Value, Atten_Method.SelectedIndex, EdgeFreq.Checked, true, Rm.Min(), Rm.Max()); Rm_Ctrl.PointsInScene(new List <Hare.Geometry.Point> { Rm.Min(), Rm.Max() }); Rm_Ctrl.partition(); if (!Rm.Complete && Rm_Ctrl.Complete) { return; } Rhino.Geometry.Point3d ArrayCenter = new Rhino.Geometry.Point3d(LabCenter.X, LabCenter.Y, LabCenter.Z + (double)Sample_Depth.Value); Rhino.Geometry.Point3d[] Src = new Rhino.Geometry.Point3d[1] { new Rhino.Geometry.Point3d(LabCenter.X, LabCenter.Y, LabCenter.Z + radius + (double)Sample_Depth.Value) }; List <Rhino.Geometry.Point3d> Rec = new List <Rhino.Geometry.Point3d>(); for (int phi = 0; phi < 18; phi++) { for (int theta = 0; theta < 36; theta++) { double anglePhi = phi * Math.PI / 18; double angleTheta = theta * Utilities.Numerics.PiX2 / 36; Rec.Add(ArrayCenter + radius * new Rhino.Geometry.Point3d(Math.Cos(angleTheta) * Math.Cos(anglePhi), Math.Sin(angleTheta) * Math.Cos(anglePhi), Math.Sin(anglePhi))); } } //for (int phi = 0; phi < 18; phi++) // { // double anglePhi = phi * Math.PI / 18; // Rec.Add(ArrayCenter + radius * new Rhino.Geometry.Point3d(Math.Cos(anglePhi), 0, Math.Sin(anglePhi))); // } double fs = 62.5 * Utilities.Numerics.rt2 * Math.Pow(2, Scatter_Extent.SelectedIndex); Numeric.TimeDomain.Microphone_Compact Mic = new Numeric.TimeDomain.Microphone_Compact(Rec.ToArray()); Numeric.TimeDomain.Signal_Driver_Compact SD = new Numeric.TimeDomain.Signal_Driver_Compact(Numeric.TimeDomain.Signal_Driver_Compact.Signal_Type.Sine_Pulse, fs, 1, Src); Numeric.TimeDomain.Acoustic_Compact_FDTD FDTDS = new Numeric.TimeDomain.Acoustic_Compact_FDTD(Rm, ref SD, ref Mic, fs, t, Numeric.TimeDomain.Acoustic_Compact_FDTD.GridType.ScatteringLab, Utilities.PachTools.RPttoHPt(LabCenter), radius * 2, radius * 2, radius * 1.2 + (double)Sample_Depth.Value); FDTDS.RuntoCompletion(); Numeric.TimeDomain.Microphone_Compact Micf = new Numeric.TimeDomain.Microphone_Compact(Rec.ToArray()); Numeric.TimeDomain.Signal_Driver_Compact SDf = new Numeric.TimeDomain.Signal_Driver_Compact(Numeric.TimeDomain.Signal_Driver_Compact.Signal_Type.Sine_Pulse, fs, 1, Src); Numeric.TimeDomain.Acoustic_Compact_FDTD FDTDF = new Numeric.TimeDomain.Acoustic_Compact_FDTD(Rm_Ctrl, ref SDf, ref Micf, fs, t, Numeric.TimeDomain.Acoustic_Compact_FDTD.GridType.ScatteringLab, Utilities.PachTools.RPttoHPt(LabCenter) + new Hare.Geometry.Point(0, 0, (double)Sample_Depth.Value), radius * 2, radius * 2, radius * 1.2 + (double)Sample_Depth.Value); FDTDF.RuntoCompletion(); samplefrequency = FDTDS.SampleFrequency; Mic.reset(); result_signals = Mic.Recordings[0]; Micf.reset(); result_signals = Micf.Recordings[0]; //Calculate Scattering Coefficients double[][] TimeS = Mic.Recordings[0]; double[][] TimeF = Micf.Recordings[0]; System.Numerics.Complex[][] FS = new System.Numerics.Complex[TimeS.Length][]; System.Numerics.Complex[][] FF = new System.Numerics.Complex[TimeS.Length][]; for (int i = 0; i < TimeS.Length; i++) { FS[i] = Audio.Pach_SP.FFT_General(TimeS[i], 0); FF[i] = Audio.Pach_SP.FFT_General(TimeF[i], 0); } Scattering = new double[FS[0].Length]; for (int i = 0; i < FS[0].Length; i++) { System.Numerics.Complex sumFS2 = 0; System.Numerics.Complex sumFF2 = 0; System.Numerics.Complex sumFSFF = 0; for (int j = 0; j < FS.Length; j++) { sumFS2 += System.Numerics.Complex.Pow(FS[j][i].Magnitude, 2); sumFF2 += System.Numerics.Complex.Pow(FF[j][i].Magnitude, 2); sumFSFF += FS[j][i] * System.Numerics.Complex.Conjugate(FF[j][i]); //sumFS2 += System.Numerics.Complex.Pow(FS[j][i], 2); //sumFF2 += System.Numerics.Complex.Pow(FF[j][i], 2); //sumFSFF += FS[j][i] * System.Numerics.Complex.Conjugate(FF[j][i]); } System.Numerics.Complex sumReflected = sumFSFF / sumFF2; System.Numerics.Complex Ratio = sumFF2 / sumFS2; Scattering[i] = 1 - System.Numerics.Complex.Abs(sumReflected * sumReflected * Ratio); } Update_Scattering_Graph(null, null); }