//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;

}
Esempio n. 2
0
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;
}