计算三维空间点到线段的最短距离
创作时间:
作者:
@小白创作中心
计算三维空间点到线段的最短距离
引用
CSDN
1.
https://blog.csdn.net/yangyoung4/article/details/124820050
在三维空间中,计算一个点到线段的最短距离是一个常见的问题,特别是在计算机图形学、游戏开发等领域。与计算点到直线的距离不同,线段是有限长度的,因此需要考虑线段的端点。本文将详细介绍如何通过向量运算来计算点到线段的最短距离,并提供具体的代码实现。
理论推导
假设我们有线段AB和点P,我们需要计算点P到线段AB的最短距离。根据几何关系,可以将问题分为以下三种情况:
- 点P在AB的延长线上(即点P到线段AB的投影落在BA的延长线上)
- 点P在AB的反向延长线上(即点P到线段AB的投影落在AB的延长线上)
- 点P到线段AB的投影在线段AB上
对于这三种情况,我们可以使用向量运算来统一处理。设向量AD为点P到线段AB的投影向量,可以表示为:
$$
\vec{AD} = r \cdot \vec{AB}
$$
其中,$r$是一个标量,可以通过以下公式计算:
$$
r = \frac{\vec{AP} \cdot \vec{AB}}{|\vec{AB}|^2}
$$
根据$r$的值,我们可以判断点P的位置:
- 如果$r < 0$,说明点P在BA的延长线上,最短距离为$|\vec{AP}|$
- 如果$r > 1$,说明点P在AB的延长线上,最短距离为$|\vec{BP}|$
- 如果$0 \leq r \leq 1$,说明点P到线段AB的投影在线段AB上,最短距离为$|\vec{PD}|$
其中,$|\vec{PD}|$可以通过向量叉乘计算:
$$
|\vec{PD}| = \frac{|\vec{AP} \times \vec{AB}|}{|\vec{AB}|}
$$
代码实现
基于上述理论,我们可以编写一个函数来计算点到线段的最短距离。以下是JavaScript实现:
function distanceParallel(A, B, P) {
// AB为线段的两个端点坐标,P为待测点坐标
let res;
const AB = [A[0] - B[0], A[1] - B[1], A[2] - B[2]];
const AP = [A[0] - P[0], A[1] - P[1], A[2] - P[2]];
const r = dot(AP, AB) / (mold(AB) * mold(AB));
if (r <= 0) {
res = mold(AP); // 在BA延长线上
} else if (r >= 1) {
res = mold([B[0] - P[0], B[1] - P[1], B[2] - P[2]]); // 在AB延长线上
} else {
res = pointIsOnLine(A, B, P);
}
return res;
}
function pointIsOnLine(A, B, P) {
const AP = [A[0] - P[0], A[1] - P[1], A[2] - P[2]];
const AB = [A[0] - B[0], A[1] - B[1], A[2] - B[2]];
return mold(cross(AP, AB)) / mold(AB);
}
// 向量点积函数
function dot(v1, v2) {
return v1[0] * v2[0] + v1[1] * v2[1] + v1[2] * v2[2];
}
// 向量模函数
function mold(v) {
return Math.sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]);
}
// 向量叉乘函数
function cross(v1, v2) {
return [
v1[1] * v2[2] - v1[2] * v2[1],
v1[2] * v2[0] - v1[0] * v2[2],
v1[0] * v2[1] - v1[1] * v2[0]
];
}
这段代码中包含了计算向量点积、模和叉乘的辅助函数,这些函数在计算点到线段距离时会用到。
总结
通过向量运算,我们可以简洁高效地计算三维空间中点到线段的最短距离。这种方法不仅适用于计算机图形学中的碰撞检测,还可以应用于各种需要计算几何关系的场景。希望本文能帮助读者更好地理解这一算法,并在实际项目中加以应用。
热门推荐
揭秘明星保镖:聚光灯下的守护者
好名字的标准与精髓:传统文化与现代审美的完美结合
亲子沟通雷区:这些话,你是不是也说过?
三亚尾波冲浪:明星网红都爱的水上新宠!
结婚买的五金是哪五金?结婚买五金的由来,你了解吗?
《逃生3》:丧尸对声音的反应让玩家心跳加速
《往日不再》:丧尸听觉大揭秘!
《生化围城》里的丧尸为何怕声音?
《行尸走肉》揭秘:丧尸为何怕声音?
苏州最美自驾路线!昆山环湖大道入选江苏十大自驾游线路
熟鸡蛋能放几天?储存小技巧让你安心食用
带娃打卡曼谷野生动物园海豚秀!
三亚亚龙湾:夜生活新玩法大揭秘!
亚龙湾夜景打卡:你的摄影技巧够格吗?
台州1号公路牛尾塘示范段:国庆打卡新去处,滨海度假好选择
白天看世遗、晚上赏非遗,泉州Citywalk在烟火中遇到仙
LVMH继承人德尔菲娜:如何在财富与生活中找到平衡
上海财经大学张学良:“四通”发展助力南通进一步连接长三角
贵州夏季自驾游,这些宝藏景点你不能错过!
纽约上州夏日自驾游攻略大揭秘!
夏季自驾游,机油刹车胎压一个都不能少!
以创新姿态迎接首个非遗中国年,2025《辽视春晚》一展包容自信的开放胸怀
东北10日游最佳路线,东北旅游必去十大景点推荐,东北玩10天价格
筑牢生态屏障 永续发展宝藏——长白山奏鸣“绿色交响曲”
15个夜景打卡地5条夜游线路出炉 重庆魅力夜景成为彰显城市活力新引擎
如何正确贴春联?
康达医院教你如何处理被狗抓伤
被宠物咬了?24小时打疫苗别犹豫!
冬季养生:防一氧化碳中毒,科学进补找专家
郑州必打卡:胡辣汤、生煎包、烩面哪家强?