From 1790192e06101b780a6e68fead8a9fc14fcb7fe1 Mon Sep 17 00:00:00 2001 From: emelianov Date: Mon, 15 Jun 2026 16:44:51 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D0=BA?= =?UTF-8?q?=D0=B0=20=D0=BD=D0=B0=20=D0=BF=D0=B5=D1=80=D0=B5=D1=81=D0=B5?= =?UTF-8?q?=D1=87=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=9B=D0=92=20=D0=97=D0=B5?= =?UTF-8?q?=D0=BC=D0=BB=D0=B8=20=D0=BF=D1=80=D0=B8=20=D1=80=D0=B0=D1=81?= =?UTF-8?q?=D1=87=D0=B5=D1=82=D0=B5=20=D0=9F=D0=A3=D0=A3=D0=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../angular/AngularMotionService.kt | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/services/pcp-ballistics-service/src/main/kotlin/space/nstart/pcp/pcp_request_service/angular/AngularMotionService.kt b/services/pcp-ballistics-service/src/main/kotlin/space/nstart/pcp/pcp_request_service/angular/AngularMotionService.kt index a32eb7b..b9d224b 100644 --- a/services/pcp-ballistics-service/src/main/kotlin/space/nstart/pcp/pcp_request_service/angular/AngularMotionService.kt +++ b/services/pcp-ballistics-service/src/main/kotlin/space/nstart/pcp/pcp_request_service/angular/AngularMotionService.kt @@ -18,7 +18,10 @@ import space.nstart.pcp.pcp_request_service.service.SatelliteService import space.nstart.pcp.pcp_types_lib.dto.ballistics.AngularMotionCalculationRequestDTO import space.nstart.pcp.pcp_types_lib.dto.ballistics.AngularMotionModeDTO import space.nstart.pcp.pcp_types_lib.dto.ballistics.ExactTimePositionRequestDTO +import space.nstart.pcp.pcp_types_lib.dto.ballistics.ObjDTO +import space.nstart.pcp.pcp_types_lib.dto.ballistics.ObjViewRequestDTO import space.nstart.pcp.pcp_types_lib.dto.ballistics.OrbPointDTO +import space.nstart.pcp.pcp_types_lib.dto.ballistics.PositionDTO import kotlin.math.PI import kotlin.math.abs import kotlin.math.atan @@ -77,6 +80,7 @@ class AngularMotionService( fun calculate(request: AngularMotionCalculationRequestDTO): AngularMotionCalculationResultDTO { validate(request) + validateTargetVisibility(request) val defaultConfig = AngularMotionConfig() val config = AngularMotionConfig( focus = request.focusMm ?: defaultConfig.focus, @@ -146,6 +150,34 @@ class AngularMotionService( } } + private fun validateTargetVisibility(request: AngularMotionCalculationRequestDTO) { + val windowStart = request.approximateTime.minusMinutes(TARGET_VISIBILITY_WINDOW_MINUTES) + val windowStop = request.approximateTime.plusMinutes(TARGET_VISIBILITY_WINDOW_MINUTES) + val visiblePoints = satelliteService.mplPoint( + ObjViewRequestDTO( + satellites = listOf(request.satelliteId), + timeStart = windowStart, + timeStop = windowStop, + obj = ObjDTO( + id = ANGULAR_MOTION_TARGET_ID, + position = PositionDTO( + lat = request.latitudeDeg, + long = request.longitudeDeg, + height = request.heightM, + ), + ), + ), + ).collectList().block().orEmpty() + + if (visiblePoints.isEmpty()) { + throw CustomValidationException( + "Заданная точка не видна КА ${request.satelliteId} в окрестности времени " + + "${request.approximateTime}: ${windowStart} — ${windowStop}. " + + "Выберите другое время, точку или спутник.", + ) + } + } + private fun loadOrbitalPoints( request: AngularMotionCalculationRequestDTO, config: AngularMotionConfig, @@ -198,5 +230,7 @@ class AngularMotionService( private companion object { const val MAP_INTERVAL_MINUTES = 5L + const val TARGET_VISIBILITY_WINDOW_MINUTES = 15L + const val ANGULAR_MOTION_TARGET_ID = "angular-motion-target" } }