围栏锚点之间按照固定距离补点
package com.ruoyi.system.utils;
import cn.hutool.core.collection.CollUtil;
import com.alibaba.fastjson.JSON;
import com.ruoyi.common.core.text.Convert;
import com.ruoyi.system.domain.TbRail;
import com.ruoyi.system.domain.TbRailPoint;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.annotations.Param;
import java.awt.geom.Point2D;
import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;
@Slf4j
public class RailUtil {
public static List<TbRailPoint> interpolatePoints(TbRailPoint start, TbRailPoint end, double distance) {
List<Point2D.Double> doubleList = interpolatePoints(new Point2D.Double(start.getLongitude().doubleValue(), start.getLatitude().doubleValue())
, new Point2D.Double(end.getLongitude().doubleValue(), end.getLatitude().doubleValue()),
distance);
int sort = Optional.ofNullable(start.getSort()).orElse(0L).intValue();
List<TbRailPoint> rtn = new ArrayList<>();
for (Point2D.Double p : doubleList) {
TbRailPoint tmp = new TbRailPoint();
tmp.setLongitude(BigDecimal.valueOf(p.x));
tmp.setLatitude(BigDecimal.valueOf(p.y));
tmp.setSort(Convert.toLong(++sort));
rtn.add(tmp);
}
return rtn;
}
private static List<Point2D.Double> interpolatePoints(Point2D.Double start, Point2D.Double end, double distance) {
List<Point2D.Double> interpolatedPoints = new ArrayList<>();
double dx = end.x - start.x;
double dy = end.y - start.y;
double totalDistance = Math.sqrt(dx * dx + dy * dy);
log.info("【3D围栏维护】保存3D围栏,两点之间补偿点,两点间距离 {} ", totalDistance);
if (totalDistance<distance){
return interpolatedPoints;
}
int numPoints = (int) (totalDistance / distance);
double incrementX = dx / numPoints;
double incrementY = dy / numPoints;
double x = start.x;
double y = start.y;
for (int i = 0; i < numPoints; i++) {
interpolatedPoints.add(new Point2D.Double(x, y));
x += incrementX;
y += incrementY;
}
interpolatedPoints = interpolatedPoints.subList(1, interpolatedPoints.size());
return interpolatedPoints;
}
public static void main(String[] args) {
Point2D.Double startPoint = new Point2D.Double(-74.006, 40.7128);
Point2D.Double endPoint = new Point2D.Double(-73.935242, 40.73061);
double fixedDistance = 0.01;
List<Point2D.Double> interpolatedPoints = interpolatePoints(startPoint, endPoint, fixedDistance);
System.out.println("Interpolated Points:");
for (Point2D.Double point : interpolatedPoints) {
System.out.println(point.x + ", " + point.y);
}
}
}