合工大机器人足球第二次作业

第二次作业 用面向对象的思维设计相关类,从而实现直线与直线、直线与圆、直线与矩形的交点。 要求各给出每个案例的至少一个示例的程序

C#

namespace Fb
{
    public class FB_2
    {
        // public static void Main(string[] args)
        // {
        //     //说明:实例化图像后,传入Cac即可计算
        //     Line l1 = new Line(1, 1, -1);
        //     Line l2 = new Line(-2, 1, 0);
        //     Cir c1 = new Cir(0, 0, 1);
        //     Rec r1 = new Rec(1, -1, 2, 2);
        //     Console.WriteLine("直线与直线:");
        //     Cac cac1 = new Cac(l1, l2);
        //     Console.WriteLine("直线与圆:");
        //     Cac cac2 = new Cac(l1, c1);
        //     Console.WriteLine("直线与矩形:");
        //     Cac cac3 = new Cac(l1, r1);
        // }

    }

    class MathGraph
    {
        public mathType mType;
    }

    class Line : MathGraph
    {
        public double A { get; set; }
        public double B { get; set; }
        public double C { get; set; }

        public Line() { }
        public Line(double a, double b, double c)
        {
            mType = mathType.line;
            A = a;
            B = b;
            C = c;
        }
    }

    class Cir : MathGraph
    {
        public Vector2D Center = new Vector2D();//圆心
        public double R;//半径

        public Cir() { }
        public Cir(Vector2D center, double r)
        {
            mType = mathType.circle;
            Center = center;
            R = r;
        }
        public Cir(double x, double y, double r)
        {
            mType = mathType.circle;
            Center.x = x;
            Center.y = y;
            R = r;
        }
    }

    class Rec : MathGraph
    {
        public Vector2D LT = new Vector2D();//左上
        public Vector2D RT = new Vector2D();//右上
        public Vector2D LB = new Vector2D();//左下
        public Vector2D RB = new Vector2D();//右下

        public Rec() { }
        public Rec(Vector2D lt, Vector2D rt, Vector2D lb, Vector2D rb)
        {
            mType = mathType.rectangle;
            LT = lt;
            RT = rt;
            LB = lb;
            RB = rb;
        }
        public Rec(double xlt, double ylt, double xrt, double yrt, double xlb, double ylb, double xrb, double yrb)
        {
            mType = mathType.rectangle;
            LT.x = xlt;
            LT.y = ylt;
            RT.x = xrt;
            RT.y = yrt;
            LB.x = xlb;
            LB.y = ylb;
            RB.x = xrb;
            RB.y = yrb;
        }
        public Rec(double xlb, double ylb, double xrt, double yrt)
        {
            mType = mathType.rectangle;
            LT.x = xlb;
            LT.y = yrt;
            RT.x = xrt;
            RT.y = yrt;
            LB.x = xlb;
            LB.y = ylb;
            RB.x = xrt;
            RB.y = ylb;
        }

    }

