原理是兩點確定一條直線,利用公式 y = ax+b 去計算然後根據與直線方程Ax+By+C=0(A≠0,B≠0)垂直的直線方程是Bx-Ay+m = 0,(m是參變數)的原理求出垂線方程的m值,然後根據兩個直線方程求出交點座標.其中pt1和pt2為已知的兩個在直線上的點,pt3為垂線上的點座標ptCross為獲取的交點座標[cpp] view plaincopyprint?/** @ brief 根據兩點求出垂線過第三點的直線的交點 @ param pt1 直線上的第一個點 @ param pt2 直線上的第二個點 @ param pt3 垂線上的點 @ return 返回點到直線的垂直交點座標 */ QPointF test(const QPointF &pt1,const QPointF &pt2,const QPointF &pt3) { qreal A = (pt1.y()-pt2.y())/(pt1.x()- pt2.x()); qreal B = (pt1.y()-A*pt1.y()); /// > 0 = ax +b -y; 對應垂線方程為 -x -ay + m = 0;(mm為係數) /// > A = a; B = b; qreal m = pt3.x() + A*pt3.y(); /// 求兩直線交點座標 QPointF ptCross; ptCross.setX((m-A*B)/(A*A + 1)); ptCross.setY(A*ptCross.x()+B); return ptCross; } /** @ brief 根據兩點求出垂線過第三點的直線的交點 @ param pt1 直線上的第一個點 @ param pt2 直線上的第二個點 @ param pt3 垂線上的點 @ return 返回點到直線的垂直交點座標 */ QPointF test(const QPointF &pt1,const QPointF &pt2,const QPointF &pt3) { qreal A = (pt1.y()-pt2.y())/(pt1.x()- pt2.x()); qreal B = (pt1.y()-A*pt1.y()); /// > 0 = ax +b -y; 對應垂線方程為 -x -ay + m = 0;(mm為係數) /// > A = a; B = b; qreal m = pt3.x() + A*pt3.y(); /// 求兩直線交點座標 QPointF ptCross; ptCross.setX((m-A*B)/(A*A + 1)); ptCross.setY(A*ptCross.x()+B); return ptCross; }點到直線距離為,使用公式,(點p0(x0,y0),直線L公式為)[cpp] view plaincopyprint?qreal test2(const QPointF &pt1,const QPointF &pt2,const QPointF &pt3) { qreal A = (pt1.y()-pt2.y())/(pt1.x()- pt2.x()); qreal B = (pt1.y()-A*pt1.y()); /// > 0 = ax +b -y; return qAbs(A*pt3.x() + B -pt3.y())/sqrt(A*A + 1); }
原理是兩點確定一條直線,利用公式 y = ax+b 去計算然後根據與直線方程Ax+By+C=0(A≠0,B≠0)垂直的直線方程是Bx-Ay+m = 0,(m是參變數)的原理求出垂線方程的m值,然後根據兩個直線方程求出交點座標.其中pt1和pt2為已知的兩個在直線上的點,pt3為垂線上的點座標ptCross為獲取的交點座標[cpp] view plaincopyprint?/** @ brief 根據兩點求出垂線過第三點的直線的交點 @ param pt1 直線上的第一個點 @ param pt2 直線上的第二個點 @ param pt3 垂線上的點 @ return 返回點到直線的垂直交點座標 */ QPointF test(const QPointF &pt1,const QPointF &pt2,const QPointF &pt3) { qreal A = (pt1.y()-pt2.y())/(pt1.x()- pt2.x()); qreal B = (pt1.y()-A*pt1.y()); /// > 0 = ax +b -y; 對應垂線方程為 -x -ay + m = 0;(mm為係數) /// > A = a; B = b; qreal m = pt3.x() + A*pt3.y(); /// 求兩直線交點座標 QPointF ptCross; ptCross.setX((m-A*B)/(A*A + 1)); ptCross.setY(A*ptCross.x()+B); return ptCross; } /** @ brief 根據兩點求出垂線過第三點的直線的交點 @ param pt1 直線上的第一個點 @ param pt2 直線上的第二個點 @ param pt3 垂線上的點 @ return 返回點到直線的垂直交點座標 */ QPointF test(const QPointF &pt1,const QPointF &pt2,const QPointF &pt3) { qreal A = (pt1.y()-pt2.y())/(pt1.x()- pt2.x()); qreal B = (pt1.y()-A*pt1.y()); /// > 0 = ax +b -y; 對應垂線方程為 -x -ay + m = 0;(mm為係數) /// > A = a; B = b; qreal m = pt3.x() + A*pt3.y(); /// 求兩直線交點座標 QPointF ptCross; ptCross.setX((m-A*B)/(A*A + 1)); ptCross.setY(A*ptCross.x()+B); return ptCross; }點到直線距離為,使用公式,(點p0(x0,y0),直線L公式為)[cpp] view plaincopyprint?qreal test2(const QPointF &pt1,const QPointF &pt2,const QPointF &pt3) { qreal A = (pt1.y()-pt2.y())/(pt1.x()- pt2.x()); qreal B = (pt1.y()-A*pt1.y()); /// > 0 = ax +b -y; return qAbs(A*pt3.x() + B -pt3.y())/sqrt(A*A + 1); }