初次提交
This commit is contained in:
parent
9e197232c3
commit
60cb47b901
1623
.idea/workspace.xml
1623
.idea/workspace.xml
File diff suppressed because it is too large
Load Diff
|
|
@ -4,15 +4,6 @@ import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
|
||||||
* [类的简要说明]
|
|
||||||
* <p>
|
|
||||||
* [详细描述,可选]
|
|
||||||
* <p>
|
|
||||||
*
|
|
||||||
* @author LiDongYU
|
|
||||||
* @since 2025/7/22
|
|
||||||
*/
|
|
||||||
public class MultiPointGeoPosition {
|
public class MultiPointGeoPosition {
|
||||||
private static final double EARTH_RADIUS = 6371000.0;
|
private static final double EARTH_RADIUS = 6371000.0;
|
||||||
|
|
||||||
|
|
@ -24,7 +15,6 @@ public class MultiPointGeoPosition {
|
||||||
return radian * 180.0 / Math.PI;
|
return radian * 180.0 / Math.PI;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 球面距离
|
|
||||||
public static double haversine(double lat1, double lon1, double lat2, double lon2) {
|
public static double haversine(double lat1, double lon1, double lat2, double lon2) {
|
||||||
double dLat = toRadians(lat2 - lat1);
|
double dLat = toRadians(lat2 - lat1);
|
||||||
double dLon = toRadians(lon2 - lon1);
|
double dLon = toRadians(lon2 - lon1);
|
||||||
|
|
@ -38,7 +28,6 @@ public class MultiPointGeoPosition {
|
||||||
return EARTH_RADIUS * c;
|
return EARTH_RADIUS * c;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 球面距离的角度
|
|
||||||
public static double haversineAngle(double lat1, double lon1, double lat2, double lon2) {
|
public static double haversineAngle(double lat1, double lon1, double lat2, double lon2) {
|
||||||
double dLat = toRadians(lat2 - lat1);
|
double dLat = toRadians(lat2 - lat1);
|
||||||
double dLon = toRadians(lon2 - lon1);
|
double dLon = toRadians(lon2 - lon1);
|
||||||
|
|
@ -50,7 +39,6 @@ public class MultiPointGeoPosition {
|
||||||
return 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
|
return 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
|
||||||
}
|
}
|
||||||
|
|
||||||
// 球面插值
|
|
||||||
public static double[] interpolate(double lat1, double lon1, double lat2, double lon2, double f) {
|
public static double[] interpolate(double lat1, double lon1, double lat2, double lon2, double f) {
|
||||||
lat1 = toRadians(lat1);
|
lat1 = toRadians(lat1);
|
||||||
lon1 = toRadians(lon1);
|
lon1 = toRadians(lon1);
|
||||||
|
|
@ -72,10 +60,20 @@ public class MultiPointGeoPosition {
|
||||||
return new double[] { toDegrees(lat), toDegrees(lon) };
|
return new double[] { toDegrees(lat), toDegrees(lon) };
|
||||||
}
|
}
|
||||||
|
|
||||||
// 主流程
|
public static class PositionResult {
|
||||||
public static double[] getPosition(List<double[]> points, double speed, double seconds) {
|
public final double latitude;
|
||||||
|
public final double longitude;
|
||||||
|
public final boolean reached;
|
||||||
|
|
||||||
|
public PositionResult(double latitude, double longitude, boolean reached) {
|
||||||
|
this.latitude = latitude;
|
||||||
|
this.longitude = longitude;
|
||||||
|
this.reached = reached;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static PositionResult getPosition(List<double[]> points, double speed, double seconds) {
|
||||||
if (points == null || points.size() < 2) throw new IllegalArgumentException("点数必须≥2");
|
if (points == null || points.size() < 2) throw new IllegalArgumentException("点数必须≥2");
|
||||||
// 1. 计算每段距离
|
|
||||||
List<Double> segDists = new ArrayList<>();
|
List<Double> segDists = new ArrayList<>();
|
||||||
double totalDist = 0.0;
|
double totalDist = 0.0;
|
||||||
for (int i = 1; i < points.size(); i++) {
|
for (int i = 1; i < points.size(); i++) {
|
||||||
|
|
@ -85,17 +83,11 @@ public class MultiPointGeoPosition {
|
||||||
segDists.add(d);
|
segDists.add(d);
|
||||||
totalDist += d;
|
totalDist += d;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 2. 已行驶距离
|
|
||||||
double movedDist = speed * seconds;
|
double movedDist = speed * seconds;
|
||||||
|
|
||||||
// 3. 超出则返回终点
|
|
||||||
if (movedDist >= totalDist) {
|
if (movedDist >= totalDist) {
|
||||||
double[] last = points.get(points.size() - 1);
|
double[] last = points.get(points.size() - 1);
|
||||||
return new double[] { last[1], last[0] }; // [lat, lng]
|
return new PositionResult(last[1], last[0], true);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 4. 找到属于哪一段
|
|
||||||
double accum = 0.0;
|
double accum = 0.0;
|
||||||
for (int i = 0; i < segDists.size(); i++) {
|
for (int i = 0; i < segDists.size(); i++) {
|
||||||
double seg = segDists.get(i);
|
double seg = segDists.get(i);
|
||||||
|
|
@ -104,27 +96,26 @@ public class MultiPointGeoPosition {
|
||||||
double f = remain / seg;
|
double f = remain / seg;
|
||||||
double[] p1 = points.get(i);
|
double[] p1 = points.get(i);
|
||||||
double[] p2 = points.get(i + 1);
|
double[] p2 = points.get(i + 1);
|
||||||
return interpolate(p1[1], p1[0], p2[1], p2[0], f); // [lat, lng]
|
double[] pos = interpolate(p1[1], p1[0], p2[1], p2[0], f);
|
||||||
|
return new PositionResult(pos[0], pos[1], false);
|
||||||
}
|
}
|
||||||
accum += seg;
|
accum += seg;
|
||||||
}
|
}
|
||||||
// 理论不会到这里
|
|
||||||
double[] last = points.get(points.size() - 1);
|
double[] last = points.get(points.size() - 1);
|
||||||
return new double[] { last[1], last[0] };
|
return new PositionResult(last[1], last[0], true);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
// 轨迹点(lng, lat 格式)
|
|
||||||
List<double[]> points = Arrays.asList(
|
List<double[]> points = Arrays.asList(
|
||||||
new double[] {121.148362, 25.007064},
|
new double[] {121.148362, 25.007064},
|
||||||
new double[] {121.147192, 25.007612},
|
new double[] {121.147192, 25.007612},
|
||||||
new double[] {121.146891, 25.00789},
|
new double[] {121.146891, 25.00789},
|
||||||
new double[] {121.147089, 25.008096}
|
new double[] {121.147089, 25.008096}
|
||||||
);
|
);
|
||||||
double speed = 5.0; // 米/秒
|
double speed = 5.0;
|
||||||
double time = 30.0; // 秒
|
double time = 30.0;
|
||||||
|
|
||||||
double[] pos = getPosition(points, speed, time);
|
PositionResult pos = getPosition(points, speed, time);
|
||||||
System.out.printf("当前位置:纬度 %.6f, 经度 %.6f\n", pos[0], pos[1]);
|
System.out.printf("当前位置:纬度 %.6f, 经度 %.6f, 是否到达:%s\n", pos.latitude, pos.longitude, pos.reached ? "是" : "否");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
14
src/main/java/com/hivekion/scenario/TaskFinishedCall.java
Normal file
14
src/main/java/com/hivekion/scenario/TaskFinishedCall.java
Normal file
|
|
@ -0,0 +1,14 @@
|
||||||
|
package com.hivekion.scenario;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* [类的简要说明]
|
||||||
|
* <p>
|
||||||
|
* [详细描述,可选]
|
||||||
|
* <p>
|
||||||
|
*
|
||||||
|
* @author LiDongYU
|
||||||
|
* @since 2025/7/22
|
||||||
|
*/
|
||||||
|
public interface TaskFinishedCall {
|
||||||
|
void doneTask();
|
||||||
|
}
|
||||||
|
|
@ -58,4 +58,5 @@ public class ScenarioTask implements Serializable {
|
||||||
private String taskType;
|
private String taskType;
|
||||||
@TableField(exist = false)
|
@TableField(exist = false)
|
||||||
private String status;
|
private String status;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
package com.hivekion.scenario.service;
|
package com.hivekion.scenario.service;
|
||||||
|
|
||||||
import com.hivekion.baseData.entity.Scenario;
|
import com.hivekion.baseData.entity.Scenario;
|
||||||
|
import com.hivekion.scenario.TaskFinishedCall;
|
||||||
import com.hivekion.scenario.entity.ScenarioTask;
|
import com.hivekion.scenario.entity.ScenarioTask;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -15,11 +16,11 @@ import com.hivekion.scenario.entity.ScenarioTask;
|
||||||
public interface TaskLogicService {
|
public interface TaskLogicService {
|
||||||
|
|
||||||
//移动任务
|
//移动任务
|
||||||
void handleMoveTask(ScenarioTask task, Scenario scenario, String roomId);
|
void handleMoveTask(ScenarioTask task, Scenario scenario, String roomId,double speed,
|
||||||
|
TaskFinishedCall call);
|
||||||
//战斗任务
|
//战斗任务
|
||||||
void handleBattleTask(ScenarioTask task, Scenario scenario, String roomId);
|
void handleBattleTask(ScenarioTask task, Scenario scenario, String roomId);
|
||||||
//整备
|
//保障任务
|
||||||
void restTask(ScenarioTask task,Scenario scenario, String roomId);
|
|
||||||
|
|
||||||
void supplierTask(ScenarioTask task,Scenario scenario, String roomId);
|
void supplierTask(ScenarioTask task,Scenario scenario, String roomId);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -155,11 +155,23 @@ public class ScenarioTaskServiceImpl extends
|
||||||
if (taskListObj instanceof List<?>) {
|
if (taskListObj instanceof List<?>) {
|
||||||
List<?> taskList = (List<?>) taskListObj;
|
List<?> taskList = (List<?>) taskListObj;
|
||||||
for (Object task : taskList) {
|
for (Object task : taskList) {
|
||||||
|
|
||||||
ScenarioTask scenarioTask = (ScenarioTask) task;
|
ScenarioTask scenarioTask = (ScenarioTask) task;
|
||||||
//移动任务
|
switch (scenarioTask.getTaskType()) {
|
||||||
if (scenarioTask.getTaskType().equals("1")) {
|
case "1":
|
||||||
taskLogicService.handleMoveTask(scenarioTask, currentScenario, roomId);
|
taskLogicService.handleMoveTask(scenarioTask, currentScenario, roomId,18.0,null);
|
||||||
|
break;
|
||||||
|
case "2":
|
||||||
|
taskLogicService.handleBattleTask(scenarioTask, currentScenario, roomId);
|
||||||
|
break;
|
||||||
|
case "4":
|
||||||
|
case "5":
|
||||||
|
case "6":
|
||||||
|
case "7":
|
||||||
|
default:
|
||||||
|
taskLogicService.supplierTask(scenarioTask, currentScenario, roomId);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -167,8 +179,6 @@ public class ScenarioTaskServiceImpl extends
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<ScenarioTask> queryTaskList(ScenarioTask task) {
|
public List<ScenarioTask> queryTaskList(ScenarioTask task) {
|
||||||
QueryWrapper<ScenarioTask> queryWrapper = new QueryWrapper<>();
|
QueryWrapper<ScenarioTask> queryWrapper = new QueryWrapper<>();
|
||||||
|
|
|
||||||
|
|
@ -4,8 +4,10 @@ import com.alibaba.fastjson2.JSON;
|
||||||
import com.hivekion.Global;
|
import com.hivekion.Global;
|
||||||
import com.hivekion.baseData.entity.Scenario;
|
import com.hivekion.baseData.entity.Scenario;
|
||||||
import com.hivekion.common.MultiPointGeoPosition;
|
import com.hivekion.common.MultiPointGeoPosition;
|
||||||
|
import com.hivekion.common.MultiPointGeoPosition.PositionResult;
|
||||||
import com.hivekion.common.entity.ResponseCmdInfo;
|
import com.hivekion.common.entity.ResponseCmdInfo;
|
||||||
import com.hivekion.common.redis.RedisUtil;
|
import com.hivekion.common.redis.RedisUtil;
|
||||||
|
import com.hivekion.scenario.TaskFinishedCall;
|
||||||
import com.hivekion.scenario.entity.ScenarioTask;
|
import com.hivekion.scenario.entity.ScenarioTask;
|
||||||
import com.hivekion.scenario.service.TaskLogicService;
|
import com.hivekion.scenario.service.TaskLogicService;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
|
@ -28,14 +30,17 @@ import org.springframework.web.reactive.function.client.WebClient;
|
||||||
*/
|
*/
|
||||||
@Service
|
@Service
|
||||||
public class TaskLogicServiceImpl implements TaskLogicService {
|
public class TaskLogicServiceImpl implements TaskLogicService {
|
||||||
|
|
||||||
@Resource
|
@Resource
|
||||||
private RedisUtil redisUtil;
|
private RedisUtil redisUtil;
|
||||||
@Value("${path.planning.url}")
|
@Value("${path.planning.url}")
|
||||||
private String pathPlanningUrl;
|
private String pathPlanningUrl;
|
||||||
private final WebClient webClient = WebClient.create();
|
private final WebClient webClient = WebClient.create();
|
||||||
private final static double SPEED = 18.0;
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void handleMoveTask(ScenarioTask scenarioTask, Scenario currentScenario, String roomId) {
|
public void handleMoveTask(ScenarioTask scenarioTask, Scenario currentScenario, String roomId,
|
||||||
|
double speed, TaskFinishedCall call) {
|
||||||
ResponseCmdInfo<Map<String, Object>> cmdInfo = new ResponseCmdInfo<>();
|
ResponseCmdInfo<Map<String, Object>> cmdInfo = new ResponseCmdInfo<>();
|
||||||
Map<String, Object> dataMap = new HashMap<>();
|
Map<String, Object> dataMap = new HashMap<>();
|
||||||
cmdInfo.setData(dataMap);
|
cmdInfo.setData(dataMap);
|
||||||
|
|
@ -71,8 +76,9 @@ public class TaskLogicServiceImpl implements TaskLogicService {
|
||||||
Object pathsObj = redisUtil.hget(roomId + "_" + currentScenario.getId(),
|
Object pathsObj = redisUtil.hget(roomId + "_" + currentScenario.getId(),
|
||||||
scenarioTask.getId() + "_path_points");
|
scenarioTask.getId() + "_path_points");
|
||||||
if (pathsObj != null) {
|
if (pathsObj != null) {
|
||||||
com.alibaba.fastjson2.JSONArray paths = ( com.alibaba.fastjson2.JSONArray) pathsObj;
|
com.alibaba.fastjson2.JSONArray paths = (com.alibaba.fastjson2.JSONArray) pathsObj;
|
||||||
com.alibaba.fastjson2.JSONObject jsonObject = (com.alibaba.fastjson2.JSONObject) paths.get(0);
|
com.alibaba.fastjson2.JSONObject jsonObject = (com.alibaba.fastjson2.JSONObject) paths.get(
|
||||||
|
0);
|
||||||
com.alibaba.fastjson2.JSONArray pointsArray = jsonObject.getJSONObject("paths")
|
com.alibaba.fastjson2.JSONArray pointsArray = jsonObject.getJSONObject("paths")
|
||||||
.getJSONObject("points").getJSONArray("coordinates");
|
.getJSONObject("points").getJSONArray("coordinates");
|
||||||
|
|
||||||
|
|
@ -90,9 +96,14 @@ public class TaskLogicServiceImpl implements TaskLogicService {
|
||||||
"duringTime");
|
"duringTime");
|
||||||
if (duringObj != null) {
|
if (duringObj != null) {
|
||||||
int oldValue = duringObj instanceof Integer ? (Integer) duringObj : 0;
|
int oldValue = duringObj instanceof Integer ? (Integer) duringObj : 0;
|
||||||
double[] currentPosition = MultiPointGeoPosition.getPosition(points, SPEED,
|
PositionResult result = MultiPointGeoPosition.getPosition(points, speed,
|
||||||
oldValue);
|
oldValue);
|
||||||
dataMap.put("currentPosition", currentPosition);
|
dataMap.put("currentPosition", result);
|
||||||
|
if (result.reached) {
|
||||||
|
if(call!=null){
|
||||||
|
call.doneTask();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Global.sendCmdInfoQueue.add(cmdInfo);
|
Global.sendCmdInfoQueue.add(cmdInfo);
|
||||||
|
|
@ -103,13 +114,15 @@ public class TaskLogicServiceImpl implements TaskLogicService {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void restTask(ScenarioTask task, Scenario scenario, String roomId) {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void supplierTask(ScenarioTask task, Scenario scenario, String roomId) {
|
public void supplierTask(ScenarioTask task, Scenario scenario, String roomId) {
|
||||||
|
|
||||||
|
//运20速度
|
||||||
|
handleMoveTask(task, scenario, roomId, 217,()->{
|
||||||
|
//更新想定的物资
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -1,4 +0,0 @@
|
||||||
#Created by Apache Maven 3.9.9
|
|
||||||
version=1.0
|
|
||||||
groupId=org.hivekion
|
|
||||||
artifactId=springbootmybatis
|
|
||||||
|
|
@ -304,6 +304,7 @@ com\hivekion\system\service\impl\SysCsRoleServiceImpl.class
|
||||||
com\hivekion\system\service\ISysCsUserService.class
|
com\hivekion\system\service\ISysCsUserService.class
|
||||||
com\hivekion\baseData\service\ITblSatelliteSignaturesService.class
|
com\hivekion\baseData\service\ITblSatelliteSignaturesService.class
|
||||||
com\hivekion\dicData\mapper\DicTransferTypeMapper.class
|
com\hivekion\dicData\mapper\DicTransferTypeMapper.class
|
||||||
|
com\hivekion\common\MultiPointGeoPosition$PositionResult.class
|
||||||
com\hivekion\dicData\mapper\DicLaserCodeMapper.class
|
com\hivekion\dicData\mapper\DicLaserCodeMapper.class
|
||||||
com\hivekion\dicData\domain\DicVo\DicMobileUnitCategoryViewVo.class
|
com\hivekion\dicData\domain\DicVo\DicMobileUnitCategoryViewVo.class
|
||||||
com\hivekion\baseData\mapper\TblFacilityAircraftFacilitiesMapper.class
|
com\hivekion\baseData\mapper\TblFacilityAircraftFacilitiesMapper.class
|
||||||
|
|
@ -921,6 +922,7 @@ com\hivekion\baseData\controller\TblLaserController.class
|
||||||
com\hivekion\baseData\domain\TblLaserVo\TblLaserDataModelAddInputVo.class
|
com\hivekion\baseData\domain\TblLaserVo\TblLaserDataModelAddInputVo.class
|
||||||
com\hivekion\baseData\domain\TblAircraftMounts.class
|
com\hivekion\baseData\domain\TblAircraftMounts.class
|
||||||
com\hivekion\dicData\domain\DicWeaponTarget.class
|
com\hivekion\dicData\domain\DicWeaponTarget.class
|
||||||
|
com\hivekion\scenario\TaskFinishedCall.class
|
||||||
com\hivekion\dbmanage\domain\TableColumnInfo.class
|
com\hivekion\dbmanage\domain\TableColumnInfo.class
|
||||||
com\hivekion\baseData\service\ITblLaserWarheadsService.class
|
com\hivekion\baseData\service\ITblLaserWarheadsService.class
|
||||||
com\hivekion\scenario\bean\RegulationsRule.class
|
com\hivekion\scenario\bean\RegulationsRule.class
|
||||||
|
|
|
||||||
|
|
@ -1043,6 +1043,7 @@ D:\program-work\java-work\simulation-backend\src\main\java\com\hivekion\baseData
|
||||||
D:\program-work\java-work\simulation-backend\src\main\java\com\hivekion\dicData\domain\DicAircraftCategory.java
|
D:\program-work\java-work\simulation-backend\src\main\java\com\hivekion\dicData\domain\DicAircraftCategory.java
|
||||||
D:\program-work\java-work\simulation-backend\src\main\java\com\hivekion\baseData\service\IImgAircraftImageService.java
|
D:\program-work\java-work\simulation-backend\src\main\java\com\hivekion\baseData\service\IImgAircraftImageService.java
|
||||||
D:\program-work\java-work\simulation-backend\src\main\java\com\hivekion\dicData\service\IDicSatelliteCategoryService.java
|
D:\program-work\java-work\simulation-backend\src\main\java\com\hivekion\dicData\service\IDicSatelliteCategoryService.java
|
||||||
|
D:\program-work\java-work\simulation-backend\src\main\java\com\hivekion\scenario\TaskFinishedCall.java
|
||||||
D:\program-work\java-work\simulation-backend\src\main\java\com\hivekion\test\domain\ProjectInfo.java
|
D:\program-work\java-work\simulation-backend\src\main\java\com\hivekion\test\domain\ProjectInfo.java
|
||||||
D:\program-work\java-work\simulation-backend\src\main\java\com\hivekion\dicData\domain\DicVo\DicSubmarinePhysicalsizeViewVo.java
|
D:\program-work\java-work\simulation-backend\src\main\java\com\hivekion\dicData\domain\DicVo\DicSubmarinePhysicalsizeViewVo.java
|
||||||
D:\program-work\java-work\simulation-backend\src\main\java\com\hivekion\dicData\controller\DicLoadoutTimeofdayController.java
|
D:\program-work\java-work\simulation-backend\src\main\java\com\hivekion\dicData\controller\DicLoadoutTimeofdayController.java
|
||||||
|
|
|
||||||
|
|
@ -1,3 +0,0 @@
|
||||||
com\hivekion\ApplicationTest.class
|
|
||||||
com\hivekion\JsonTest.class
|
|
||||||
com\hivekion\YY.class
|
|
||||||
|
|
@ -1,3 +0,0 @@
|
||||||
D:\program-work\java-work\simulation-backend\src\test\java\com\hivekion\JsonTest.java
|
|
||||||
D:\program-work\java-work\simulation-backend\src\test\java\com\hivekion\ApplicationTest.java
|
|
||||||
D:\program-work\java-work\simulation-backend\src\test\java\com\hivekion\YY.java
|
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Loading…
Reference in New Issue
Block a user