这里需要两个坐标系的对应两个点
首先是实体类:
@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
public class Point {
private double x;
private double y;
private double z;
}
计算工具类:
@Component
@NoArgsConstructor
@Slf4j
public class transUtil {
/**
* 获取两点连线与y轴夹角
*
* @param p1 点1
* @param p2 点2
* @return 与y轴夹角(角度)
*/
public double getAngle(Point p1, Point p2) {
double angle = Math.atan2(p2.getX() - p1.getX(), p2.getY() - p1.getY());
return angle * (180 / Math.PI);
}
/**
* 获取缩放比例
*
* @param p1 源点1
* @param b1 目标点1
* @param p2 源点2
* @param b2 目标点2
* @return 缩放比例
*/
public double getScale(Point p1, Point b1, Point p2, Point b2) {
return getLength(b1, b2) / getLength(p1, p2);
}
/**
* 获取两点之间连线的长度
*
* @param p1 点1
* @param p2 点2
* @return 长度
*/
public static double getLength(Point p1, Point p2) {
return Math.sqrt(Math.pow(p2.getX() - p1.getX(), 2) + Math.pow(p2.getY() - p1.getY(), 2));
}
/**
* X方向偏移距离参数
*
* @param p1 源点1
* @param b1 目标点1
* @param rotation 旋转角度
* @param scale 缩放比例
* @return X方向偏移
*/
public double getXTranslation(Point p1, Point b1, double rotation, double scale) {
return (b1.getX() - scale * (p1.getX() * Math.cos(rotation) - p1.getY() * Math.sin(rotation)));
}
/**
* Y方向偏移距离参数
*
* @param p1 源点1
* @param b1 目标点1
* @param rotation 旋转角度
* @param scale 缩放比例
* @return Y方向偏移
*/
public double getYTranslation(Point p1, Point b1, double rotation, double scale) {
return (b1.getY() - scale * (p1.getX() * Math.sin(rotation) + p1.getY() * Math.cos(rotation)));
}
/**
* 转换操作
*
* @param gp 源点
* @param rotation 旋转角度
* @param scale 缩放比例
* @param dx X方向偏移
* @param dy Y方向偏移
* @return 目标点
*/
public Point transformBoePoint(Point gp, double rotation, double scale, double dx, double dy) {
double A = scale * Math.cos(rotation);
double B = scale * Math.sin(rotation);
return new Point(retain6(A * gp.getX() - B * gp.getY() + dx), retain6(B * gp.getX() + A * gp.getY() + dy), 0.0);
}
/**
* 保留小数点后六位
*
* @param num
* @return
*/
public static double retain6(double num) {
String result = String.format("%.6f", num);
return Double.valueOf(result);
}
}
这里用到了lombok的相关,可以去除自行写相关方法
使用:四个点分别是
Point1 Point2(原坐标系两个点) newPoint1 newPoint2(新坐标系对应的两个点) 分别对应Point1 -> newPoint1 Point2 -> newPoint2
//初始化4点
double rotation = Math.toRadians(Math.abs(transUtil .getAngle(Point1 , Point2 ) - transUtil .getAngle(newPoint1 , newPoint2 )));
//获取到转化后的坐标
double scale = transUtil .getScale(newPoint1 , Point1 , newPoint2 , Point2 );
double tx = transUtil .getXTranslation(newPoint1 , Point1 , rotation, scale);
double ty = transUtil .getYTranslation(newPoint1 , Point1 , rotation, scale);
//需要转换的坐标 x,y,z
Point transPoint = new Point(o.getX(), o.getZ(), 0.0);
Point resultPoint = coordinateUtil.transformBoePoint(new Point(o.getX(), o.getZ(), 0.0), rotation, scale, tx, ty);