求直線與線段的交點


1,求點到直線的帶符號距離:

float getSignedDistance(點P,直線AB)

//求點P到直線AB的帶符號距離(當P在AB左側時距離為正,右側時為負)

{

  dir=直線AB的方向向量

  根據dir求出直線AB的左手法線向量leftNormal = (-dir.y,dir.x).normalized

  線段AP在leftNormal上的投影即為P到直線AB的帶符號距離:

  signedDistance=dot(AP,leftNormal);

  return signedDistance;

}

2,求直線與線段的交點:

vector2 getIntersectPoint(直線PQ,段線AB)//求直線PQ與線段AB的交點
    

{

    求A到直線PQ的帶符號距離d1
        d1=getSignedDistance(A,直線PQ);

    求B到直線PQ的帶符號距離d2
        d2=getSignedDistance(B,直線PQ);
        if(d1與d2異號或其中至少有一個為0){//交點存在,假設交點為M

    求A到直線PQ的距離
            D1=|d1|

    求B到直線PQ的距離
            D2=|d2|
            if(D1+D2!=0){

       求線段AM占段線AB的比例k
                k=D1/(D1+D2);
            }else{//D1+D2==0,即D1和D2均為0,也就是說段線AB與直線PQ重合
                k=0.5;//線段AM占線段AB的比例可以是0到1的任意數,就當他是0.5吧!    
            }
            有了線段AM點AB的比例k,就可以求出M了:
          

     M = A + (B - A) * k;


            return Mid;


        }  else {//交點不存在
 

            return 交點不存在
  

    }


}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM