using System; using System.Numerics; namespace CommonUsage.Mathematics { /// /// 表示一条线段。 /// public class LineSegment { /// /// 默认构造函数。所有坐标初始化为0。 /// public LineSegment() { } /// /// 使用两个端点初始化一段2D线段。 /// /// 线段起点。 /// 线段终点。 public LineSegment(Vector2 src, Vector2 dst) { Src = src; Dst = dst; } /// /// 使用两个端点初始化一段3D线段。 /// /// 线段起点。 /// 线段终点。 public LineSegment(Vector3 src, Vector3 dst) { Src3D = src; Dst3D = dst; } /// /// 使用两个端点初始化一条线段,2D。 /// /// 线段起点x坐标。 /// 线段起点y坐标。 /// 线段终点x坐标。 /// 线段终点y坐标。 public LineSegment(double x1, double y1, double x2, double y2) { Src = new Vector2((float)x1, (float)y1); Dst = new Vector2((float)x2, (float)y2); } /// /// 使用两个端点初始化一条线段,2D。 /// /// 线段起点x坐标。 /// 线段起点y坐标。 /// 线段起点y坐标。 /// 线段终点x坐标。 /// 线段终点y坐标。 /// 线段终点y坐标。 public LineSegment(double x1, double y1, double z1, double x2, double y2, double z2) { Src3D = new Vector3((float)x1, (float)y1, (float)z1); Dst3D = new Vector3((float)x2, (float)y2, (float)z2); } /// /// 返回线段长度,2D。 /// /// public double Length() { return Vector2.Distance(Src, Dst); } /// /// 返回线段长度,3D。 /// /// public double Length3D() { return Vector3.Distance(Src3D, Dst3D); } /// /// 返回线段与x轴正方向夹角度数,角度制。 /// /// public double Angle() { return Math.Atan2(Dst.Y - Src.Y, Dst.X - Src.X) / Math.PI * 180; } /// /// 返回一段方向相反的线段。 /// /// public LineSegment Reverse() { return new LineSegment(Dst3D, Src3D); } /// /// 线段2D起点。 /// public Vector2 Src { get => new(_srcX, _srcY); set { _srcX = value.X; _srcY = value.Y; } } /// /// 线段2D终点。 /// public Vector2 Dst { get => new(_dstX, _dstY); set { _dstX = value.X; _dstY = value.Y; } } /// /// 线段3D起点。 /// public Vector3 Src3D { get => new(_srcX, _srcY, _srcZ); set { _srcX = value.X; _srcY = value.Y; _srcZ = value.Z; } } /// /// 线段3D终点。 /// public Vector3 Dst3D { get => new(_dstX, _dstY, _dstZ); set { _dstX = value.X; _dstY = value.Y; _dstZ = value.Z; } } private float _srcX, _srcY, _srcZ, _dstX, _dstY, _dstZ; } }