初次提交
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.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 ? "是" : "否");
|
||||
}
|
||||
}
|
||||
}
|
||||
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;
|
||||
@TableField(exist = false)
|
||||
private String status;
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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<>();
|
||||
|
|
|
|||
|
|
@ -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,()->{
|
||||
//更新想定的物资
|
||||
});
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
|||
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\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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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