求一个点到一条线的垂直交点

Posted on 2008-12-25 11:21 Herbert 阅读(1395) 评论(1)  编辑 收藏 引用
 

假设 p2( x, y, z) 是该点,线的某坐标位置是 p1( x0, y0, z0), 线的向量是 v(xv, yv, zv)。求垂直交点 p3(xd, yd, zd)。如下图所示:

 

解:设有一个n,使得:

       x0 + n * xv = xd;          1

        y0 + n * yv = yd;          2

        z0 + n * zv = zd;           3

 

如下图所示:

 

p2p3的距离为 len2, p1p2的距离为len1 p3p1的距离为 len3。则有

len2 2 + len3 2  = len1 2              4

 

  又:

 len1 2  = ( x – x0 ) 2 + ( y – y0) 2 + ( z – z0) 2                                5

  len2 2  = ( xd – x ) 2 + ( yd – y) 2 + ( zd – z) 2                               6

len3 2  = ( xd – x 0) 2 + ( yd – y0) 2 + ( zd – z0) 2                         7

 

 

1 ~7 求得 n

 

n 分别带入 1 、式2 3即可求得 p3 ( xd, yd, zd)


代码实现如下:

GetPlumbPoint//------------------------------------------------------------
//desc: 获得一个点到一条直线的垂直线的交点
//param: vOut 输出所求交点
//param: vPoint 直线外面的一个点
//param: vLineNor 直线的向量
//param: vLinePoint 直线上任意一个点
//------------------------------------------------------------

  static void GetPlumbPoint(D3DXVECTOR3 & vOut, D3DXVECTOR3 vPoint, D3DXVECTOR3 vLineNor, D3DXVECTOR3 vLinePoint)
 {
  float n, nu, nd; // x` = x0 + n * xv;  y` = y0 + n * yv;  z` = z0 + n * zv;
  nu = ( vPoint.x - vLinePoint.x) * vLineNor.x +
   ( vPoint.y - vLinePoint.y) * vLineNor.y +
   ( vPoint.z - vLinePoint.z) * vLineNor.z;

  nd = vLineNor.x * vLineNor.x + vLineNor.y * vLineNor.y + vLineNor.z * vLineNor.z;

  n = nu / nd;

  vOut = vLinePoint + vLineNor * n;
 }

 

Feedback

# re: 求一个点到一条线的垂直交点  回复  更多评论   

2015-08-30 18:37 by 放大
很有用

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理