初次提交

This commit is contained in:
李玉东 2025-09-14 17:03:11 +08:00
parent 9e197232c3
commit 60cb47b901
21 changed files with 1649 additions and 115 deletions

File diff suppressed because it is too large Load Diff

View File

@ -4,15 +4,6 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* [类的简要说明]
* <p>
* [详细描述可选]
* <p>
*
* @author LiDongYU
* @since 2025/7/22
*/
public class MultiPointGeoPosition {
private static final double EARTH_RADIUS = 6371000.0;
@ -24,7 +15,6 @@ public class MultiPointGeoPosition {
return radian * 180.0 / Math.PI;
}
// 球面距离
public static double haversine(double lat1, double lon1, double lat2, double lon2) {
double dLat = toRadians(lat2 - lat1);
double dLon = toRadians(lon2 - lon1);
@ -38,7 +28,6 @@ public class MultiPointGeoPosition {
return EARTH_RADIUS * c;
}
// 球面距离的角度
public static double haversineAngle(double lat1, double lon1, double lat2, double lon2) {
double dLat = toRadians(lat2 - lat1);
double dLon = toRadians(lon2 - lon1);
@ -50,7 +39,6 @@ public class MultiPointGeoPosition {
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) {
lat1 = toRadians(lat1);
lon1 = toRadians(lon1);
@ -72,10 +60,20 @@ public class MultiPointGeoPosition {
return new double[] { toDegrees(lat), toDegrees(lon) };
}
// 主流程
public static double[] getPosition(List<double[]> points, double speed, double seconds) {
public static class PositionResult {
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");
// 1. 计算每段距离
List<Double> segDists = new ArrayList<>();
double totalDist = 0.0;
for (int i = 1; i < points.size(); i++) {
@ -85,17 +83,11 @@ public class MultiPointGeoPosition {
segDists.add(d);
totalDist += d;
}
// 2. 已行驶距离
double movedDist = speed * seconds;
// 3. 超出则返回终点
if (movedDist >= totalDist) {
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;
for (int i = 0; i < segDists.size(); i++) {
double seg = segDists.get(i);
@ -104,27 +96,26 @@ public class MultiPointGeoPosition {
double f = remain / seg;
double[] p1 = points.get(i);
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;
}
// 理论不会到这里
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) {
// 轨迹点lng, lat 格式
List<double[]> points = Arrays.asList(
new double[] {121.148362, 25.007064},
new double[] {121.147192, 25.007612},
new double[] {121.146891, 25.00789},
new double[] {121.147089, 25.008096}
);
double speed = 5.0; // /
double time = 30.0; //
double speed = 5.0;
double time = 30.0;
double[] pos = getPosition(points, speed, time);
System.out.printf("当前位置:纬度 %.6f, 经度 %.6f\n", pos[0], pos[1]);
PositionResult pos = getPosition(points, speed, time);
System.out.printf("当前位置:纬度 %.6f, 经度 %.6f, 是否到达:%s\n", pos.latitude, pos.longitude, pos.reached ? "" : "");
}
}
}

View File

@ -0,0 +1,14 @@
package com.hivekion.scenario;
/**
* [类的简要说明]
* <p>
* [详细描述可选]
* <p>
*
* @author LiDongYU
* @since 2025/7/22
*/
public interface TaskFinishedCall {
void doneTask();
}

View File

@ -58,4 +58,5 @@ public class ScenarioTask implements Serializable {
private String taskType;
@TableField(exist = false)
private String status;
}

View File

@ -1,6 +1,7 @@
package com.hivekion.scenario.service;
import com.hivekion.baseData.entity.Scenario;
import com.hivekion.scenario.TaskFinishedCall;
import com.hivekion.scenario.entity.ScenarioTask;
/**
@ -15,11 +16,11 @@ import com.hivekion.scenario.entity.ScenarioTask;
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 restTask(ScenarioTask task,Scenario scenario, String roomId);
//保障任务
void supplierTask(ScenarioTask task,Scenario scenario, String roomId);

View File

@ -155,11 +155,23 @@ public class ScenarioTaskServiceImpl extends
if (taskListObj instanceof List<?>) {
List<?> taskList = (List<?>) taskListObj;
for (Object task : taskList) {
ScenarioTask scenarioTask = (ScenarioTask) task;
//移动任务
if (scenarioTask.getTaskType().equals("1")) {
taskLogicService.handleMoveTask(scenarioTask, currentScenario, roomId);
switch (scenarioTask.getTaskType()) {
case "1":
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
public List<ScenarioTask> queryTaskList(ScenarioTask task) {
QueryWrapper<ScenarioTask> queryWrapper = new QueryWrapper<>();

View File

@ -4,8 +4,10 @@ import com.alibaba.fastjson2.JSON;
import com.hivekion.Global;
import com.hivekion.baseData.entity.Scenario;
import com.hivekion.common.MultiPointGeoPosition;
import com.hivekion.common.MultiPointGeoPosition.PositionResult;
import com.hivekion.common.entity.ResponseCmdInfo;
import com.hivekion.common.redis.RedisUtil;
import com.hivekion.scenario.TaskFinishedCall;
import com.hivekion.scenario.entity.ScenarioTask;
import com.hivekion.scenario.service.TaskLogicService;
import java.util.ArrayList;
@ -28,14 +30,17 @@ import org.springframework.web.reactive.function.client.WebClient;
*/
@Service
public class TaskLogicServiceImpl implements TaskLogicService {
@Resource
private RedisUtil redisUtil;
@Value("${path.planning.url}")
private String pathPlanningUrl;
private final WebClient webClient = WebClient.create();
private final static double SPEED = 18.0;
@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<>();
Map<String, Object> dataMap = new HashMap<>();
cmdInfo.setData(dataMap);
@ -71,8 +76,9 @@ public class TaskLogicServiceImpl implements TaskLogicService {
Object pathsObj = redisUtil.hget(roomId + "_" + currentScenario.getId(),
scenarioTask.getId() + "_path_points");
if (pathsObj != null) {
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.JSONArray paths = (com.alibaba.fastjson2.JSONArray) pathsObj;
com.alibaba.fastjson2.JSONObject jsonObject = (com.alibaba.fastjson2.JSONObject) paths.get(
0);
com.alibaba.fastjson2.JSONArray pointsArray = jsonObject.getJSONObject("paths")
.getJSONObject("points").getJSONArray("coordinates");
@ -90,9 +96,14 @@ public class TaskLogicServiceImpl implements TaskLogicService {
"duringTime");
if (duringObj != null) {
int oldValue = duringObj instanceof Integer ? (Integer) duringObj : 0;
double[] currentPosition = MultiPointGeoPosition.getPosition(points, SPEED,
PositionResult result = MultiPointGeoPosition.getPosition(points, speed,
oldValue);
dataMap.put("currentPosition", currentPosition);
dataMap.put("currentPosition", result);
if (result.reached) {
if(call!=null){
call.doneTask();
}
}
}
}
Global.sendCmdInfoQueue.add(cmdInfo);
@ -103,13 +114,15 @@ public class TaskLogicServiceImpl implements TaskLogicService {
}
@Override
public void restTask(ScenarioTask task, Scenario scenario, String roomId) {
}
@Override
public void supplierTask(ScenarioTask task, Scenario scenario, String roomId) {
//运20速度
handleMoveTask(task, scenario, roomId, 217,()->{
//更新想定的物资
});
}
}

View File

@ -1,4 +0,0 @@
#Created by Apache Maven 3.9.9
version=1.0
groupId=org.hivekion
artifactId=springbootmybatis

View File

@ -304,6 +304,7 @@ com\hivekion\system\service\impl\SysCsRoleServiceImpl.class
com\hivekion\system\service\ISysCsUserService.class
com\hivekion\baseData\service\ITblSatelliteSignaturesService.class
com\hivekion\dicData\mapper\DicTransferTypeMapper.class
com\hivekion\common\MultiPointGeoPosition$PositionResult.class
com\hivekion\dicData\mapper\DicLaserCodeMapper.class
com\hivekion\dicData\domain\DicVo\DicMobileUnitCategoryViewVo.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\TblAircraftMounts.class
com\hivekion\dicData\domain\DicWeaponTarget.class
com\hivekion\scenario\TaskFinishedCall.class
com\hivekion\dbmanage\domain\TableColumnInfo.class
com\hivekion\baseData\service\ITblLaserWarheadsService.class
com\hivekion\scenario\bean\RegulationsRule.class

View File

@ -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\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\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\dicData\domain\DicVo\DicSubmarinePhysicalsizeViewVo.java
D:\program-work\java-work\simulation-backend\src\main\java\com\hivekion\dicData\controller\DicLoadoutTimeofdayController.java

View File

@ -1,3 +0,0 @@
com\hivekion\ApplicationTest.class
com\hivekion\JsonTest.class
com\hivekion\YY.class

View File

@ -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.