类的封装(角度转换类、坐标正反算类、交会计算类)

类的封装名词解释

所谓封装,也就是把客观事物抽象并封装成对象,即将数据成员、属性、方法和事件等集合在一个整体内。通过方位控制,还可以隐藏内部成员,只允许可信的成员的对象访问或操作自己的部分数据或方法。封装保证了对象的独立性,可以防止外部程序破坏对象的内部数据,同时便于程序的维护。

角度转换类

如图所示,涉及几个方法的封装

在这里插入图片描述
封装的私有字段如下所示

 //定义私有字段
        private double[] A1 = new double[3];
        private double degrees1;
        private double radian1;

封装的属性如下所示

public double[] A
        {
            get
            {
                return A1;
            }
            set
            {
                A1 = value;
            }
        }
        public double degrees
        {
            get
            {
                return degrees1;
            }
            set
            {
                degrees1 = value;
            }
        }
        public double radian
        {
            get
            {
                return radian1;
            }
            set
            {
                radian1 = value;
            }
        }

封装的构造函数如下所示

public 角度转换()
        {
            this.A = A;
            this.degrees = degrees;
            this.radian = radian;
        }

封装的方法如下所示


       //弧度转换为度分秒
        public string radtodm(double radian)
        {
            radian = radian * 180 / Math.PI;
            double[] A = new double[3];//定义一维数组存储度分秒
            A[0] = (int)radian;
            A[1] = (int)((radian - A[0]) * 60);
            A[2] = (int)((radian - A[0] - A[1] / 60) * 60 * 60);
            A[2] = Math.Round(A[2], 2);//保留两位小数
            if (A[2] == 60)
            {
                A[1] += 1;
                A[2] -= 1;
                if (A[1] == 60)
                {
                    A[0] += 1;
                    A[1] -= 1;
                }
            }
            string s = Convert.ToString(A[0]) + "°" + Convert.ToString(A[1]) + "′" + Convert.ToString(A[2]) + "″";
            return s;
        }
        //度分秒转换为弧度
        public double radtodm1(double []A)
        {
            double rad = A[0] + A[1] / 60 + A[2] / 3600;
            double radian = rad / 180 * Math.PI;
            return radian;
        }
        //十进制度转换度分秒
        public string radtodm2(double degrees)
        {
            double[] A = new double[3];
            A[0] = (int)degrees;
            A[1] = (int)((degrees - A[0]))* 60;
            A[2] = (int)((degrees - A[0] - A[1] / 60) * 60 * 60);
            A[2] = Math.Round(A[2], 2);
            if (A[2] == 60)
            {
                A[1] += 1;
                A[2] -= 1;
                if (A[1] == 60)
                {
                    A[0] += 1;
                    A[1] -= 1;
                }
            }
            string s = Convert.ToString(A[0]) + "°" + Convert.ToString(A[1]) + "′" + Convert.ToString(A[2]) + "″";
            return s;
        }
        //度分秒转十进制度
        public double radtodm3(double[] A)
        {
            double rad = A[0] + A[1] / 60 + A[2] / 3600;
            return rad;
        }
        //弧度转十进制度
        public double radtodm4(double radian)
        {
            double degrees =radian * 180 / Math.PI;
            return degrees;
        }
        //十进制度转弧度
        public double radtodms5(double degrees)
        {
            double radian =degrees / 180 * Math.PI;
            return radian;
        }

坐标正反算类

如图所示,涉及以下几个方法的封装
在这里插入图片描述
封装的私有字段如下所示

//私有数据成员
        private double X;
        private double Y;
        private double s;
        private double z;

封装的属性如下所示

//属性(定义相应的属性的访问器来访问数据成员)
        public double x
        {
            get
            {
                return X;
            }
            set
            {
                X = value;
            }
        }
        public double y
        {
            get
            {
                return Y;
            }
            set
            {
                Y = value;
            }
        }
        public double S
        {
            get
            {
                return s;
            }
            set
            {
                s = value;
            }
        }
        public double Z
        {
            get
            {
                return z;
            }
            set
            {
                z = value;
            }
        }

封装的构造函数如下所示

 //构造函数
        public 坐标正反算()
        {
            this.x=x;
            this.y = y;
            this.S = S;
            this.Z =Z;
        }

封装的方法如下所示


