将点投影到路径上
Projecting a point onto a path
假设我有一个包含描述路径的点 (lat, lon)
的有序数组,还有一个描述我当前位置的点 (lat, lon)
。
如何将点投影到路径上(并将点放在数组中的适当位置)?
我尝试的只是简单地搜索最近的两个点并假设它在它们的中间。这是一个很好的猜测,但有时会失败。
这样做的好方法是什么?
找到离当前位置最近的路径段。
我是这样看的:
p0,p1
是路径线段端点
p
是你的位置
q'
3D 笛卡尔坐标系中直线上最近的点
q
被球面投影q'
校正
所以:
- 将点转换为 3D 直角坐标
计算点和线的垂直距离
q'=p0+(dot(p-p0,p1-p0)*(p1-p0)/(|p-p0|*|p1-p0|))
perpendicular_distance = |p-q'|
找到最小的段 perpendicular_distance
并仅将其用于其余的子弹
计算q
如果您使用 sphere 而不是 ellipsoid 那么您已经知道半径,如果不知道,那么要么用代数方式计算半径,要么使用平均值:
r=0.5*(|p0-(0,0,0)|+|p1-(0,0,0)|)
假设 (0,0,0)
是地球的中心。如果按位置加权也可以更精确:
w=|q'-p0|/|p1-p0|
r=(1-w)*|p0-(0,0,0)|+w*|p1-(0,0,0)|
现在只需更正q'
的位置
q=q'*r/|q'|
设置矢量 q'
为 q
大小 r
如果不够明显。也 |p0-(0,0,0)|=|p0|
显然,但我想确保你明白我是怎么得到它的...
将q
从笛卡尔坐标转换为球坐标
[注释]
|a|
是矢量 a
的大小,如下所示:|a|=sqrt(ax*ax+ay*ay+az*az)
dot(a,b)
是向量 a,b
的点积,如下所示:dot(a,b)=(a.b)=ax*bx+ay*by+az*bz
如果您的路径形状不是太复杂,那么您可以使用二进制搜索来找到最近的路段。
对于距离比较,您不需要 sqrt
...
假设我有一个包含描述路径的点 (lat, lon)
的有序数组,还有一个描述我当前位置的点 (lat, lon)
。
如何将点投影到路径上(并将点放在数组中的适当位置)?
我尝试的只是简单地搜索最近的两个点并假设它在它们的中间。这是一个很好的猜测,但有时会失败。
这样做的好方法是什么?
找到离当前位置最近的路径段。
我是这样看的:
p0,p1
是路径线段端点p
是你的位置q'
3D 笛卡尔坐标系中直线上最近的点q
被球面投影q'
校正
所以:
- 将点转换为 3D 直角坐标
计算点和线的垂直距离
q'=p0+(dot(p-p0,p1-p0)*(p1-p0)/(|p-p0|*|p1-p0|))
perpendicular_distance = |p-q'|
找到最小的段 perpendicular_distance
并仅将其用于其余的子弹
计算
q
如果您使用 sphere 而不是 ellipsoid 那么您已经知道半径,如果不知道,那么要么用代数方式计算半径,要么使用平均值:
r=0.5*(|p0-(0,0,0)|+|p1-(0,0,0)|)
假设
(0,0,0)
是地球的中心。如果按位置加权也可以更精确:w=|q'-p0|/|p1-p0| r=(1-w)*|p0-(0,0,0)|+w*|p1-(0,0,0)|
现在只需更正
的位置q'
q=q'*r/|q'|
设置矢量
q'
为q
大小r
如果不够明显。也|p0-(0,0,0)|=|p0|
显然,但我想确保你明白我是怎么得到它的...将
q
从笛卡尔坐标转换为球坐标
[注释]
|a|
是矢量a
的大小,如下所示:|a|=sqrt(ax*ax+ay*ay+az*az)
dot(a,b)
是向量a,b
的点积,如下所示:dot(a,b)=(a.b)=ax*bx+ay*by+az*bz
如果您的路径形状不是太复杂,那么您可以使用二进制搜索来找到最近的路段。 对于距离比较,您不需要
sqrt
...