//Closest Point to ... D3DXVECTOR3 ClosestPtOnPolygon(D3DXVECTOR3 A, D3DXVECTOR3 B, D3DXVECTOR3 C, D3DXVECTOR3 P) { D3DXVECTOR3 Rab = ClosestPtOnLine(A, B, P); D3DXVECTOR3 Rbc = ClosestPtOnLine(B, C, P); D3DXVECTOR3 Rca = ClosestPtOnLine(C, A, P); D3DXVECTOR3 vDist0 = Rab - P; float SqDist0 = D3DXVec3LengthSq(&vDist0); D3DXVECTOR3 vDist1 = Rbc - P; float SqDist1 = D3DXVec3LengthSq(&vDist1); D3DXVECTOR3 vDist2 = Rca - P; float SqDist2 = D3DXVec3LengthSq(&vDist2); float Min = FLT_MAX; D3DXVECTOR3 pClosest; if(SqDist0 <= Min) { Min = SqDist0; pClosest = Rab; } if(SqDist1 <= Min) { Min = SqDist1; pClosest = Rbc; } if(SqDist2 <= Min) { Min = SqDist2; pClosest = Rca; } return pClosest; }
double Utils::DistPtFromLine( double ptx, double pty, double px, double py, double vx, double vy ) { double t = ClosestPtOnLine(ptx, pty, px, py, vx, vy); double qx = px + vx * t; double qy = py + vy * t; double dist = hypot(ptx - qx, pty - qy); return dist; }