一、问题描述:
任意给一个圆的圆心A坐标(x2,y2)和圆的半径r,矩形的中心坐标B(x1,y1)和长L,宽W,判断圆和矩形的位置关系
二、创建Method 方法类
矩形长一半LHalf和宽一半WHalf,
double LHalf = L / 2;
double WHalf = W / 2;
首先创建一个Method 方法类:判断圆和矩形的位置关系(矩形包含在圆内、圆包含在矩形内,相交,相离) 该类的方法需满足条件:X2>=X1;Y2>=Y1 有5种情况,
分别对5种情况进行判断
情况1:圆心位置在矩形内
情况2:圆心在矩形上方灰色小矩形内,小矩形的长和宽分别为Lhalf和r
情况3:圆心在矩形右边灰色小矩形内,小矩形的长和宽分别为whalf和r
情况4:圆心在右上角蓝色小矩形内,小矩形的长和宽分别为r
情况5:圆心在大矩形外,大矩形的长和宽分别为:Lhalf+r和whalf+r
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WindowsFormsApp1
{
class Method
{
public virtual string method(double X1, double Y1, double X2, double Y2, double L, double W, double r)
{
//矩形长一半LHalf和宽一半WHalf
double LHalf = L / 2;
double WHalf = W / 2;
double L3 = Math.Sqrt(Math.Pow(Math.Abs(Math.Abs(X2) - Math.Abs(X1)) + LHalf, 2) + Math.Pow(Math.Abs(Math.Abs(Y2) - Math.Abs(Y1)) + WHalf, 2));
string reout = null;
//情况1:圆心位置在矩形内
if (Math.Abs(X2 - X1) <= LHalf && Math.Abs(Y2 - Y1) <= WHalf)
{
if (Math.Abs(X2 - X1) + r > LHalf || Math.Abs(Y2 - Y1) + r > WHalf)
{ /*this.tbResult.Text = "圆和矩形相交";*/
string s = "圆和矩形相交";
reout += s;
return reout;
}
else if (r >= L3)
{
{ /*this.tbResult.Text = "矩形包含在圆内";*/
string s = "矩形包含在圆内";
reout += s;
return reout;
}
}
else
{
{ /*this.tbResult.Text = "圆包含在矩形内";*/
string s = "圆包含在矩形内";
reout += s;
return reout;
}
}
}
//情况2:圆心在矩形上方灰色小矩形内,小矩形的长和宽分别为Lhalf和r
else if (Math.Abs(Math.Abs(X2) - Math.Abs(X1)) < LHalf)
{
if (Math.Abs(Math.Abs(Y2) - Math.Abs(Y1)) < Math.Abs(Y1) + WHalf + r && Math.Abs(Math.Abs(Y2) - Math.Abs(Y1)) >= Math.Abs(Y1) + WHalf)
{
if (Math.Abs(Math.Abs(Y2) - Math.Abs(Y1)) <= WHalf + r && r < L3)
{
{ /*this.tbResult.Text = "圆和矩形相交";*/
string s = "圆和矩形相交";
reout += s;
return reout;
}
}
else if (r >= L3)
{
{ /*this.tbResult.Text = "矩形包含在圆内";*/
string s = "矩形包含在圆内";
reout += s;
return reout;
}
}
else
{
//this.tbResult.Text = "圆和矩形相离";
string s = "圆和矩形相离";
reout += s;
return reout;
}
}
}
//情况3:圆心在矩形右边灰色小矩形内,小矩形的长和宽分别为whalf和r
else if (Math.Abs(Math.Abs(Y2) - Math.Abs(Y1)) < WHalf)
{
//if (Math.Abs(Math.Abs(X2) - Math.Abs(X1)) > LHalf + Math.Abs(X1) && Math.Abs(Math.Abs(X2) - Math.Abs(X1)) <= Math.Abs(X1) + LHalf + r)
if (Math.Abs(Math.Abs(X2) - Math.Abs(X1)) > LHalf + Math.Abs(X1) )
{
if (Math.Abs(Math.Abs(X2) - Math.Abs(X1)) <= WHalf + r && r < L3)
{
{ /*this.tbResult.Text = "圆和矩形相交";*/
string s = "圆和矩形相交";
reout += s;
return reout;
}
}
else if (r >= L3)
{
{ /*this.tbResult.Text = "矩形包含在圆内";*/
string s = "矩形包含在圆内";
reout += s;
return reout;
}
}
else
{
//this.tbResult.Text = "圆和矩形相离";
string s = "圆和矩形相离";
reout += s;
return reout;
}
}
}
//情况4:圆心在右上角蓝色小矩形内,小矩形的长和宽分别为r
else if (Math.Abs(Math.Abs(Y2) - Math.Abs(Y1)) >= WHalf + Math.Abs(Y1) && Math.Abs(Math.Abs(Y2) - Math.Abs(Y1)) <= WHalf + Math.Abs(Y1) + r)
{
if (Math.Abs(Math.Abs(X2) - Math.Abs(X1)) >= LHalf + Math.Abs(X1) && Math.Abs(Math.Abs(X2) - Math.Abs(X1)) <= Math.Abs(X1) + LHalf + r)
{
//矩形到圆心的最短距离值为u
double u = Math.Sqrt(Math.Pow(Math.Abs(Math.Abs(X2) - Math.Abs(X1) - LHalf), 2) + Math.Pow(Math.Abs(Math.Abs(Y2) - Math.Abs(Y1) - WHalf), 2));
if (u <= r && r < L3)
{
{
//this.tbResult.Text = "圆和矩形相交";
string s = "圆和矩形相交";
reout += s;
return reout;
}
}
else if (r >= L3)
{
{
//this.tbResult.Text = "矩形包含在圆内";
string s = "矩形包含在圆内";
reout += s;
return reout;
}
}
else
{
//this.tbResult.Text = "圆和矩形相离";
string s = "圆和矩形相离";
reout += s;
return reout;
}
}
}
// 情况5:圆心在大矩形外,大矩形的长和宽分别为:Lhalf+r和whalf+r
else
{
//this.tbResult.Text = "圆和矩形相离";
string s = "圆和矩形相离";
reout += s;
return reout;
}
return reout;
}
}
}
2、1、情况1:圆心位置在矩形内
X2-X1+r >Lhalf || Y2 - Y1 +r<whalf,圆和矩形相交,
r>=L3,矩形包含在圆内,
其他情况圆包含在矩形内
//情况1:圆心位置在矩形内
if (Math.Abs(X2 - X1) <= LHalf && Math.Abs(Y2 - Y1) <= WHalf)
{
if (Math.Abs(X2 - X1) + r > LHalf || Math.Abs(Y2 - Y1) + r > WHalf)
{ /*this.tbResult.Text = "圆和矩形相交";*/
string s = "圆和矩形相交";
reout += s;
return reout;
}
else if (r >= L3)
{
{ /*this.tbResult.Text = "矩形包含在圆内";*/
string s = "矩形包含在圆内";
reout += s;
return reout;
}
}
else
{
{ /*this.tbResult.Text = "圆包含在矩形内";*/
string s = "圆包含在矩形内";
reout += s;
return reout;
}
}
}
2.2、情况2:圆心在矩形上方灰色小矩形内,小矩形的长和宽分别为Lhalf和r
(y2-y1)-whalf < =r && r<L3 圆和矩形相交,
r>=L3 矩形包含在圆内,
其他情况圆和矩形相离
//情况2:圆心在矩形上方灰色小矩形内,小矩形的长和宽分别为Lhalf和r
else if (Math.Abs(Math.Abs(X2) - Math.Abs(X1)) < LHalf)
{
if (Math.Abs(Math.Abs(Y2) - Math.Abs(Y1)) < Math.Abs(Y1) + WHalf + r && Math.Abs(Math.Abs(Y2) - Math.Abs(Y1)) >= Math.Abs(Y1) + WHalf)
{
if (Math.Abs(Math.Abs(Y2) - Math.Abs(Y1)) <= WHalf + r && r < L3)
{
{ /*this.tbResult.Text = "圆和矩形相交";*/
string s = "圆和矩形相交";
reout += s;
return reout;
}
}
else if (r >= L3)
{
{ /*this.tbResult.Text = "矩形包含在圆内";*/
string s = "矩形包含在圆内";
reout += s;
return reout;
}
}
else
{
//this.tbResult.Text = "圆和矩形相离";
string s = "圆和矩形相离";
reout += s;
return reout;
}
}
}
2.3、情况3:圆心在矩形右边灰色小矩形内,小矩形的长和宽分别为whalf和r
x2-x1-Lhalf<=r && r<L3,圆和矩形相交,
r>=L3矩形包含在圆内,
其他情况圆和矩形相离
//情况3:圆心在矩形右边灰色小矩形内,小矩形的长和宽分别为whalf和r
else if (Math.Abs(Math.Abs(Y2) - Math.Abs(Y1)) < WHalf)
{
//if (Math.Abs(Math.Abs(X2) - Math.Abs(X1)) > LHalf + Math.Abs(X1) && Math.Abs(Math.Abs(X2) - Math.Abs(X1)) <= Math.Abs(X1) + LHalf + r)
if (Math.Abs(Math.Abs(X2) - Math.Abs(X1)) > LHalf + Math.Abs(X1) )
{
if (Math.Abs(Math.Abs(X2) - Math.Abs(X1)) <= WHalf + r && r < L3)
{
{ /*this.tbResult.Text = "圆和矩形相交";*/
string s = "圆和矩形相交";
reout += s;
return reout;
}
}
else if (r >= L3)
{
{ /*this.tbResult.Text = "矩形包含在圆内";*/
string s = "矩形包含在圆内";
reout += s;
return reout;
}
}
else
{
//this.tbResult.Text = "圆和矩形相离";
string s = "圆和矩形相离";
reout += s;
return reout;
}
}
}
2、4、情况4:圆心在右上角蓝色小矩形内,小矩形的长和宽分别为r
u<=r&& r<L3,圆和矩形相交,
r>=L3矩形包含在圆内,
其他情况圆和矩形相离
//情况4:圆心在右上角蓝色小矩形内,小矩形的长和宽分别为r
else if (Math.Abs(Math.Abs(Y2) - Math.Abs(Y1)) >= WHalf + Math.Abs(Y1) && Math.Abs(Math.Abs(Y2) - Math.Abs(Y1)) <= WHalf + Math.Abs(Y1) + r)
{
if (Math.Abs(Math.Abs(X2) - Math.Abs(X1)) >= LHalf + Math.Abs(X1) && Math.Abs(Math.Abs(X2) - Math.Abs(X1)) <= Math.Abs(X1) + LHalf + r)
{
//矩形到圆心的最短距离值为u
double u = Math.Sqrt(Math.Pow(Math.Abs(Math.Abs(X2) - Math.Abs(X1) - LHalf), 2) + Math.Pow(Math.Abs(Math.Abs(Y2) - Math.Abs(Y1) - WHalf), 2));
if (u <= r && r < L3)
{
{
//this.tbResult.Text = "圆和矩形相交";
string s = "圆和矩形相交";
reout += s;
return reout;
}
}
else if (r >= L3)
{
{
//this.tbResult.Text = "矩形包含在圆内";
string s = "矩形包含在圆内";
reout += s;
return reout;
}
}
else
{
//this.tbResult.Text = "圆和矩形相离";
string s = "圆和矩形相离";
reout += s;
return reout;
}
}
}
2、5、情况5:圆心在大矩形外,大矩形的长和宽分别为:Lhalf+r和whalf+r
圆和矩形相离
// 情况5:圆心在大矩形外,大矩形的长和宽分别为:Lhalf+r和whalf+r
else
{
//this.tbResult.Text = "圆和矩形相离";
string s = "圆和矩形相离";
reout += s;
return reout;
}
三、实际情况:输入的圆和矩形在坐标轴上有4种情况
情况1:圆心位置在矩形中心坐标的右上方,直接调用Method方法判断
情况2:圆心位置在矩形中心坐标的左上方,圆心位置对称转化到矩形中心位置的右上方,再调用Method方法判断
情况3:圆心位置在矩形中心坐标的左下方,圆心位置对称转化到矩形中心位置的右上方,再调用Method方法判断
情况4:圆心位置在矩形中心坐标的右下方,圆心位置对称转化到矩形中心位置的右上方,再调用Method方法判断
3.1、情况1:圆心位置在矩形中心坐标的右上方,直接调用Method方法判断
//情况1:圆心位置在矩形中心坐标的右上方,直接调用Method方法判断
if (X2>=X1 && Y2>=Y1) {
Method form1 = new Method();
string str = form1.method(X1, Y1, X2, Y2, L, W, r);
this.tbResult.Text = str;
}
3.2、情况2:圆心位置在矩形中心坐标的左上方,圆心位置对称转化到矩形中心位置的右上方,再调用Method方法判断
//情况2:圆心位置在矩形中心坐标的左上方,圆心位置对称转化到矩形中心位置的右上方,再调用Method方法判断
if (X2 < X1 && Y2 >=Y1) {
double X = 2*X1 - X2;
Method form1 = new Method();
string str = form1.method(X1, Y1,X, Y2, L, W, r);
this.tbResult.Text = str;
}
3.3、情况3:圆心位置在矩形中心坐标的左下方,圆心位置对称转化到矩形中心位置的右上方,再调用Method方法判断
//情况3:圆心位置在矩形中心坐标的左下方,圆心位置对称转化到矩形中心位置的右上方,再调用Method方法判断
if (X2 < X1 && Y2 < Y1)
{
double X = 2 * X1 - X2;
double Y = 2 * Y1 - Y2;
Method form1 = new Method();
string str = form1.method(X1, Y1, X, Y, L, W, r);
this.tbResult.Text = str;
}
3.4、情况4:圆心位置在矩形中心坐标的右下方,圆心位置对称转化到矩形中心位置的右上方,再调用Method方法判断
//情况4:圆心位置在矩形中心坐标的右下方,圆心位置对称转化到矩形中心位置的右上方,再调用Method方法判断
if (X2 > X1 && Y2 < Y1)
{
double Y = 2 * Y1 - Y2;
Method form1 = new Method();
string str = form1.method(X1, Y1, X2, Y, L, W, r);
this.tbResult.Text = str;
}
四、整体项目结构
五、效果展示