这里不做详细公式推导,主要是我也忘了
只列出代码,方便以后使用
该函数依赖于已知一个点和一个线段,求点到线段的垂足 - 掘金 (juejin.cn)
QPointF CMeasureAlgorithm::getPointFromParallelLine(const QPointF& p, const QPointF& base, const QLineF& l)
{
QPointF foot = perpendicularFoot(base, l);
QPointF dirfb = base - foot;
QPointF dirbp = p - base;
if (std::fabs(QPointF::dotProduct(dirfb, dirbp)) == 0.0f) {
return p;
}
QPointF dir01 = l.p2() - l.p1();
float lenbp = normQPointF(dirbp);
float len01 = normQPointF(dir01);
float cosVal = QPointF::dotProduct(dirbp, dir01) / (lenbp * len01);
float proLenbp = lenbp * cosVal; // 在平行线上的投影长度
QPointF shift = (dir01 / len01) * proLenbp;
QPointF res = base + shift;
return res;
}
基于Qt实现