类的封装名词解释
所谓封装,也就是把客观事物抽象并封装成对象,即将数据成员、属性、方法和事件等集合在一个整体内。通过方位控制,还可以隐藏内部成员,只允许可信的成员的对象访问或操作自己的部分数据或方法。封装保证了对象的独立性,可以防止外部程序破坏对象的内部数据,同时便于程序的维护。
角度转换类
如图所示,涉及几个方法的封装
封装的私有字段如下所示
//定义私有字段
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);
如果有错误之处欢迎大家指出嗷!
禁止抄袭!