C#计算点到线距离,矩形重叠,重叠面积,相对方位

点到线的最短距离

直线公式:AX+BY+C=0
P点到AB距离如下

//点到线的距离
        public double GetDistanceP2L(Point pointA, Point pointB, Point pointP)
        {
            //直线公式 A*X+B*Y+C=0
            //点到直线公式
            //分子 绝对值|A*X`+B*Y~+C|
            //分母 A*A+B*B 开方
            int A = pointA.Y - pointB.Y;
            int B = pointB.X - pointA.X;
            int C = pointA.X * pointB.Y - pointA.Y * pointB.X;
            //点到直线公式
            return Math.Abs(A * pointP.X + B * pointP.Y + C) / Math.Sqrt(A * A + B * B);
        }

判断两个矩形是否重叠,Rectangle和RectangleF精度不同而已

重叠类别

算法逻辑,方框1的右小角X和Y坐标肯定大于方框2的左上角X和Y的坐标。

public bool IsOverLap(RectangleF rc1, RectangleF rc2)
{
    if (rc1.X + rc1.Width > rc2.X &&
        rc2.X + rc2.Width > rc1.X &&
        rc1.Y + rc1.Height > rc2.Y &&
        rc2.Y + rc2.Height > rc1.Y)
        return true;
    else
        return false;
}

计算两个矩形重叠面积

只要求出重叠区域的宽和高就可以求出面积(像素面积),也是小学数学题。


重叠面积

1.求宽举例,即A1B2长度。
2.便于理解,把坐标系原点移动到A点。相当于A坐标(0,0)
3.B的X轴坐标就是AB长度,B1的X轴坐标,就是CC2长度+A1B1长度。
4.A1B2=AB+A1B1-(B1的X轴坐标)
代码如下

public static float AreaOverLap(RectangleF rc1, RectangleF rc2)
{
    var minX = Math.Min(rc1.X,rc2.X);
    var maxX = Math.Max(rc1.X+rc1.Width,rc2.X+rc2.Width);
    var width = rc1.Width + rc2.Width - (maxX - minX);
    var minY = Math.Min(rc1.Y, rc2.Y);
    var maxY = Math.Max(rc1.Y + rc1.Height, rc2.Y + rc2.Height);
    var height = rc1.Height + rc2.Height - (maxY - minY);

    if (width <= 0 || height <= 0)
        return 0;
    else
        return width * height;
}

计算两个矩形的相对位置,矩形A在矩形B的左上方、右下方等

相对位置

求出两个矩形分别的中心点,即可判断相对位置。

public Tuple RelativePosition(RectangleF rc1, RectangleF rc2)
{
    //返回rc1相对于rc2位置
    var core1X = rc1.X + (rc1.Width / 2);
    var core1Y = rc1.Y + (rc1.Height / 2);
    var core2X = rc2.X + (rc2.Width / 2);
    var core2Y = rc2.Y + (rc2.Height / 2);
    var positionX = Position.None;
    var positionY = Position.None;
    if (core1X > core2X)
        positionX = Position.Right;
    else if (core1X < core2X)
        positionX = Position.Left;
    if (core1Y > core2Y)
        positionY = Position.Bottom;
    else if(core1Y < core2Y)
        positionY = Position.Top;
    return new(positionX, positionY);
}

ps:Rectangle 非任意四点组成的四边形,是四边平行于X轴或Y轴的四边形

你可能感兴趣的:(C#计算点到线距离,矩形重叠,重叠面积,相对方位)