QT计算鼠标到线段的距离
时间: 2024-05-07 14:19:34 浏览: 64
求点到线段的距离
计算鼠标到线段的距离需要分两种情况考虑:鼠标到线段垂足在线段上和鼠标到线段垂足不在线段上。
如果鼠标到线段垂足在线段上,可以直接计算出距离;如果不在线段上,则需要判断鼠标到线段两个端点的距离,取最小值作为距离。
以下是一个简单的实现:
```c++
#include <QPointF>
#include <QLineF>
#include <cmath>
// 计算点到线段的距离
double distanceToLineSegment(QPointF p, QLineF line)
{
// 计算线段的长度
double lineLength = line.length();
// 如果线段长度为0,则返回点与线段起点的距离
if (lineLength == 0.0)
return QPointF::dotProduct(p - line.p1(), p - line.p1());
// 计算点到线段起点的向量
QPointF v = p - line.p1();
// 计算点到线段终点的向量
QPointF w = line.p2() - line.p1();
// 计算点到线段起点的投影长度
double t = QPointF::dotProduct(v, w) / (lineLength * lineLength);
// 如果点到线段起点的投影长度小于0,则返回点与线段起点的距离
if (t < 0.0)
return QPointF::dotProduct(v, v);
// 如果点到线段终点的投影长度大于1,则返回点与线段终点的距离
if (t > 1.0)
return QPointF::dotProduct(p - line.p2(), p - line.p2());
// 计算点到线段的垂足
QPointF foot = line.p1() + t * w;
// 返回点到线段垂足的距离
return QPointF::dotProduct(p - foot, p - foot);
}
```
其中,`QPointF` 表示一个二维点,`QLineF` 表示一条线段。函数 `QPointF::dotProduct(QPointF)` 表示两个向量的点积,即 $x_1 y_1 + x_2 y_2$。函数 `QPointF::length()` 表示向量的长度,即 $\sqrt{x^2+y^2}$。
阅读全文