1. 程式人生 > >點到線段最短距離的演算法

點到線段最短距離的演算法

double computer(CPoint p1,CPoint p2,CPoint p0) {        double S;//S表示面積        double distance1,distance2,distance3,distance;     double sdis1,sdis2,sdis3;//距離平方        double retValue ,temp;        sdis1 = (p1.x-p0.x)*(p1.x-p0.x) + (p1.y-p0.y)*(p1.y-p0.y);        sdis2 = (p2.x-p0.x)*(p2.x-p0.x) + (p2.y-p0.y)*(p2.y-p0.y);        sdis3 = (p2.x-p1.x)*(p2.x-p1.x) + (p2.y-p1.y)*(p2.y-p1.y);
       distance1 = sqrt( sdis1 );//p1和p0之間的距離        distance2 = sqrt( sdis2 );//p2和p0之間的距離     distance3 = sqrt( sdis3 );//p2和p1之間的距離        if( (distance1+distance2) == distance3 )//線上段內部               distance= 0;        else if( (distance1+distance3) == distance2 )//在p2p1的延長線上               distance= distance1 ;
       else if( (distance2+distance3) == distance1 )//在p1p2的延長線上               distance= distance2 ;        else if( (sdis1+sdis3) < sdis2 )         distance= distance1 ;     else if( (sdis2+sdis3) < sdis1 )         distance= distance2 ;              else        {                temp = (distance1 + distance2 +distance3)/2;
         S = sqrt(temp*(temp-distance1)*(temp-distance2)*(temp-distance3));          distance= (2 * S) / distance3;        }     return distance; } 浮點數比較按理是不應該用==的,不過似乎沒出錯,所以就將就了。