点到直线 / 投影平面的坐标计算

以下为今天学习的笔记,内容包括:点到投影平面 / 直线的理论推导和代码部分

1. 点到投影平面 / 直线的理论推导

以下内容为我的手写笔记。首先推导更直观的点到直线的投影坐标计算,然后电到投影平面的坐标推导为二维到三维的推广,并没有进行严格的推导。但这是我认为更直观的一个过程。具体内容如下:

 2. 代码撰写

function facepoint = project_point2face(A,B,C,D,outpoint)
% 目标:求解平面外一点再平面上的投影坐标
% 思路:facepoint在 Ax+By+Cz+D=0的平面,另外构造x,y,z轴的投影关系
M = [A B C 0; [eye(3,3),-[A;B;C]]];
b = [-D;outpoint'];
c = M \ b;
facepoint = c(1:3)';
end

以上即为我对于点到直线 / 投影平面的坐标计算的一些经验和心得,如有疑问欢迎留言!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
计算 WGS84 坐标系下某点到一条直线的垂直距离可以采用以下步骤: 1. 根据直线的两个的经纬度坐标计算出它们在地球上的三维坐标。 2. 计算直线的方向向量。直线的方向向量可以通过两坐标相减得到: AB = (Xb - Xa, Yb - Ya, Zb - Za) 其中,A 和 B 分别为直线上的两个坐标,AB 为直线的方向向量。 3. 计算在地球上的三维坐标。 4. 计算点到直线所在平面的距离。点到直线所在平面的距离可以通过点到直线的距离在直线方向上的投影得到: d = |(P - A) × AB| / |AB| 其中,P 表示坐标,× 表示向量的叉积,|·| 表示向量的模长,AB 表示直线的方向向量。 5. 将点到直线所在平面的距离投影直线上,得到垂直距离。 h = |(P - A) · AB| / |AB| 其中,· 表示向量的积。 具体的 Java 代码实现可以参考以下示例: ``` public static double distance(double lat1, double lng1, double lat2, double lng2, double lat3, double lng3) { // 计算三维坐标 double[] a = toCartesian(lat1, lng1); double[] b = toCartesian(lat2, lng2); double[] c = toCartesian(lat3, lng3); // 计算直线的方向向量 double[] ab = {b[0] - a[0], b[1] - a[1], b[2] - a[2]}; // 计算点到直线所在平面的距离 double[] ap = {a[0] - c[0], a[1] - c[1], a[2] - c[2]}; double[] n = cross(ab, ap); double d = dot(n, ap) / length(n); // 计算垂直距离 double h = dot(ab, ap) / length(ab); return Math.sqrt(d * d - h * h); } // 将经纬度转换为三维坐标 public static double[] toCartesian(double lat, double lng) { double R = 6378137; // 地球半径 double e = 0.0818191908426; // 第一偏心率 double N = R / Math.sqrt(1 - e * e * Math.sin(lat) * Math.sin(lat)); double x = (N + 0) * Math.cos(lat) * Math.cos(lng); double y = (N + 0) * Math.cos(lat) * Math.sin(lng); double z = (N * (1 - e * e) + 0) * Math.sin(lat); return new double[]{x, y, z}; } // 计算向量的叉积 public static double[] cross(double[] a, double[] b) { return new double[]{a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0]}; } // 计算向量的积 public static double dot(double[] a, double[] b) { return a[0] * b[0] + a[1] * b[1] + a[2] * b[2]; } // 计算向量的模长 public static double length(double[] a) { return Math.sqrt(a[0] * a[0] + a[1] * a[1] + a[2] * a[2]); } ``` 其中,lat1 和 lng1 表示的经纬度坐标,lat2 和 lng2 表示直线上的一的经纬度坐标,lat3 和 lng3 表示直线上的另一的经纬度坐标。函数返回值为点到直线的垂直距离。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值