二:线段知识点

——已知两个点: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;
    }
}