package com.zy.acs.manager.core.utils;
|
|
import com.zy.acs.common.enums.ClockwiseType;
|
import com.zy.acs.manager.manager.entity.AgvModel;
|
import com.zy.acs.manager.manager.entity.Code;
|
|
/**
|
* 车型角度工具:
|
* 将地图物理方向(默认顺时针)转换为车型自身角度体系。
|
*/
|
public final class AgvAngleUtils {
|
|
private AgvAngleUtils() {
|
}
|
|
public static Double calculateDirection(Code startCode, Code endCode, AgvModel agvModel) {
|
if (startCode == null || endCode == null) {
|
return null;
|
}
|
double deltaX = endCode.getX() - startCode.getX();
|
double deltaY = endCode.getY() - startCode.getY();
|
double mapAngle = Math.toDegrees(Math.atan2(deltaX, deltaY));
|
return toModelAngle(normalizeAngle(mapAngle), agvModel);
|
}
|
|
public static Double toModelAngle(Double mapAngleDegrees, AgvModel agvModel) {
|
if (mapAngleDegrees == null) {
|
return null;
|
}
|
double factor = isClockwise(agvModel) ? 1D : -1D;
|
double offset = getAngleOffsetDeg(agvModel);
|
return normalizeAngle(factor * normalizeAngle(mapAngleDegrees) + offset);
|
}
|
|
public static Double fromModelAngle(Double modelAngleDegrees, AgvModel agvModel) {
|
if (modelAngleDegrees == null) {
|
return null;
|
}
|
double factor = isClockwise(agvModel) ? 1D : -1D;
|
double offset = getAngleOffsetDeg(agvModel);
|
return normalizeAngle(factor * (normalizeAngle(modelAngleDegrees) - offset));
|
}
|
|
public static Double toRadians(Double angleDegrees) {
|
if (angleDegrees == null) {
|
return null;
|
}
|
return Math.toRadians(normalizeAngle(angleDegrees));
|
}
|
|
public static Double fromRadians(Double angleRadians) {
|
if (angleRadians == null) {
|
return null;
|
}
|
return normalizeAngle(Math.toDegrees(angleRadians));
|
}
|
|
public static Double normalizeAngle(Double angleDegrees) {
|
if (angleDegrees == null) {
|
return null;
|
}
|
double normalized = angleDegrees % 360D;
|
return normalized >= 0 ? normalized : normalized + 360D;
|
}
|
|
private static Double getAngleOffsetDeg(AgvModel agvModel) {
|
return agvModel == null || agvModel.getAngleOffsetDeg() == null ? 0D : agvModel.getAngleOffsetDeg();
|
}
|
|
private static boolean isClockwise(AgvModel agvModel) {
|
return agvModel == null
|
|| agvModel.getAngleClockwise() == null
|
|| agvModel.getAngleClockwise().equals(ClockwiseType.CW.value);
|
}
|
}
|