using AsbCloudApp.Data; using AsbCloudApp.Repositories; using AsbCloudApp.Services; using System; using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; namespace AsbCloudInfrastructure.Services { public class TrajectoryVisualizationService : ITrajectoryVisualizationService { private readonly IPlannedTrajectoryRepository repository; public TrajectoryVisualizationService(IPlannedTrajectoryRepository repository) { this.repository = repository; } public async Task> GetTrajectoryAsync(int idWell, CancellationToken token) { var result = new List { new () }; var dtos = (await repository.GetAsync(idWell, token)).ToArray(); var prevData = dtos[0]; var prevCoordinates = new TrajectoryVisualizationDto(); for (var i = 1; i < dtos.Length; i++) { var data = dtos[i]; var flat = GetFlat(data.WellboreDepth, prevData.WellboreDepth, prevData.ZenithAngle); var x = prevCoordinates.X = GetX(prevData.AzimuthGeo, flat, prevCoordinates.X); var y = prevCoordinates.Y = GetY(prevData.AzimuthGeo, flat, prevCoordinates.X); var z = prevCoordinates.Z = GetZ(data.WellboreDepth, prevData.WellboreDepth, prevData.ZenithAngle, prevCoordinates.Z); prevData = data; var coordinates = new TrajectoryVisualizationDto { X = x, Y = y, Z = z }; result.Add(coordinates); } return result; } private double GetFlat(double depthEnd, double depthStart, double zenit) => (depthEnd - depthStart) * Math.Sin(zenit * Math.PI / 180); private double GetX(double azimuth, double flat, double prev) => prev + flat * Math.Sin(azimuth * Math.PI / 180); private double GetY(double azimuth, double flat, double prev) => prev + flat * Math.Cos(azimuth * Math.PI / 180); private double GetZ(double depthEnd, double depthStart, double zenit, double prev) => prev + (depthEnd - depthStart) * Math.Cos(zenit * Math.PI / 180); } }