private async void CalculatEngineNoiseMenuItem_Click() { dataGridView1.Scroll -= Grid_Scroll; dataGridView2.Scroll -= Grid_Scroll; dataGridView3.Scroll -= Grid_Scroll; var CalculateArgs = new CalculateEngineNoiseEventArgs(); await Task.Run(() => CalculateEngineNoise(CalculateArgs)); dataGridView4.Rows[0].Cells[1].Value = FormatConvert.ToString(CalculateArgs.FlowSoundParameters.MechanicalPower * 1E-6); dataGridView4.Rows[1].Cells[1].Value = FormatConvert.ToString(CalculateArgs.FlowSoundParameters.SoundPower * 1E-6); dataGridView4.Rows[2].Cells[1].Value = FormatConvert.ToString(CalculateArgs.FlowSoundParameters.SoundPowerRatio); dataGridView4.Rows[3].Cells[1].Value = FormatConvert.ToString(CalculateArgs.FlowSoundParameters.SoundMaximalPowerConeHalfAngle); dataGridView4.Rows[4].Cells[1].Value = FormatConvert.ToString(CalculateArgs.FlowSoundParameters.UndisturbedSupersonicFlowLength); dataGridView4.Rows[5].Cells[1].Value = FormatConvert.ToString(CalculateArgs.FlowSoundParameters.DistanceToPointOfMaximalSoundLevel); dataGridView4.Rows[6].Cells[1].Value = FormatConvert.ToString(CalculateArgs.FlowSoundParameters.SupersonicFlowLength); dataGridView4.Rows[7].Cells[1].Value = FormatConvert.ToString(CalculateArgs.FlowSoundParameters._98ProzentSoundPowerRadiatingFlowLength); dataGridView4.Rows[8].Cells[1].Value = FormatConvert.ToString(CalculateArgs.FlowSoundParameters.DistanceToPointOfFlowDestruction); EngineFrequencyGrid.Rows.Clear(); EngineFrequencyGrid.Rows.Add(CalculateArgs.FrequencyCharacteristik.Keys.Count); int i = 0; foreach (var FrequencyCharacteristik in CalculateArgs.FrequencyCharacteristik) { EngineFrequencyGrid.Rows[i].Cells[0].Value = FormatConvert.ToString(FrequencyCharacteristik.Key); EngineFrequencyGrid.Rows[i].Cells[1].Value = FormatConvert.ToString(FrequencyCharacteristik.Value); i++; } EngineFrequencyGraphPane.CurveList.Clear(); EngineFrequencyGraphPane.AddCurve( "", CalculateArgs.FrequencyCharacteristik.Select(x => x.Key).ToArray(), CalculateArgs.FrequencyCharacteristik.Select(x => x.Value).ToArray(), Color.Black, SymbolType.None); EngineFrequencyGraphPane.AxisChange(); zedGraphControl3.Invalidate(); RadiationPatternGrid.Rows.Clear(); RadiationPatternGrid.Rows.Add(CalculateArgs.RadiationPattern.Keys.Count); i = 0; foreach (var RadiationPattern in CalculateArgs.RadiationPattern) { RadiationPatternGrid.Rows[i].Cells[0].Value = FormatConvert.ToString(RadiationPattern.Key); RadiationPatternGrid.Rows[i].Cells[1].Value = FormatConvert.ToString(RadiationPattern.Value); i++; } RadiationPatternGraphPane.CurveList.Clear(); RadiationPatternGraphPane.AddCurve( "", CalculateArgs.RadiationPattern.Select(x => x.Key).ToArray(), CalculateArgs.RadiationPattern.Select(x => x.Value).ToArray(), Color.Black, SymbolType.None); RadiationPatternGraphPane.AxisChange(); zedGraphControl4.Invalidate(); EngineAcousticsLoadGrid.Rows.Clear(); EngineAcousticsLoadGrid.Rows.Add(CalculateArgs.EngineAcousticsLoadAtFrequency.Keys.Count); i = 0; foreach (var EngineAcousticsLoad in CalculateArgs.EngineAcousticsLoadAtFrequency) { EngineAcousticsLoadGrid.Rows[i].Cells[0].Value = FormatConvert.ToString(EngineAcousticsLoad.Key); EngineAcousticsLoadGrid.Rows[i].Cells[1].Value = FormatConvert.ToString(EngineAcousticsLoad.Value); i++; } textBox32.Text = FormatConvert.ToString(CalculateArgs.EngineAcousticsLoadSummary); pictureBox1.Image = CalculateArgs.EngineSoundContour.Contour; Contour = new DoubleInterpolation(CalculateArgs.EngineSoundContour.X, CalculateArgs.EngineSoundContour.Y, CalculateArgs.EngineSoundContour.SoundLevels); dataGridView2.Columns.Clear(); dataGridView3.Columns.Clear(); for (int j = 0; j < CalculateArgs.EngineSoundContour.Y.Length; j++) { dataGridView2.Columns.Add("", ""); dataGridView3.Columns.Add("", ""); } foreach (var column in dataGridView2.Columns.Cast <DataGridViewColumn>()) { column.SortMode = DataGridViewColumnSortMode.NotSortable; } foreach (var column in dataGridView3.Columns.Cast <DataGridViewColumn>()) { column.SortMode = DataGridViewColumnSortMode.NotSortable; } dataGridView2.Rows.Add(); for (int j = 0; j < CalculateArgs.EngineSoundContour.Y.Length; j++) { dataGridView2.Rows[0].Cells[j].Value = FormatConvert.ToString(CalculateArgs.EngineSoundContour.Y[j]); } dataGridView1.Rows.Clear(); dataGridView1.Rows.Add(CalculateArgs.EngineSoundContour.X.Length); for (i = 0; i < CalculateArgs.EngineSoundContour.X.Length; i++) { dataGridView1.Rows[i].Cells[0].Value = FormatConvert.ToString(CalculateArgs.EngineSoundContour.X[i]); dataGridView3.Rows.Add(); for (int j = 0; j < CalculateArgs.EngineSoundContour.Y.Length; j++) { dataGridView3.Rows[i].Cells[j].Value = FormatConvert.ToString(CalculateArgs.EngineSoundContour.SoundLevels[i, j]); } } dataGridView1.Scroll += Grid_Scroll; dataGridView2.Scroll += Grid_Scroll; dataGridView3.Scroll += Grid_Scroll; }
public void ModifyEngineSoundContour( double MinSoundLevel, double MaxSoundLevel, ref EngineSoundContour EngineSoundContour) // см. метод с аналогичной сигнатурой в IModel { int ImageWidth = EngineSoundContour.Contour.Width; int ImageHeight = EngineSoundContour.Contour.Height; double[] X = EngineSoundContour.X; double[] Y = EngineSoundContour.Y; double[,] SoundLevels = EngineSoundContour.SoundLevels; var Contour = new Bitmap(ImageWidth, ImageHeight); using (var g = Graphics.FromImage(Contour)) { int gNx = 300, gNy = 300; double mux = X.Max() / ImageWidth; double muy = Y.Max() / ImageHeight; int dx = ImageWidth / gNx; int dy = ImageHeight / gNy; double Max = SoundLevels[0, 0]; double Min = Max; var Interpolator = new DoubleInterpolation(X, Y, SoundLevels); for (int i = 0; i < SoundLevels.GetLength(0); i++) { for (int j = 0; j < SoundLevels.GetLength(1); j++) { if (SoundLevels[i, j] > Max) { Max = SoundLevels[i, j]; } else if (SoundLevels[i, j] < Min) { Min = SoundLevels[i, j]; } } } var Intervals = new double[] { 0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0 }; var R = new Interpolation(Intervals, new double[] { 0, 0, 0, 0, 0, 0, 124, 203, 255, 255, 255, 255 }); var G = new Interpolation(Intervals, new double[] { 0, 124, 203, 255, 255, 255, 255, 255, 255, 203, 124, 0 }); var B = new Interpolation(Intervals, new double[] { 255, 255, 255, 255, 203, 124, 0, 0, 0, 0, 0, 0 }); Func <double, Color> GetColor = x => { x = (x - MinSoundLevel) / (MaxSoundLevel - MinSoundLevel); return(Color.FromArgb( (int)R.Interpolate(x * 11), (int)G.Interpolate(x * 11), (int)B.Interpolate(x * 11))); }; for (int i = 0; i < gNx; i++) { ProgressChanged((int)(i * 100.0 / gNx)); int x = i * ImageWidth / gNx; for (int j = 0; j < gNy; j++) { int y = j * ImageHeight / gNy; var color = GetColor(Interpolator.Interpolate(x * mux, y * muy)); using (var Brush = new SolidBrush(color)) { g.FillRectangle(Brush, x, y, i * dx, i * dy); } } } } ProgressChanged(100); EngineSoundContour = new EngineSoundContour(X, Y, SoundLevels, Contour); }