/**
* 注意:这是一个C++/CLI示例,展示如何在C++项目中使用ThreatSource库
* 实际项目中需要:
* 1. 创建C++/CLI项目
* 2. 引用ThreatSource.dll
* 3. 配置正确的目标框架(.NET 8.0)
*/
using namespace System;
using namespace ThreatSource::Simulation;
using namespace ThreatSource::Data;
using namespace ThreatSource::Missile;
namespace ThreatSourceWrapper {
///
/// C++/CLI包装类,用于在C++项目中使用红外成像制导导弹仿真
///
public ref class IRMissileSimulationWrapper
{
private:
ISimulationManager^ simulationManager;
ThreatSourceDataManager^ dataManager;
public:
IRMissileSimulationWrapper()
{
simulationManager = gcnew SimulationManager();
dataManager = gcnew ThreatSourceDataManager();
}
///
/// 运行红外成像制导导弹仿真示例
///
void RunSimulationExample()
{
try {
// 步骤1:初始化仿真管理器
simulationManager->StartSimulation(0.02); // 20ms时间步长
// 步骤2:创建目标实体
auto target = gcnew BaseEquipment("target_001");
target->KState = gcnew KinematicState();
target->KState->Position = Vector3(5000, 0, 1000); // 5km距离,1km高度
target->KState->Velocity = Vector3(-50, 0, 0); // 50m/s向西移动
target->KState->Orientation = Orientation(0, 0, 0);
// 步骤3:从配置创建红外成像制导导弹
auto missileData = dataManager->GetMissile("IR_Missile_Example");
auto missile = gcnew InfraredImagingTerminalGuidanceMissile("missile_001", missileData);
missile->KState = gcnew KinematicState();
missile->KState->Position = Vector3(0, 0, 100); // 起始位置
missile->KState->Velocity = Vector3(200, 0, 0); // 初始速度200m/s
missile->KState->Orientation = Orientation(0, 0, 0); // 初始朝向
// 步骤4:注册实体到仿真管理器
simulationManager->RegisterEntity(target);
simulationManager->RegisterEntity(missile);
// 步骤5:订阅仿真事件
simulationManager->Subscribe(
gcnew Action(this, &IRMissileSimulationWrapper::OnMissileExplode)
);
simulationManager->Subscribe(
gcnew Action(this, &IRMissileSimulationWrapper::OnFlightPhaseChange)
);
// 步骤6:运行仿真循环
double simulationTime = 0;
double maxTime = 60.0; // 最大仿真时间60秒
Console::WriteLine("开始红外成像制导导弹仿真...");
Console::WriteLine("目标位置: ({0}, {1}, {2})",
target->KState->Position.X,
target->KState->Position.Y,
target->KState->Position.Z);
Console::WriteLine("导弹初始位置: ({0}, {1}, {2})",
missile->KState->Position.X,
missile->KState->Position.Y,
missile->KState->Position.Z);
while (simulationTime < maxTime && missile->IsActive)
{
// 更新仿真
simulationManager->UpdateSimulation();
simulationTime = simulationManager->CurrentTime;
// 每秒输出一次状态
if (Math::Abs(simulationTime - Math::Floor(simulationTime)) < 0.02)
{
auto distance = Vector3::Distance(missile->KState->Position, target->KState->Position);
Console::WriteLine("时间: {0:F1}s, 距离目标: {1:F1}m, 导弹阶段: {2}",
simulationTime, distance, missile->FlightPhase);
}
System::Threading::Thread::Sleep(1); // 避免阻塞
}
// 步骤7:输出仿真结果
auto finalDistance = Vector3::Distance(missile->KState->Position, target->KState->Position);
Console::WriteLine("仿真结束 - 最终距离: {0:F2}m", finalDistance);
if (finalDistance < 10.0)
{
Console::WriteLine("导弹成功命中目标!");
}
else
{
Console::WriteLine("导弹未能命中目标。");
}
}
catch (Exception^ e) {
Console::WriteLine("仿真过程出错: {0}", e->Message);
}
finally {
// 清理资源
simulationManager->StopSimulation();
}
}
private:
///
/// 处理导弹爆炸事件
///
void OnMissileExplode(MissileExplodeEvent^ evt)
{
Console::WriteLine("导弹 {0} 在位置 ({1}, {2}, {3}) 爆炸",
evt->SenderId,
evt->Position.X,
evt->Position.Y,
evt->Position.Z);
}
///
/// 处理飞行阶段变化事件
///
void OnFlightPhaseChange(FlightPhaseChangeEvent^ evt)
{
Console::WriteLine("导弹 {0} 进入 {1} 阶段", evt->SenderId, evt->NewPhase);
}
};
}
///
/// 示例:如何在原生C++代码中使用包装类
///
int main()
{
try {
auto simulation = gcnew ThreatSourceWrapper::IRMissileSimulationWrapper();
simulation->RunSimulationExample();
Console::WriteLine("按任意键退出...");
Console::ReadKey();
return 0;
}
catch (Exception^ e) {
Console::WriteLine("错误: {0}", e->Message);
return 1;
}
}