Unity中的數學基礎——線段

二:線段知識點

——已知兩個點:P1(x1, y1),P2(x2, y2)在直線方程爲ax+b=y的直線上,求a和b的值

由ax1+b=y1和ax2+b=y2得
=> y1-ax1=y2-ax2
=> y1-y2=ax1-ax2
=> ax1-ax2=y1-y2
=> (x1-x2)a=y1-y2
=> a=(y1-y2)/(x1-x2)

將a=(y1-y2)/(x1-x2)代入ax1+b=y1中得
=> (y1-y2)/(x1-x2)*x1+b = y1
=> b=y1-x1*(y1-y2)/(x1-x2)

上面的公式只在兩個點的x與y都不相等的情況下有效
當兩個點的x座標相等時,與Y軸平行,則x=x1或x=x2
當兩個點的y座標相等時,與X軸平行,則y=y1或y=y2
當兩個點的x與y都相等時,兩個點重合而不是一條線段

 


——已知兩條直線的方程a1x+b1=y和a2x+b2=y,求這兩條直線的交點

由a1x+b1=y和a2x+b2=y得
=> a1x+b1=a2x+b2
=> (a1-a2)x=b2-b1
=> x=(b2-b1)/(a1-a2)

將x=(b2-b1)/(a1-a2)代入a1x+b1=y得
=> y=a1*(b2-b1)/(a1-a2)+b1

上面的公式只在兩個直線的a1與a2不相等並且b1與b2不相等的情況下有效
當a1與a2相等並且b1與b2也相等時,兩條直線共線,沒有交點
當a1與a2相等,b1與b2不相等時,兩條直線平行,沒有交點
當a1與a2不相等,b1與b2相等時,兩條直線相交於Y軸的b1或b2點,有交點


三:Unity實現擴展方法

輸入四個點的座標,求出兩條線段的交點座標

/// <summary>
/// 給定四個點,求兩條線段的交點(y=a1x+b1,y=a2x+b2)
/// </summary>
private Vector2 CalculateCrossPoint(Vector2 v1, Vector2 v2, Vector2 v3, Vector2 v4)
{
    float a1 = 0, b1 = 0, a2 = 0, b2 = 0;
    Vector2 crossPoint = Vector2.zero;

    if (v1.x != v2.x)
    {
        a1 = (v1.y - v2.y) / (v1.x - v2.x);
    }
    if (v1.y != v2.y)
    {
        b1 = v1.y - v1.x * (v1.y - v2.y) / (v1.x - v2.x);
    }

    if (v3.x != v4.x)
    {
        a2 = (v3.y - v4.y) / (v3.x - v4.x);
    }
    if (v3.y != v4.y)
    {
        b2 = v3.y - v3.x * (v3.y - v4.y) / (v3.x - v4.x);
    }

    if (a1 == a2 && b1 == b2)
    {
        Debug.LogWarning("兩條線共線,沒有交點");
        return Vector2.zero;
    }
    else if (a1 == a2)
    {
        Debug.LogWarning("兩條線平行,沒有交點");
        return Vector2.zero;
    }
    else
    {
        float x = (b2 - b1) / (a1 - a2);
        float y = a1 * (b2 - b1) / (a1 - a2) + b1;
        crossPoint = new Vector2(x, y);
        return crossPoint;
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章