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 交點不存在
}
}