unity3d:兩條線段相交并求交點(diǎn)坐標(biāo)
public static float Cross(Vector2 a, Vector2 b)
{
return a.x * b.y - b.x * a.y;
}
public static bool SegmentsInterPoint(Vector2 a, Vector2 b, Vector2 c, Vector2 d, ref Vector2 IntrPos)
{
//v1×v2=x1y2-y1x2
//以線段ab為準(zhǔn),是否c,d在同一側(cè)
Vector2 ab = b - a;
Vector2 ac = c - a;
float abXac = Cross(ab,ac);
Vector2 ad = d - a;
float abXad = Cross(ab, ad);
if (abXac * abXad >= 0)
{
return false;
}
//以線段cd為準(zhǔn),是否ab在同一側(cè)
Vector2 cd = d - c;
Vector2 ca = a - c;
Vector2 cb = b - c;
float cdXca = Cross(cd, ca);
float cdXcb = Cross(cd, cb);
if (cdXca * cdXcb >= 0)
{
return false;
}
//計(jì)算交點(diǎn)坐標(biāo)
float t = Cross(a -c, d -c) / Cross (d-c,b-a);
float dx = t * (b.x - a.x);
float dy = t * (b.y - a.y);
IntrPos = new Vector2() { x = a.x + dx, y = a.y + dy };
return true;
}
外積,又稱叉積,是向量代數(shù)(解析幾何)中的一個(gè)概念。兩個(gè)向量v1(x1, y1)和v2(x2, y2)的外積v1×v2=x1y2-y1x2。如果由v1到v2是順時(shí)針轉(zhuǎn)動(dòng),外積為負(fù),反之為正,為0表示二者方向相同(平行)。

abxac * abxad >= 0 說(shuō)明以ab線段為準(zhǔn),c,d兩點(diǎn)都在同一側(cè),說(shuō)明兩個(gè)線段不會(huì)相交
cdxca * cdxcb >=0 說(shuō)明以cd線段為準(zhǔn),a,b兩點(diǎn)都在同一側(cè),說(shuō)明兩個(gè)線段不會(huì)相交
交點(diǎn)為o

然后根據(jù)線段定義

以a為起點(diǎn),b-a為u, t為 ao/ab, 求出o點(diǎn)坐標(biāo)

posted on 2023-06-29 11:16 luoyikun 閱讀(476) 評(píng)論(0) 收藏 舉報(bào) 來(lái)源
浙公網(wǎng)安備 33010602011771號(hào)