求点到直线的距离

关于点到直线的距离,在vtkLine中有一个方法:DistanceToLine


用法:

	double 	closestPt1[3];
	double  	t1[3];
	double dist0 = vtkLine::DistanceToLine(seed,first_seed,second_seed,*t1,closestPt1);

接下来把这个方法选出来,我们看看作者是怎么实现的。

double vtkLine::DistanceToLine (double x[3], double p1[3], double p2[3])
{
  int i;
  double np1[3], p1p2[3], proj, den;

  for (i=0; i<3; i++) 
    {
    np1[i] = x[i] - p1[i];//向量 x - p1
    p1p2[i] = p1[i] - p2[i];//向量 p1 - p2
    }

  if ( (den=vtkMath::Norm(p1p2)) != 0.0 )//如果不垂直
    {
    for (i=0; i<3; i++)
      {
      p1p2[i] /= den;//单位向量
      }
    }
  else
    {
    return vtkMath::Dot(np1,np1);//垂直后距离只能这么求了
    }

  proj = vtkMath::Dot(np1,p1p2);//不垂直继续, dot向量点乘 ,这里的p1p2已经变成了单位向量!

  return (vtkMath::Dot(np1,np1) - proj*proj);//p1-x之间的距离 , P1-o之间的距离。敲黑板!!!注意,这个返回的值不是距离,是距离的平方!!!
}

尽管上面的注释已经很清楚了,我觉得还是有必要用列举关键词描述一下思维的过程,谁让当初的数学都已经完美的还给体育老师了呢?

关键词:

1. 用向量求;

2. 分两种情况:垂直,不垂直;

3. dot  向量点乘

4. 勾股定理

如果垂直,则 |XP1| 就是点到直线的距离;

如果不垂直,则 |XO|为直角三角形XOP1的一个直角边,|XO|^2 = |XP1|^2 - |P1O|^2;接下来求 |P1O| =  向量P1X 与 (向量P1P2的单位向量)的 点乘;


这个月明显有点忙,这才是第一篇,惭愧。

想做的太多,而能做的又太少。


参考文献:

1.http://blog.youkuaiyun.com/dcrmg/article/details/52416832


在Qt C++中,解QPointF点到QLineF直线的距离,通常需要利用向量几何的知识。这里是一个简单的步骤描述: 1. 获取直线(QLineF)的起点(p1)和终点(p2),以及你要查找距离的目标点(point)。 ```cpp QPointF p1 = line.p1(); QPointF p2 = line.p2(); QPointF point = ...; // 要找距离的点 ``` 2. 计算直线的方向向量(vector): ```cpp QPointF vector = p2 - p1; ``` 3. 使用点到向量的投影来找到点到直线的最短距离(perpendicular projection)。这是通过将点减去起点,然后与向量做内积除以向量的长度得到的: ```cpp float proj = QVector2D::dotProduct(point - p1, vector) / vector.length(); ``` 注意:`QVector2D::dotProduct`用于向量点积,`length()`用于获取向量长度。 4. 判断投影是否落在直线范围内。如果投影小于0,意味着点在直线左边;如果大于向量长度,意味着点在直线右边。取这两个情况之外的值作为垂直距离: ```cpp if (proj < 0) proj = 0; else if (proj > vector.length()) proj = vector.length(); ``` 5. 最后的距离是垂直距离加上或减去投影的正负(取决于点是在直线上方还是下方): ```cpp qreal distance = sqrt(vector.length() * vector.length() - proj * proj); ``` `sqrt`函数用于计算平方根。 完整代码示例: ```cpp qreal pointToLineDistance(QLineF line, QPointF point) { QPointF p1 = line.p1(); QPointF p2 = line.p2(); QPointF vector = p2 - p1; float proj = QVector2D::dotProduct(point - p1, vector) / vector.length(); if (proj < 0) proj = 0; else if (proj > vector.length()) proj = vector.length(); qreal distance = sqrt(vector.length() * vector.length() - proj * proj); return distance; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值