ActiveProtect/docs/DesignMissile.md

3.1 KiB

实体设计

在仿真环境中,每个实体(如导弹)有几类参数:

  1. 固有属性参数:如弹长、弹径、质量,最大速度、最大飞行距离、发动机推力等
  2. 运行时状态参数:如当前位置、速度、朝向、加速度,接收的辐射能量、导引头视野中目标角度等

为了设计一个结构清晰的实体类,我们采用组合模式和接口分离原则。这样可以将不同类型的参数和状态分开管理,同时保持良好的扩展性。

基础接口

首先,我们定义几个基础接口来表示不同类型的参数:


public interface IProperties
{
    double Length { get; }
    double Diameter { get; }
    double Mass { get; }
}

public interface IState
{
    Vector3 Position { get; set; }
    Vector3 Velocity { get; set; }
    Vector3 Acceleration { get; set; }
    double Heading { get; set; }
    double ReceivedRadiation { get; set; }
    double TargetDeviation { get; set; }
}

实现类

然后,我们为每个接口创建实现类:

public class MissileProperties : IProperties { public double Length { get; } public double Diameter { get; } public double Mass { get; } }

public class MissileState : IState { public Vector3 Position { get; set; } public Vector3 Velocity { get; set; } public Vector3 Acceleration { get; set; } public double Heading { get; set; } public double ReceivedRadiation { get; set; } public double TargetDeviation { get; set; } }

导弹实体类

接下来,我们创建一个导弹实体类,它将实现上述接口:

public class Missile : IProperties, IState
{
    public MissileProperties Properties { get; set; }
    public MissileState State { get; set; }

    public Missile()
    {
        Properties = new MissileProperties();
        State = new MissileState();
    }

    // 其他方法,如更新状态、执行导航等
    public void Update(double deltaTime)
    {
        // 更新运行时状态和导引参数
    }
    public void Navigate()
    {
        // 执行导航逻辑
    }

}

设计优点

  1. 清晰的结构:每种类型的参数或状态都有自己的接口和实现类,使得结构非常清晰。
  2. 高度的模块化:可以轻松地替换或修改某一类参数,而不影响其他部分。
  3. 易于扩展:如果需要添加新的参数类型,只需创建新的接口和实现类,然后在 Missile 类中添加相应的属性。
  4. 符合单一职责原则:每个类都只负责一种类型的参数。
  5. 便于测试:可以轻松地为每种参数类型创建模拟对象,便于单元测试。
  6. 灵活性:可以为不同类型的导弹创建不同的参数实现,而保持相同的接口。

红外指令制导导弹

制导系统

采用三点法进行制导计算,并增加了提前量和加速度平滑因子,以提高制导精度。 因为三点法的缺点,导致导弹在接近目标时,加速度会突然增大,导致导弹过载,容易导致脱靶。因此,限制了最大加速度,这也导致导弹在接近目标时,会出现转向不足的情况,出现一定制导误差。