forked from ddrilling/AsbCloudServer
63 lines
2.3 KiB
C#
63 lines
2.3 KiB
C#
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<IEnumerable<TrajectoryVisualizationDto>> GetTrajectoryAsync(int idWell, CancellationToken token)
|
|
{
|
|
var result = new List<TrajectoryVisualizationDto>();
|
|
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(data.AzimuthGeo, flat, prevCoordinates.X);
|
|
var y = prevCoordinates.Y = GetY(data.AzimuthGeo, flat, prevCoordinates.X);
|
|
var z = prevCoordinates.Z = GetZ(data.WellboreDepth, prevData.WellboreDepth, data.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);
|
|
}
|
|
}
|