```csharp
//给定两点坐标计算出两点之间的距离
        public double Distance(坐标正反算 p)
        {
            return Math.Sqrt((x - p.x) * (x - p.x) + (y - p.y) * (y - p.y));
        }
        //坐标正算
        public double coordinatecalculate1(坐标正反算 p,out double y)
        {
            y = p.y + Math.Sin(p.Z) * p.S;
            return p.x + Math.Cos(p.Z) * p.S;
        }
        //坐标反算
        public string coordinatecalculate2(坐标正反算 p)
        {
            double DX = x - p.x;
            double DY = x - p.y;
            double DZ = DX / DY;
            string D = "";
            角度转换 d= new 角度转换();
            if(DX>0)
            {
                if(DY>0)
                {
                    D = d.radtodm(Math.Atan(DZ));
                }
                else
                {
                    D = d.radtodm(Math.Atan(DZ) + 2 * Math.PI);
                }
            }
            if(DX==0)
            {
                if(DY>0)
                {
                    D = Convert.ToString(0);
                }
                else
                {
                    D = d.radtodm(Math.PI);
                }
            }
            if(DX<0)
            {
                D = d.radtodm(Math.Atan(DZ) + Math.PI);
            }
            return D;
        }

``

交会计算类

如图所示,涉及以下几个方法的封装
在这里插入图片描述
封装的私有字段如下所示

 //定义私有字段
        private double X;
        private double Y;
        private double α1;
        private double s;

封装的属性如下所示

public double x
        {
            get
            {
                return X;
            }
            set
            {
                x = value;
            }
        }
        public double y
        {
            get
            {
                return Y;
            }
            set
            {
                y = value;
            }
        }
        public double α
        {
            get
            {
                return α1;
            }
            set
            {
                α = value;
            }
        }
        public double S
        {
            get
            {
                return s;
            }
            set
            {
                S = value;
            }
        }

封装的构造函数如下所示

//定义构造函数
        public 交会计算()
        {
            this.x = x;
            this.y = y;
            this.α = α;
            this.S = S;
        }

封装的方法如下所示

//角度前方交会
        public double Angularforward(交会计算 p,out double y1)
        {
            y1 = y * (1 / Math.Tan(α))+ p.y * (1 / Math.Tan(p.α))+ x - p.x;
            return x * (1 / Math.Tan(α)) + p.x * (1 / Math.Tan(p.α)) + y - p.y;
        }
        //角度后方交会
        public double Angularresection(交会计算 p1,交会计算 p2,out double y2)
        {
            double A = Math.Atan((p2.y - y) / (p2.x - x)) - Math.Atan((p1.y - y) / (p1.x - x));
            double B = Math.Atan((y - p1.y) / (x - p1.x)) - Math.Atan((p2.y - p1.y) / (p2.x - p1.x));
            double C = Math.Atan((p1.y - p2.y) / (p1.x - p2.x)) - Math.Atan((y - p2.y) / (x - p2.x));
            double P1 = 1 / ((1 / (Math.Tan(A))) - (1 / Math.Tan(α)));
            double P2 = 1 / ((1 / (Math.Tan(B))) - (1 / Math.Tan(p1.α)));
            double P3 = 1 / ((1 / (Math.Tan(C))) - (1 / Math.Tan(p2.α)));
            y2= (P1 * y + P2 * p1.x + P3 * p2.y) / (P1 + P2 + P3);
            return (P1 * x + P2 * p1.x + P3 * p2.x) / (P1 + P2 + P3);
        }
        //距离交会
        public double Distanceintersection(交会计算 p,out double y2)
        {
            double Dab = Math.Sqrt((x - p.x) * (x - p.x) + (y - p.y) * (y - p.y));
            double Za = Math.Acos((Dab * Dab + S * S - p.S) / (2 * Dab * S));
            double Zb = Math.Acos((Dab * Dab + p.S * p.S - S) / (2 * Dab * p.S));
            double Zab = Math.Atan((p.y - y) / (p.x - x));
            double Zap = Zab - Za;
            double Zbp = Zap + Zb;
            double xp1 = x + S * Math.Cos(Zap);
            double yp1 = y + S * Math.Sin(Zap);
            double xp2 = p.x + p.S * Math.Cos(Zbp);
            double yp2 = p.y + p.S * Math.Sin(Zbp);
            y2 = (yp1 + yp2) / 2;
            return (xp1 + xp2) / 2;
        }

补充:可以使用带有out关键字的参数使方法返回两个值,方法定义和方法调用都必须使用out关键字,调用方法的代码如下所示

textBox5.Text = Convert.ToString(p1.Angularresection(p2, p3, out y4));
textBox6.Text = Convert.ToString(y4);

如果有错误之处欢迎大家指出嗷!
禁止抄袭!

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值