    class Cac
    {
        public Cac() { }
        public Cac(Line l1, Line l2)//直线
        {
            if (l1.A == l2.A && l1.B == l2.B && l1.C == l2.C)
            {
                Console.WriteLine("直线相同");
                return;
            }
            if (l1.A * l2.B == l2.A * l1.B)
            {
                Console.WriteLine("直线平行");
            }
            Console.WriteLine("x: " + (l2.C * l1.B - l1.C * l2.B) / (l1.A * l2.B - l2.A * l1.B));
            Console.WriteLine("y: " + (l1.C * l2.A - l2.C * l1.A) / (l1.A * l2.B - l2.A * l1.B));
        }
        public Cac(Line l1, Cir c1)//圆
        {
            double distanceR;//直线到圆心的距离
            distanceR = Math.Abs(l1.A * c1.Center.x + l1.B * c1.Center.y + l1.C) / (Math.Sqrt(l1.A * l1.A + l1.B * l1.B));
            if (distanceR > c1.R)
            {
                Console.WriteLine("直线与圆无交点");
                return;
            }
            else
            {
                double x1, x2, y1, y2;
                double k = -l1.A / l1.B;
                double b = -l1.C / l1.B;
                double c = -c1.Center.x;
                double d = -c1.Center.y;
                x1 = -(Math.Sqrt((k * k + 1) * c1.R * c1.R - c * c * k * k + (2 * c * d + 2 * b * c) * k - d * d - 2 * b * d - b * b) + (b + d) * k + c) / (k * k + 1);
                x2 = (Math.Sqrt((k * k + 1) * c1.R * c1.R - c * c * k * k + (2 * c * d + 2 * b * c) * k - d * d - 2 * b * d - b * b) - (b + d) * k - c) / (k * k + 1);
                y1 = k * x1 + b;
                y2 = k * x2 + b;
                if (x1 == x2)
                    Console.WriteLine("直线与圆有一交点:( " + x1 + " , " + y1 + " )");
                else
                    Console.WriteLine("直线与圆有两交点:( " + x1 + " , " + y1 + " )" + " , ( " + x2 + " , " + y2 + " )");
            }
        }
        public Cac(Line l1, Rec r1)//矩形
        {
            if (l1.A == 0)
            {
                double Y = -l1.C / l1.B;
                if (Y == r1.LB.y || Y == r1.RT.y)
                {
                    Console.WriteLine("直线与矩形一边重合");
                    return;
                }
                else if (Y < r1.LB.y || Y > r1.RT.y)
                {
                    Console.WriteLine("直线与矩形无交点");
                    return;
                }
                else
                {
                    Console.WriteLine("直线与矩形两交点:( " + r1.LB.x + " , " + Y + " ) , ( " + r1.RT.x + " , " + Y + " )");
                    return;
                }
            }
            else if (l1.B == 0)
            {
                double X = -l1.C / l1.A;
                if (X == r1.LB.x || X == r1.RT.x)
                {
                    Console.WriteLine("直线与矩形一边重合");
                    return;
                }
                else if (X < r1.LB.x || X > r1.RT.x)
                {
                    Console.WriteLine("直线与矩形无交点");
                    return;
                }
                else
                {
                    Console.WriteLine("直线与矩形两交点:( " + X + " , " + r1.LB.y + " ) , ( " + X + " , " + r1.RT.y + " )");
                    return;
                }
            }
            else
            {
                double X1, X2, X3, X4, Y1, Y2, Y3, Y4;
                bool flag = false;//是否存在
                X1 = r1.LB.x;
                Y1 = -(l1.A * X1 + l1.C) / l1.B;
                X2 = r1.RT.x;
                Y2 = -(l1.A * X2 + l1.C) / l1.B;
                Y3 = r1.LB.y;
                X3 = -(l1.B * Y3 + l1.C) / l1.A;
                Y4 = r1.RT.y;
                X4 = -(l1.B * Y4 + l1.C) / l1.A;
                if (Y1 <= Y4 && Y1 >= Y3)
                {
                    if (Y1 == -0)
                        Y1 = 0;
                    Console.WriteLine("存在交点:( " + X1 + " , " + Y1 + " )");
                    flag = true;
                }
                if (Y2 <= Y4 && Y2 >= Y3)
                {
                    if (Y2 == -0)
                        Y2 = 0;
                    Console.WriteLine("存在交点:( " + X2 + " , " + Y2 + " )");
                    flag = true;
                }
                if (X3 < X2 && X3 > X1)
                {
                    if (X3 == -0)
                        X3 = 0;
                    Console.WriteLine("存在交点:( " + X3 + " , " + Y3 + " )");
                    flag = true;
                }
                if (X4 < X2 && X4 > X1)
                {
                    if (X4 == -0)
                        X4 = 0;
                    Console.WriteLine("存在交点:(" + X4 + " , " + Y4 + " )");
                    flag = true;
                }
                if (!flag)
                    Console.WriteLine("无交点");
            }
        }
    }

    class Vector2D//点
    {
        public double x { get; set; }
        public double y { get; set; }
    }

    enum mathType
    {
        line,
        circle,
        rectangle
    }
}

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值