From 408b0723896db49e9dd2ec28f3b63dc8bb839926 Mon Sep 17 00:00:00 2001 From: Nikita Romanenko Date: Sun, 19 May 2019 02:04:14 +0300 Subject: [PATCH] done = improved normal spread; was inverted pore inspection direction; some stability imrpovements --- Pores/Bootstrap.cs | 16 +- Pores/MODELING-DEF-DES-MI-VI.csproj | 1 + Pores/Models/Spreads/ImprovedNormalSpread.cs | 37 ++++ .../ModelCreationUnit/ModelCreationView.xaml | 10 +- .../PoreInspectionView.xaml | 64 ++++--- .../PoreInspectionViewModel.cs | 181 ++++++++++-------- 6 files changed, 199 insertions(+), 110 deletions(-) create mode 100644 Pores/Models/Spreads/ImprovedNormalSpread.cs diff --git a/Pores/Bootstrap.cs b/Pores/Bootstrap.cs index 91f2b8d..d203d01 100644 --- a/Pores/Bootstrap.cs +++ b/Pores/Bootstrap.cs @@ -16,13 +16,27 @@ namespace MODELING_DEF_DES_MI_VI { ContainerBuilder build = new ContainerBuilder(); + var camera = new Camera2D() + { + Speed = 1.0, + CutDepth = 10.0, + DepthVisibility = 2.0, + Scale = 40, + StartPosition = new Point2D(0 * 40, 0 * 40), + }; + + build + .RegisterInstance(camera) + .AsSelf() + .SingleInstance(); + build .Register(c => new MaterialModel()) .As() .SingleInstance(); build - .Register(c => new ObservableCollection() { new NormalSpread(c.Resolve()) }) + .Register(c => new ObservableCollection() { new NormalSpread(c.Resolve()), new ImprovedNormalSpread(c.Resolve()) }) .As>() .SingleInstance(); diff --git a/Pores/MODELING-DEF-DES-MI-VI.csproj b/Pores/MODELING-DEF-DES-MI-VI.csproj index 8491d69..b09a793 100644 --- a/Pores/MODELING-DEF-DES-MI-VI.csproj +++ b/Pores/MODELING-DEF-DES-MI-VI.csproj @@ -100,6 +100,7 @@ + diff --git a/Pores/Models/Spreads/ImprovedNormalSpread.cs b/Pores/Models/Spreads/ImprovedNormalSpread.cs new file mode 100644 index 0000000..2af9afd --- /dev/null +++ b/Pores/Models/Spreads/ImprovedNormalSpread.cs @@ -0,0 +1,37 @@ +using System; +using System.Collections.Generic; +using System.Linq; + +namespace MODELING_DEF_DES_MI_VI.Models.Spreads +{ + public class ImprovedNormalSpread : BaseSpread + { + public MaterialModel Material { get; set; } + public NormalSpread NormalSpread { get; set; } + public override IList GetSpread() + { + var r = new Random(); + var pores = NormalSpread.GetSpread(); + pores.ToList().ForEach(p => + { + p.Point.X = p.Point.X + r.NextDouble() * 2 - 1; + p.Point.Y = p.Point.Y + r.NextDouble() * 2 - 1; + p.Point.Z = p.Point.Z + r.NextDouble() * 2 - 1; + }); + return pores; + } + + public override void LoadRecommendParams() + { + NormalSpread.LoadRecommendParams(); + } + + public ImprovedNormalSpread(MaterialModel material) + { + NormalSpread = new NormalSpread(material); + Material = material; + } + public override string ToString() + => "Улучшенное нормальное распределение"; + } +} diff --git a/Pores/Modules/ModelCreationUnit/ModelCreationView.xaml b/Pores/Modules/ModelCreationUnit/ModelCreationView.xaml index a2c1eac..e2e35bc 100644 --- a/Pores/Modules/ModelCreationUnit/ModelCreationView.xaml +++ b/Pores/Modules/ModelCreationUnit/ModelCreationView.xaml @@ -40,7 +40,7 @@ - + @@ -68,6 +68,14 @@ + + + + + + + + diff --git a/Pores/Modules/PoreInspectionUnit/PoreInspectionView.xaml b/Pores/Modules/PoreInspectionUnit/PoreInspectionView.xaml index b44fd03..9551548 100644 --- a/Pores/Modules/PoreInspectionUnit/PoreInspectionView.xaml +++ b/Pores/Modules/PoreInspectionUnit/PoreInspectionView.xaml @@ -27,31 +27,43 @@ - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Pores/Modules/PoreInspectionUnit/PoreInspectionViewModel.cs b/Pores/Modules/PoreInspectionUnit/PoreInspectionViewModel.cs index f1256d9..e93a7f2 100644 --- a/Pores/Modules/PoreInspectionUnit/PoreInspectionViewModel.cs +++ b/Pores/Modules/PoreInspectionUnit/PoreInspectionViewModel.cs @@ -16,48 +16,48 @@ namespace MODELING_DEF_DES_MI_VI.Modules.PoreInspectionUnit public class PoreInspectionViewModel : PropertyChangedClass { public MaterialModel GlobalMaterial { get; set; } - public ObservableCollection Ellipses { get; set; } = new ObservableCollection(); + public List Ellipses { get; set; } = new List(); public Camera2D Camera { get; set; } - private CancellationTokenSource ctSource { get; set; } + private bool IsCanceled { get; set; } + private bool IsBusy { get; set; } - public PoreInspectionViewModel(MaterialModel material) + public PoreInspectionViewModel(MaterialModel material, Camera2D camera) { GlobalMaterial = material; - Camera = new Camera2D() - { - Speed = 1.0, - CutDepth = 1.0, - DepthVisibility = 2.0, - Scale = 40, - StartPosition = new Point2D(0 * 40, 0 * 40), - }; + Camera = camera; Application.Current.MainWindow.KeyDown += OnKeyDown; } public async Task UpdateModel() { - await Task.Run(() => + await Task.Run(async () => { try { - ctSource = new CancellationTokenSource(); - Application.Current.Dispatcher.Invoke(() => + while (IsBusy) await Task.Delay(40); + IsBusy = true; + IsCanceled = false; + await Application.Current.Dispatcher.Invoke(async () => { - List bufferedShapes = new List(); + List bufferedShapes = new List(); bufferedShapes.Add(CreateMaterial()); - var visibilityRange = Tuple.Create(Camera.CutDepth / Camera.Scale, (Camera.DepthVisibility + Camera.CutDepth) / Camera.Scale); + var visibilityRange = + Tuple.Create( + (Camera.CutDepth + Camera.DepthVisibility) / Camera.Scale, + (Camera.CutDepth - Camera.DepthVisibility) / Camera.Scale); foreach (Pore pore in GlobalMaterial.Pores) { - if (ctSource.IsCancellationRequested) + if (IsCanceled) return; - if (visibilityRange.Item1 < pore.Point.Z && pore.Point.Z < visibilityRange.Item2) + if (visibilityRange.Item2 < pore.Point.Z && pore.Point.Z < visibilityRange.Item1) bufferedShapes.Add(CreateEllipse(pore)); } - Ellipses.Clear(); - bufferedShapes.ForEach(s => Ellipses.Add(s)); + Ellipses = bufferedShapes; + await Task.Delay(20); + IsBusy = false; }); } catch (Exception e) @@ -70,21 +70,27 @@ namespace MODELING_DEF_DES_MI_VI.Modules.PoreInspectionUnit private Ellipse CreateEllipse(Pore pore) { var e = new Ellipse(); - var cuttingHeight = Math.Abs(pore.Point.Z * Camera.Scale - Camera.CutDepth); - if (cuttingHeight < pore.Radius * Camera.Scale) + var scaledPoreRadius = pore.Radius * Camera.Scale; + var distanceFromCameraToPore = Camera.CutDepth - pore.Point.Z * Camera.Scale; + var cuttingHeight = Math.Abs(distanceFromCameraToPore); + if (cuttingHeight < scaledPoreRadius) { e.Fill = Brushes.Violet; - var cuttedDiameter = Math.Sqrt(Math.Pow(pore.Radius * Camera.Scale, 2) - Math.Pow(cuttingHeight, 2)) * 2; + var cuttedDiameter = Math.Sqrt(Math.Pow(scaledPoreRadius, 2) - Math.Pow(cuttingHeight, 2)) * 2; e.Width = cuttedDiameter; e.Height = cuttedDiameter; } - else + else if (pore.Point.Z < Camera.CutDepth / Camera.Scale) { e.Opacity = 0.5; - byte colorDegree = Convert.ToByte(pore.Point.Z * Camera.Scale / (Camera.DepthVisibility + Camera.CutDepth) * 255); + byte colorDegree = Convert.ToByte((1 - distanceFromCameraToPore / Camera.DepthVisibility) * 255); e.Fill = new SolidColorBrush(Color.FromRgb(colorDegree, colorDegree, colorDegree)); - e.Width = pore.Radius * 2 * Camera.Scale; - e.Height = pore.Radius * 2 * Camera.Scale; + e.Width = scaledPoreRadius * 2; + e.Height = scaledPoreRadius * 2; + } + else + { + e.Opacity = 0; } var x = Camera.Scale * pore.Point.X + Camera.StartPosition.X - e.Width / 2; @@ -109,62 +115,73 @@ namespace MODELING_DEF_DES_MI_VI.Modules.PoreInspectionUnit private void OnKeyDown(object sender, KeyEventArgs e) { - switch (e.Key) - { - case Key.A: - ctSource.Cancel(); - Camera.StartPosition.X -= Camera.Speed; - UpdateModel(); - break; - case Key.D: - ctSource.Cancel(); - Camera.StartPosition.X += Camera.Speed; - UpdateModel(); - break; - case Key.W: - ctSource.Cancel(); - Camera.StartPosition.Y -= Camera.Speed; - UpdateModel(); - break; - case Key.S: - ctSource.Cancel(); - Camera.StartPosition.Y += Camera.Speed; - UpdateModel(); - break; - case Key.OemMinus: - ctSource.Cancel(); - Camera.Scale /= 2; - UpdateModel(); - break; - case Key.OemPlus: - ctSource.Cancel(); - Camera.Scale *= 2; - UpdateModel(); - break; - case Key.R: - ctSource.Cancel(); - Camera.CutDepth += Camera.Speed; - UpdateModel(); - break; - case Key.F: - ctSource.Cancel(); - Camera.CutDepth -= Camera.Speed; - UpdateModel(); - break; - case Key.D9: - if (Camera.Speed > 1) - { - ctSource.Cancel(); - Camera.Speed--; + if (!IsBusy) + switch (e.Key) + { + case Key.A: + IsCanceled = true; + Camera.StartPosition.X -= Camera.Speed; UpdateModel(); - } - break; - case Key.D0: - ctSource.Cancel(); - Camera.Speed++; - UpdateModel(); - break; - } + break; + case Key.D: + IsCanceled = true; + Camera.StartPosition.X += Camera.Speed; + UpdateModel(); + break; + case Key.W: + IsCanceled = true; + Camera.StartPosition.Y -= Camera.Speed; + UpdateModel(); + break; + case Key.S: + IsCanceled = true; + Camera.StartPosition.Y += Camera.Speed; + UpdateModel(); + break; + case Key.OemMinus: + IsCanceled = true; + Camera.Scale /= 2; + UpdateModel(); + break; + case Key.OemPlus: + IsCanceled = true; + Camera.Scale *= 2; + UpdateModel(); + break; + case Key.R: + IsCanceled = true; + Camera.CutDepth += Camera.Speed; + UpdateModel(); + break; + case Key.F: + IsCanceled = true; + Camera.CutDepth -= Camera.Speed; + UpdateModel(); + break; + case Key.D9: + if (Camera.Speed > 1) + { + IsCanceled = true; + Camera.Speed--; + UpdateModel(); + } + break; + case Key.D0: + IsCanceled = true; + Camera.Speed++; + UpdateModel(); + break; + case Key.T: + IsCanceled = true; + Camera.DepthVisibility -= Camera.Speed; + UpdateModel(); + break; + case Key.G: + IsCanceled = true; + Camera.DepthVisibility += Camera.Speed; + UpdateModel(); + break; + } } } }