使用c#语言编写一个程序,实现测角交会定点计算,包括: 前方交会 、 后方交会 、 侧方交会 、 距离交会
时间: 2024-01-24 22:16:57 浏览: 73
以下是一个简单的C#程序,可以实现前方交会、后方交会、侧方交会和距离交会的定点计算。请注意,此程序仅供参考和学习,实际应用需要根据具体情况进行修改和优化。
```csharp
using System;
class Point
{
public double x, y;
public Point(double x, double y)
{
this.x = x;
this.y = y;
}
public double DistanceTo(Point other)
{
double dx = other.x - this.x;
double dy = other.y - this.y;
return Math.Sqrt(dx * dx + dy * dy);
}
}
class AngleIntersection
{
public static void Main()
{
Console.WriteLine("请选择交会类型:");
Console.WriteLine("1. 前方交会");
Console.WriteLine("2. 后方交会");
Console.WriteLine("3. 侧方交会");
Console.WriteLine("4. 距离交会");
int choice = int.Parse(Console.ReadLine());
switch (choice)
{
case 1:
ForwardIntersection();
break;
case 2:
BackwardIntersection();
break;
case 3:
LateralIntersection();
break;
case 4:
DistanceIntersection();
break;
default:
Console.WriteLine("无效的选项!");
break;
}
}
public static void ForwardIntersection()
{
Console.WriteLine("请输入已知点A的坐标(x,y):");
double ax = double.Parse(Console.ReadLine());
double ay = double.Parse(Console.ReadLine());
Point A = new Point(ax, ay);
Console.WriteLine("请输入已知点B的坐标(x,y):");
double bx = double.Parse(Console.ReadLine());
double by = double.Parse(Console.ReadLine());
Point B = new Point(bx, by);
Console.WriteLine("请输入角度α和距离d:");
double alpha = double.Parse(Console.ReadLine());
double d = double.Parse(Console.ReadLine());
double beta = 180 - alpha;
double sinAlpha = Math.Sin(alpha * Math.PI / 180);
double sinBeta = Math.Sin(beta * Math.PI / 180);
double dx = d * sinAlpha / sinBeta;
double dy = d * Math.Cos(alpha * Math.PI / 180) - dx * Math.Cos(beta * Math.PI / 180);
double cx = ax + dx;
double cy = ay + dy;
Point C = new Point(cx, cy);
double AC = A.DistanceTo(C);
double BC = B.DistanceTo(C);
Console.WriteLine("已知点A和点B,角度α和距离d,求交点C的坐标(x,y):");
Console.WriteLine("点C的坐标:({0},{1})", cx, cy);
Console.WriteLine("AC的长度:{0}", AC);
Console.WriteLine("BC的长度:{0}", BC);
}
public static void BackwardIntersection()
{
Console.WriteLine("请输入已知点A的坐标(x,y):");
double ax = double.Parse(Console.ReadLine());
double ay = double.Parse(Console.ReadLine());
Point A = new Point(ax, ay);
Console.WriteLine("请输入已知点B的坐标(x,y):");
double bx = double.Parse(Console.ReadLine());
double by = double.Parse(Console.ReadLine());
Point B = new Point(bx, by);
Console.WriteLine("请输入角度α和距离d:");
double alpha = double.Parse(Console.ReadLine());
double d = double.Parse(Console.ReadLine());
double beta = 180 - alpha;
double sinAlpha = Math.Sin(alpha * Math.PI / 180);
double sinBeta = Math.Sin(beta * Math.PI / 180);
double dx = -d * sinAlpha / sinBeta;
double dy = -d * Math.Cos(alpha * Math.PI / 180) - dx * Math.Cos(beta * Math.PI / 180);
double cx = bx + dx;
double cy = by + dy;
Point C = new Point(cx, cy);
double AC = A.DistanceTo(C);
double BC = B.DistanceTo(C);
Console.WriteLine("已知点A和点B,角度α和距离d,求交点C的坐标(x,y):");
Console.WriteLine("点C的坐标:({0},{1})", cx, cy);
Console.WriteLine("AC的长度:{0}", AC);
Console.WriteLine("BC的长度:{0}", BC);
}
public static void LateralIntersection()
{
Console.WriteLine("请输入已知点A的坐标(x,y):");
double ax = double.Parse(Console.ReadLine());
double ay = double.Parse(Console.ReadLine());
Point A = new Point(ax, ay);
Console.WriteLine("请输入已知点B的坐标(x,y):");
double bx = double.Parse(Console.ReadLine());
double by = double.Parse(Console.ReadLine());
Point B = new Point(bx, by);
Console.WriteLine("请输入角度α和距离d:");
double alpha = double.Parse(Console.ReadLine());
double d = double.Parse(Console.ReadLine());
double beta = 90 - alpha;
double sinAlpha = Math.Sin(alpha * Math.PI / 180);
double sinBeta = Math.Sin(beta * Math.PI / 180);
double dx = d * sinAlpha / sinBeta;
double dy = d * Math.Cos(alpha * Math.PI / 180);
double cx = ax + dx;
double cy = ay + dy;
Point C = new Point(cx, cy);
double AC = A.DistanceTo(C);
double BC = B.DistanceTo(C);
Console.WriteLine("已知点A和点B,角度α和距离d,求交点C的坐标(x,y):");
Console.WriteLine("点C的坐标:({0},{1})", cx, cy);
Console.WriteLine("AC的长度:{0}", AC);
Console.WriteLine("BC的长度:{0}", BC);
}
public static void DistanceIntersection()
{
Console.WriteLine("请输入已知点A的坐标(x,y):");
double ax = double.Parse(Console.ReadLine());
double ay = double.Parse(Console.ReadLine());
Point A = new Point(ax, ay);
Console.WriteLine("请输入已知点B的坐标(x,y):");
double bx = double.Parse(Console.ReadLine());
double by = double.Parse(Console.ReadLine());
Point B = new Point(bx, by);
Console.WriteLine("请输入已知点C的坐标(x,y):");
double cx = double.Parse(Console.ReadLine());
double cy = double.Parse(Console.ReadLine());
Point C = new Point(cx, cy);
double AC = A.DistanceTo(C);
double BC = B.DistanceTo(C);
double alpha = Math.Asin((BC / AC) * Math.Sin(Math.PI / 180)) * 180 / Math.PI;
double beta = 180 - alpha;
double d = AC * Math.Sin(beta * Math.PI / 180) / Math.Sin(alpha * Math.PI / 180);
double sinAlpha = Math.Sin(alpha * Math.PI / 180);
double sinBeta = Math.Sin(beta * Math.PI / 180);
double dx = d * sinAlpha / sinBeta;
double dy = d * Math.Cos(alpha * Math.PI / 180) - dx * Math.Cos(beta * Math.PI / 180);
double dx2 = dx * (B.x - A.x) / BC;
double dy2 = dx * (B.y - A.y) / BC;
double ex = C.x + dx2;
double ey = C.y + dy2;
Point E = new Point(ex, ey);
double AE = A.DistanceTo(E);
double BE = B.DistanceTo(E);
Console.WriteLine("已知点A、B、C,求交点E的坐标(x,y):");
Console.WriteLine("点E的坐标:({0},{1})", ex, ey);
Console.WriteLine("AE的长度:{0}", AE);
Console.WriteLine("BE的长度:{0}", BE);
}
}
```
在程序中,我们定义了一个 `Point` 类来表示点的坐标,以及一个 `AngleIntersection` 类来实现不同类型的交会计算。`Main` 方法中给出了一个选项菜单,用户可以选择不同的交会类型进行计算。
在每个交会类型的方法中,我们首先读入已知点 A 和 B 的坐标,以及角度和距离。然后根据不同的公式计算出交点 C 的坐标,以及 AC 和 BC 的长度。最后输出交点 C 的坐标和 AC、BC 的长度。
需要注意的是,在距离交会的计算中,我们首先根据已知点 A、B、C 计算出角度 alpha 和 beta,然后根据公式计算出距离 d。接着根据 d 计算出交点 E 的坐标,以及 AE 和 BE 的长度。在计算交点 E 的坐标时,我们使用了向量运算,具体实现可以参考代码中的注释。
除了上述代码,还需要注意以下几点:
- 在实际应用中,需要对输入进行合法性检查,防止出现非法数据导致程序崩溃或计算错误。
- 为了方便起见,本程序使用了固定的单位制(角度为度,距离为米)。实际应用中,需要根据具体情况选择合适的单位制,并进行单位转换。
- 在精度要求较高的情况下,需要使用高精度计算库来避免精度损失的问题。
阅读全文