private void SetPlateAngle(ProbeRotationGeometrySetting setting)
        {
            var angle    = setting.PlateAngle;
            var geometry = setting.Geometry;
            var rotation = new Rotation(Vector.Up, angle / -180 * Math.PI);
            var plate    = geometry.Plate;

            geometry.Plate = new Plate(plate.ID, plate.Position, rotation.Rotate(plate.HorizontalVector), rotation.Rotate(plate.VerticalVector), plate.ReflectionPattern, plate.ReflectionCoefficient);
        }
        private ProbeRotationGeometrySetting GetSetting()
        {
            var setting = new ProbeRotationGeometrySetting();

            setting.Geometry          = GetGeometry();
            setting.ProbeDistance     = Math.Round(ProbeDistanceUpDown.Value.Value, 2);
            setting.MinimumAngle      = Math.Round(MinimumAngleUpDown.Value.Value, 2);
            setting.MaximumAngle      = Math.Round(MaximumAngleUpDown.Value.Value, 2);
            setting.AngleInterval     = Math.Round(AngleIntervalUpDown.Value.Value, 2);
            setting.SimulationCount   = SimulationCountUpDown.Value.Value;
            setting.PlateAngle        = PlateAngleUpDown.Value.Value;
            setting.ReflectionPattern = ReflectionPatternSelector.ReflectionPattern;
            return(setting);
        }
Esempio n. 3
0
        public ProbeRotationGeometrySimulationResult(List <DataPoint> dataPoints, ProbeRotationGeometrySetting setting)
        {
            DataPoints            = dataPoints;
            HorizontalAxisMinimum = DataPoints.Min(p => p.Angle);
            Setting = setting;

            var builder = new StringBuilder();

            builder.Append("板:");
            builder.Append((Setting.Geometry.Plate.HorizontalVector.Length * 2).ToString("0.0"));
            builder.Append("×");
            builder.Append((Setting.Geometry.Plate.VerticalVector.Length * 2).ToString("0.0"));
            builder.Append(", 反射パターン:");
            builder.Append(Extensions.ToString(Setting.ReflectionPattern));
            builder.Append(", 最大入射数:");
            builder.Append(DataPoints.Max(point => point.Count));
            builder.Append("/");
            builder.Append(Setting.SimulationCount);
            Discription = builder.ToString();
        }
        private void SetProbeAngle(ProbeRotationGeometrySetting setting, double angle)
        {
            var geometry     = setting.Geometry;
            var rotation     = new Rotation(Vector.Up, angle / -180 * Math.PI);
            var plate_nozzle = (geometry.Nozzle.Position - geometry.Plate.Position).Normal;
            var position     = rotation.Rotate(plate_nozzle * setting.ProbeDistance);
            var normal       = rotation.Rotate(plate_nozzle).Normal;

            geometry.Probe = new Shield(geometry.Probe.ID, position, normal, geometry.Probe.Radius, Atom.ReflectionPattern.Specularly, geometry.Probe.ReflectionCoefficient);

            var gap_h = rotation.Rotate(new Vector(1, 0, 0));
            var gap_v = new Vector(0, 1, 0);
            var gap1  = new Vector(0, 0, 0) + gap_h * 0;
            var gap2  = new Vector(0, 0, 0) + gap_h * 0.3;
            var slit1 = geometry.Slit1;

            geometry.Slit1 = new Hole(slit1.ID, position - 15 * rotation.Rotate(plate_nozzle) + gap1, normal, 1, Atom.ReflectionPattern.Specularly, 0);
            var slit2 = geometry.Slit2;

            geometry.Slit2 = new Hole(slit2.ID, position - 20 * rotation.Rotate(plate_nozzle) + gap2, normal, 1, Atom.ReflectionPattern.Specularly, 0);
        }
        private List <SimulationResults.ProbeRotationGeometrySimulationResult.DataPoint> Simulate(ProbeRotationGeometrySetting setting, CancellationToken token)
        {
            SetPlateAngle(setting);
            int progressMaximum = (int)Math.Round((setting.MaximumAngle - setting.MinimumAngle) / setting.AngleInterval + 1);
            int progress        = 0;

            //プログレスバー初期化
            ShowProgress(progress, progressMaximum);

            var geometry = setting.Geometry;
            var list     = new List <SimulationResults.ProbeRotationGeometrySimulationResult.DataPoint>();

            for (var angle = setting.MinimumAngle; angle <= setting.MaximumAngle; angle += setting.AngleInterval)
            {
                if (token.IsCancellationRequested)
                {
                    Dispatcher.Invoke(() =>
                    {
                        ProgressLabel.Content = "進捗:中断";
                        System.Windows.Forms.Application.DoEvents();
                    });
                    return(list);
                }

                SetProbeAngle(setting, angle);
                var atoms = geometry.ProcessAsParallel(setting.SimulationCount);
                list.Add(new SimulationResults.ProbeRotationGeometrySimulationResult.DataPoint(angle, atoms.Count(atom => atom.IsValid), atoms.Count(atom => atom.IsValid && atom.History == 0)));

                ShowProgress(++progress, progressMaximum);
            }

            return(list);
        }