如何计算球体上一点到线段的距离?

2023-12-05

我在地球上有一条线段(大圆部分)。线段由其端点的坐标定义。显然,两个点定义了两条线段,所以假设我对较短的一条线段感兴趣。

我得到了第三个点,我正在寻找线和点之间的(最短)距离。

所有坐标均以经度\纬度 (WGS 84) 给出。

我如何计算距离?

任何合理的编程语言的解决方案都可以。


这是我自己的解决方案,基于以下想法询问数学博士。我很高兴看到您的反馈。

首先免责声明。该解对于球体是正确的。地球不是球体,坐标系 (WGS 84) 也不假定它是球体。所以这只是一个近似值,我无法真正估计误差。此外,对于非常小的距离,通过假设所有东西都是共面的,也可能获得良好的近似值。我再次不知道距离必须有多“小”。

现在开始做生意。我将线的末端称为 A、B 和第三点 C。基本上,该算法是:

  1. 首先将坐标转换为笛卡尔坐标(原点位于地球中心)-例如这里.

  2. 使用以下 3 个向量积计算 T,即 AB 线上最接近 C 的点:

    G = A x B

    F=C×G

    T=G×F

  3. 标准化 T 并乘以地球半径。

  4. 将 T 转换回经度\纬度。

  5. 计算 T 和 C 之间的距离 -例如这里.

如果您正在寻找 C 与 A 和 B 定义的大圆之间的距离,这些步骤就足够了。如果您像我一样对 C 与较短线段之间的距离感兴趣,则需要采取额外的步骤来验证T确实在这个段上。如果不是,那么最近的点必然是 A 端或 B 端之一 - 最简单的方法是检查哪一端。

一般来说,三个向量乘积背后的想法如下。第一个 (G) 给出了 A 和 B 的大圆平面(因此包含 A、B 和原点的平面)。第二个 (F) 给出了穿过 C 并垂直于 G 的大圆。然后 T 是 F 和 G 定义的大圆的交点,通过归一化并乘以 R 得到正确的长度。

下面是一些用于执行此操作的部分 Java 代码。

寻找大圆上最近的点。输入和输出是长度为 2 的数组。中间数组的长度为 3。

double[] nearestPointGreatCircle(double[] a, double[] b, double c[])
{
    double[] a_ = toCartsian(a);
    double[] b_ = toCartsian(b);
    double[] c_ = toCartsian(c);

    double[] G = vectorProduct(a_, b_);
    double[] F = vectorProduct(c_, G);
    double[] t = vectorProduct(G, F);
    normalize(t);
    multiplyByScalar(t, R_EARTH);
    return fromCartsian(t);
}

寻找线段上最近的点:

double[] nearestPointSegment (double[] a, double[] b, double[] c)
{
   double[] t= nearestPointGreatCircle(a,b,c);
   if (onSegment(a,b,t))
     return t;
   return (distance(a,c) < distance(b,c)) ? a : c;
} 

