using AsbCloudApp.Data; using AsbCloudApp.Repositories; using AsbCloudApp.Services; using System; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; namespace AsbCloudInfrastructure.Services.Trajectory { public class TrajectoryVisualizationService : ITrajectoryVisualizationService { private readonly IPlannedTrajectoryRepository plannedRepository; private readonly IActualTrajectoryRepository factualRepository; public TrajectoryVisualizationService(IPlannedTrajectoryRepository plannedRepository, IActualTrajectoryRepository factualRepository) { this.plannedRepository = plannedRepository; this.factualRepository = factualRepository; } /// /// Получение плановой и фактической траектории по скважине /// /// ключ скважины /// /// public async Task>> GetTrajectoryAsync(int idWell, CancellationToken token) { var result = new PlanFactBase>(); var geoPlanCoordinates = await plannedRepository.GetTrajectoryAsync(idWell, token); var geoFactCoordinates = await factualRepository.GetTrajectoryAsync(idWell, token); result.Plan = GetTrajectoryVisualisation(geoPlanCoordinates); result.Fact = GetTrajectoryVisualisation(geoFactCoordinates); return result; } /// /// Формирует список координат для визуализации трактории 3D /// /// /// private List GetTrajectoryVisualisation(TrajectoryDto[] geoCoordinates) { var cartesianCoordinates = new List(geoCoordinates.Length) { new (), }; for (var i = 1; i < geoCoordinates.Length; i++) { var intervalGeoParams = geoCoordinates[i - 1]; var deltaWellLength = geoCoordinates[i].WellboreDepth - intervalGeoParams.WellboreDepth; var projectionLengthToXYSurface = deltaWellLength * Math.Sin(intervalGeoParams.ZenithAngle * Math.PI / 180); var dz = deltaWellLength * Math.Cos(intervalGeoParams.ZenithAngle * Math.PI / 180); var dx = projectionLengthToXYSurface * Math.Sin(intervalGeoParams.AzimuthGeo * Math.PI / 180); var dy = projectionLengthToXYSurface * Math.Cos(intervalGeoParams.AzimuthGeo * Math.PI / 180); var preCoordinates = cartesianCoordinates[i - 1]; var coordinates = new TrajectoryVisualizationDto { Z = preCoordinates.Z + dz, X = preCoordinates.X + dx, Y = preCoordinates.Y + dy, }; cartesianCoordinates.Add(coordinates); } return cartesianCoordinates; } } }