using StructureHelperCommon.Models.Calculators; using StructureHelperCommon.Models.Shapes; //Copyright (c) 2023 Redikultsev Evgeny, Ekaterinburg, Russia //All rights reserved. namespace StructureHelperLogics.NdmCalculations.Analyses.ByForces { public class LimitCurveLogic : ILimitCurveLogic { private FindParameterResult result; private List resultList; private IPoint2D currentPoint; private ILimitCurveParameterLogic parameterLogic; public Predicate LimitPredicate { get; set; } public Action ActionToOutputResults { get; set; } public LimitCurveLogic(ILimitCurveParameterLogic parameterLogic) { this.parameterLogic = parameterLogic; } public LimitCurveLogic(Predicate limitPredicate) : this (new LimitCurveParameterLogic(limitPredicate)) { LimitPredicate = limitPredicate; } /// public List GetPoints(IEnumerable points) { result = new(); resultList = new(); if (LimitPredicate(new Point2D()) == true) { var range = points.Select(point => new Point2D { X = point.X * 0d, Y = point.Y * 0d }).ToList(); resultList.AddRange(range); return resultList; } //MultyProcessPoints(points); MonoProcessPoints(points); return resultList; } private void MultyProcessPoints(IEnumerable points) { Task[] tasks = new Task[points.Count()]; for (int i = 0; i < points.Count(); i++) { var point = points.ToList()[i]; tasks[i] = new Task(() => FindResultPoint(point)); tasks[i].Start(); } Task.WaitAll(tasks); for (int j = 0; j < points.Count(); j++) { var taskResult = tasks[j].Result; resultList.Add(taskResult); result.IterationNumber = resultList.Count; ActionToOutputResults?.Invoke(result); } } private void MonoProcessPoints(IEnumerable points) { foreach (var point in points) { FindParameter(point); } } private void FindParameter(IPoint2D point) { IPoint2D resultPoint = FindResultPoint(point); resultList.Add(resultPoint); result.IterationNumber = resultList.Count; ActionToOutputResults?.Invoke(result); } private Point2D FindResultPoint(IPoint2D point) { double parameter; currentPoint = point.Clone() as IPoint2D; parameterLogic.CurrentPoint = currentPoint; if (LimitPredicate(point) == false) { parameter = 1d; } else { parameter = parameterLogic.GetParameter(); } var resultPoint = new Point2D() { X = currentPoint.X * parameter, Y = currentPoint.Y * parameter }; return resultPoint; } } }