c#判断圆和矩形的位置关系

该代码实现了一个C#类Method,用于分析给定圆心坐标、半径和矩形中心坐标、长宽的情况下,圆和矩形的位置关系,包括相交、包含、相离等五种情况。通过对不同情况的逻辑判断,确定两者的相对位置。
摘要由CSDN通过智能技术生成

一、问题描述:

任意给一个圆的圆心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;


            }

四、整体项目结构

五、效果展示

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值