点到线的最短距离
直线公式: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<Position, Position> 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轴的四边形