这是一种简单的方法,用于测试点 T(我们知道它与 A 和 B 在同一个大圆上)是否在该大圆的较短线段上。然而,还有更有效的方法可以做到这一点:

   boolean onSegment (double[] a, double[] b, double[] t)
   {
     // should be   return distance(a,t)+distance(b,t)==distance(a,b), 
     // but due to rounding errors, we use: 
     return Math.abs(distance(a,b)-distance(a,t)-distance(b,t)) < PRECISION;
   }    
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何计算球体上一点到线段的距离? 的相关文章

  • 是否有任何算法可以计算给定定义形状的坐标的形状面积?

    所以我有一些接收 N 个随机数的函数2D点 是否有任何算法可以计算输入点定义的形状面积 你想要计算多边形的面积 http local wasp uwa edu au pbourke geometry polyarea 取自链接 转换为 C
  • 与 Perl 和 Ruby 比较的相似语言特性 __END__

    背景 Perl 和 Ruby 有 END and DATA 允许将任意数据直接嵌入源代码文件中的标记 尽管这种做法可能不适合通用编程用途 但它对于例行任务的 一次性 快速脚本非常有用 问题 还有哪些其他编程语言支持相同或类似的功能 它们是如
  • 空间索引无助于 SQL 查询(性能非常慢)

    我正在尝试测试包含 170 万个邮政编码的表中纬度 经度值的空间索引的性能 我创建了一个地理列并向其中添加了一个索引 但是使用空间索引的查询比在同一个表中的纬度 经度列上使用 正常 索引的查询要慢得多 至少 100 倍 但是查询计划显示索引
  • 根据已知的纬度和经度点在图像上放置点的尝试失败

    我为这个含糊的标题道歉 我真的想不出更好的方法来总结它 非常欢迎提出建议 我正在开发一个实际上不需要谷歌地图的项目 它只会为这个项目带来额外的开销 但是 到目前为止 我不知道如何在没有谷歌地图的情况下做到这一点 如果我要将平面图的图形叠加层
  • 判断一个点是否在直角三角形内

    我一直想知道最简单的方法来确定一个点是否位于三角形内 或者在这种情况下 判断一个点是否位于对角线切成两半的矩形内 假设我有一个 64x64 像素的矩形 对于这个矩形 如果传递的点位于矩形的左上角 我想返回 TRUE 值 否则返回 FALSE
  • 多个点之间的最短路线

    我需要找到多个点之间的最短路线 假设我有以下四点 var startPoint new Point 1 1 var pointsToGoPast new List
  • 在 R 中使用 k-NN 和分类值

    我希望对主要具有分类特征的数据进行分类 为此 欧几里得距离 或任何其他数值假设距离 不适合 我正在寻找 R 的 kNN 实现 其中可以选择不同的距离方法 例如汉明距离 有没有一种方法可以使用常见的 kNN 实现 例如具有不同距离度量函数的
  • OpenCV 旋转图像而不裁剪澄清

    我想扩展这个主题 参考用户 Lars Schillingmann 给出的这个 SO 问题和接受的答案 在 C 中的 OpenCV 中旋转图像而不裁剪 https stackoverflow com questions 22041699 ro
  • 在 R 中创建缓冲区和计数点

    I asked 这个问题 https stackoverflow com questions 42498344 create buffer around spatial point data in r and count how many
  • 从原点开始在离散 2D 网格上迭代向外螺旋的算法

    例如 这是预期螺旋的形状 以及迭代的每个步骤 y 16 15 14 13 12 17 4 3 2 11 18 5 0 1 10 x 19 6 7 8 9 20 21 22 23 24 其中线条是 x 轴和 y 轴 以下是算法每次迭代 返回
  • 自动跟踪算法

    我正在尝试写一个simple跟踪例程来跟踪电影中的某些点 本质上我有一系列 100 帧长的电影 在黑暗背景上显示一些亮点 我每帧有大约 100 150 个点 它们在电影的过程中移动 我想跟踪它们 所以我正在寻找一些有效的 但可能不会过度实施
  • 如何使用PostGIS将多边形数据转换为线段

    我在 PostgreSQL PostGIS 中有一个多边形数据表 现在我需要将此多边形数据转换为其相应的线段 谁能告诉我如何使用 PostGIS 查询进行转换 提前致谢 一般来说 将多边形转换为线可能并不简单 因为没有一对一的映射 http
  • 使用什么算法来确定使系统达到“零”状态所需的最小操作数?

    这是一种更通用的问题 不是特定于语言的 有关要使用的想法和算法的更多信息 系统如下 它登记朋友群体之间的小额贷款 Alice and Bill要去吃午饭 比尔的卡坏了 所以爱丽丝支付了他的餐费 10 美元 第二天Bill and Charl
  • 奖励*完整*初学者的代码项目[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 为刚接触编程的人提供的课程通常包括一个代码项目 我认为这是一种很好的学习方式 然而 这样的项目往往让人感觉过于做作 因此做起来并没有多大回
  • 发布Oracle和SQL Server性能测试是否违反许可? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我想对Oracle和SQL Server中的空间索引进行性能测试 我想将其纳入我的理学硕士工作中 发布此类结果是否违反 dbms 的许可 也许有人已经
  • 找到三角测量时覆盖另一个点的最近 3 个点的算法

    想象一张画布 周围随机分布着一堆点 现在选择其中一点 您如何找到距离它最近的 3 个点 这样如果您画一个连接这些点的三角形 它将覆盖所选点 澄清 我所说的 最近 是指到该点的最小距离总和 这主要是出于好奇 我认为 如果一个点未知 但周围的点
  • 使用 OpenGL 或 D3D 绘制椭圆的有效方法

    有一种快速画圆的方法 void DrawCircle float cx float cy float r int num segments float theta 2 3 1415926 float num segments float c
  • 检测霍夫圆android

    我正在尝试使用 android 检测圆圈 我成功实现了检测线算法 但在尝试绘制霍夫圆算法时没有显示任何内容 这是我的代码 Mat thresholdImage new Mat getFrameHeight getFrameHeight 2
  • 高效找到圆和网格的交点

    找到由圆心和半径定义的圆与任意网格的交点的好方法是什么 An illustration of the points I am trying to find 到目前为止我想到的可能的解决方案 找到位于中心 半径之间的所有线 对于每条线计算交点
  • 我应该测试是否等于 1 还是不等于 0?

    前几天我在这里编码 写了几个 if 语句 其中的整数总是要么0 or 1 实际上充当bools 我问自己 当检测结果呈阳性时 哪个更好 测试int 1 or int 0 例如 给定一个 intn 如果我想测试是否是true 我应该使用n 1

随机推荐