功能:已知一点,一条直线求垂足

//功能:已知一点,一条直线求垂足 //参数: //CPoint pt1,直线起始点 //CPoint pt2,直线终止点 //CPoint pt3,直线外一点 //CPoint &ptOut,输出的垂足 void CCQGrapView::Getplumb(CPoint pt1,CPoint pt2,CPoint pt3,/*[Out]*/CPoint &ptOut) { double dba,dbb; //a = sqr( (x2 - x1)^2 +(y2 - y1)^2 ) dba = sqrt((long double)((pt2.x - pt1.x) * (pt2.x - pt1.x) + (pt2.y - pt1.y) * (pt2.y - pt1.y) )); //b = (x2-x1) * (x3-x1) +(y2 -y1) * (y3 -y1) dbb = ((pt2.x - pt1.x) * (pt3.x -pt1.x) + (pt2.y - pt1.y) * (pt3.y - pt1.y) ); //a = b / (a*a) dba = dbb / (dba * dba); //x4 = x1 +(x2 - x1)*a ptOut.x = pt1.x + (pt2.x - pt1.x) * dba; //y4 = y1 +(y2 - y1)*a ptOut.y = pt1.y + (pt2.y - pt1.y) * dba; return; } /////////////////////////////////////////////////////////////////////////////////////////////////////////// Public Function m_ptCD(m_pt1() As Double, m_pt2() As Double, m_pt3() As Double, m_pt4() As Double) '给定空间三点pt1,pt2 pt3,求出pt3到直线pt1-pt2的垂足点pt4 Dim m_a As Double, m_b As Double m_a = Sqr((m_pt2(0) - m_pt1(0)) * (m_pt2(0) - m_pt1(0)) + _ (m_pt2(1) - m_pt1(1)) * (m_pt2(1) - m_pt1(1)) + _ (m_pt2(2) - m_pt1(2)) * (m_pt2(2) - m_pt1(2))) m_b = (m_pt2(0) - m_pt1(0)) * (m_pt3(0) - m_pt1(0)) + _ (m_pt2(1) - m_pt1(1)) * (m_pt3(1) - m_pt1(1)) + _ (m_pt2(2) - m_pt1(2)) * (m_pt3(2) - m_pt1(2)) m_a = m_b / (m_a * m_a) m_pt4(0) = m_pt1(0) + (m_pt2(0) - m_pt1(0)) * m_a m_pt4(1) = m_pt1(1) + (m_pt2(1) - m_pt1(1)) * m_a m_pt4(2) = m_pt1(2) + (m_pt2(2) - m_pt1(2)) * m_a End Function /////////////////////////////////////////////////////////////////////////////////////////////////////////////// BOOL CSCLine::IsSelLine(CPoint pt/*鼠标点击点*/,CPoint p1,CPoint p2/*直线的两个端点*/) { ///////////////////////////////////////////////// int x=pt.x,y=pt.y; int x1=p1.x,y1=p1.y; int x2=p2.x,y2=p2.y; //如果点击不在区域中,则返回FALSE if(!PtInRect(CRect((x1<=x2?x1:x2)-5, (y1<=y2?y1:y2)-5, (x1>x2?x1:x2)+5, (y1>y2?y1:y2)+5),pt)) return FALSE; //计算距离 double d; double sq = sqrt(y1*y1+x1*x1); if(sq==0) { d = sqrt(x*x+y*y); } else d = fabs((y1-y2)*x+(x2-x1)*y+x1*y2-x2*y1)/sq; if(d<5) return TRUE;//误差值,也可以通过函数参数传进来。 else return FALSE; } ---------------------

你可能感兴趣的:(功能:已知一点,一条直线求垂足)