⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ase_costs.cpp

📁 A*算法的演示程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
    return costs;
  }


float ASE_Costs::CellBasedDistanceBasedAimingCosts(_asNode* aFromNode, _asNode* aToNode)
  {
    //! \note: assumes weapon effectivity decreases with linear distance, not with cell distance
    return VectorBasedDistanceBasedAimingCosts(aFromNode, aToNode);
  }


float ASE_Costs::VectorBasedCountBasedSimpleCosts(_asNode* aFromNode, _asNode* aToNode)
  {
    assert( ASE_ThreatBoard::eMinLineOfFireCount == m_ThreatBoard->GetRiskModus() );

    const float kThreatCostFactor = 8;

    float traveltime;
    traveltime = m_TerrainBoard->GetTravelTime(aFromNode->GetX(), aFromNode->GetY(), 
                                               aToNode->GetX(),   aToNode->GetY());

    float risk;
    risk  = m_ThreatBoard->GetRiskValue(aToNode->GetX(), aToNode->GetY());
    risk += m_ThreatBoard->GetRiskValue(aFromNode->GetX(), aFromNode->GetY());
    risk *= kThreatCostFactor;

    float costs;
    costs = risk * traveltime;

    return costs;
  }


float ASE_Costs::CellBasedCountBasedSimpleCosts(_asNode* aFromNode, _asNode* aToNode)
  {
    return VectorBasedCountBasedSimpleCosts(aFromNode, aToNode);
  }


float ASE_Costs::VectorBasedCountBasedAimingCosts(_asNode* aFromNode, _asNode* aToNode)
  {
    assert( ASE_ThreatBoard::eMinLineOfFireCount == m_ThreatBoard->GetRiskModus() );

    const float kThreatCostFactor = 1.2f;
    const float kMaxAim           = 5;
    const float kAimDecay         = 0.8f;

    float traveltime;
    traveltime = m_TerrainBoard->GetTravelTime(aFromNode->GetX(), aFromNode->GetY(), 
                                               aToNode->GetX(),   aToNode->GetY());

    float risk;
    risk  = m_ThreatBoard->GetRiskValue(aToNode->GetX(), aToNode->GetY());
    risk += m_ThreatBoard->GetRiskValue(aFromNode->GetX(), aFromNode->GetY());
    risk *= kThreatCostFactor;

    float aim;
    aim = aFromNode->GetThreatAimQuality();
    if ( risk == 0 )
      {
        // just do decay, travel time based
        aim *= static_cast<float>(pow(kAimDecay, traveltime));
      }    
    else
      {
        aim = min(kMaxAim, aim + traveltime); 
      }
    aToNode->SetThreatAimQuality(aim);

    float costs;
    costs = risk * traveltime * (1 + aim);

    return costs;
  }


float ASE_Costs::CellBasedCountBasedAimingCosts(_asNode* aFromNode, _asNode* aToNode)
  {
    return VectorBasedCountBasedAimingCosts(aFromNode, aToNode);
  }


float ASE_Costs::CellBasedDistanceAndCountBasedSimpleCosts(_asNode* aFromNode, _asNode* aToNode)
  {
    return VectorBasedDistanceAndCountBasedSimpleCosts(aFromNode, aToNode);
  }


float ASE_Costs::VectorBasedDistanceAndCountBasedSimpleCosts(_asNode* aFromNode, _asNode* aToNode)
  {
    assert( ASE_ThreatBoard::eMinLineOfFireCountAndDistance == m_ThreatBoard->GetRiskModus() );

    const float kThreatCostFactor = 4;

    float traveltime;
    traveltime = m_TerrainBoard->GetTravelTime(aFromNode->GetX(), aFromNode->GetY(), 
                                               aToNode->GetX(),   aToNode->GetY());

    float risk;
    risk  = m_ThreatBoard->GetRiskValue(aToNode->GetX(), aToNode->GetY());
    risk += m_ThreatBoard->GetRiskValue(aFromNode->GetX(), aFromNode->GetY());
    risk *= kThreatCostFactor;

    float costs;
    costs = risk * traveltime;

    return costs;
  }


float ASE_Costs::CellBasedDistanceAndCountBasedAimingCosts(_asNode* aFromNode, _asNode* aToNode)
  {
    return VectorBasedDistanceAndCountBasedAimingCosts(aFromNode, aToNode);
  }


float ASE_Costs::VectorBasedDistanceAndCountBasedAimingCosts(_asNode* aFromNode, _asNode* aToNode)
  {
    assert( ASE_ThreatBoard::eMinLineOfFireCountAndDistance == m_ThreatBoard->GetRiskModus() );

    const float kThreatCostFactor = 0.6f;
    const float kMaxAim           = 5;
    const float kAimDecay         = 0.8f;

    float traveltime;
    traveltime = m_TerrainBoard->GetTravelTime(aFromNode->GetX(), aFromNode->GetY(), 
                                               aToNode->GetX(),   aToNode->GetY());

    float risk;
    risk  = m_ThreatBoard->GetRiskValue(aToNode->GetX(), aToNode->GetY());
    risk += m_ThreatBoard->GetRiskValue(aFromNode->GetX(), aFromNode->GetY());
    risk *= kThreatCostFactor;

    float aim;
    aim = aFromNode->GetThreatAimQuality();
    if ( risk == 0 )
      {
        // just do decay, travel time based
        aim *= static_cast<float>(pow(kAimDecay, traveltime));
      }    
    else
      {
        aim = min(kMaxAim, aim + traveltime); 
      }
    aToNode->SetThreatAimQuality(aim);

    float costs;
    costs = risk * traveltime * (1 + aim);

    return costs;
  }


float ASE_Costs::CellBasedThreatsApproximateLOFSimpleCosts(_asNode* aFromNode, _asNode* aToNode)
  {
    return VectorBasedThreatsApproximateLOFSimpleCosts(aFromNode, aToNode);
  }


float ASE_Costs::VectorBasedThreatsApproximateLOFSimpleCosts(_asNode* aFromNode, _asNode* aToNode)
  {
    const float kThreatCostFactor = 4;

    float traveltime;
    traveltime = m_TerrainBoard->GetTravelTime(aFromNode->GetX(), aFromNode->GetY(), 
                                               aToNode->GetX(),   aToNode->GetY());

    float risk;
    risk  = m_LOFApproxBoard->GetRiskValue(aToNode->GetX(), aToNode->GetY());
    risk += m_LOFApproxBoard->GetRiskValue(aFromNode->GetX(), aFromNode->GetY());
    risk *= kThreatCostFactor;

    float costs;
    costs = risk * traveltime;

    return costs;
  }


float ASE_Costs::CellBasedThreatsApproximateLOFAimingCosts(_asNode* aFromNode, _asNode* aToNode)
  {
    return VectorBasedThreatsApproximateLOFAimingCosts(aFromNode, aToNode);
  }


float ASE_Costs::VectorBasedThreatsApproximateLOFAimingCosts(_asNode* aFromNode, _asNode* aToNode)
  {
    const float kThreatCostFactor = 0.6f;
    const float kMaxAim           = 5;
    const float kAimDecay         = 0.8f;

    float traveltime;
    traveltime = m_TerrainBoard->GetTravelTime(aFromNode->GetX(), aFromNode->GetY(), 
                                               aToNode->GetX(),   aToNode->GetY());

    float risk;
    risk  = m_LOFApproxBoard->GetRiskValue(aToNode->GetX(), aToNode->GetY());
    risk += m_LOFApproxBoard->GetRiskValue(aFromNode->GetX(), aFromNode->GetY());
    risk *= kThreatCostFactor;

    float aim;
    aim = aFromNode->GetThreatAimQuality();
    if ( risk == 0 )
      {
        // just do decay, travel time based
        aim *= static_cast<float>(pow(kAimDecay, traveltime));
      }    
    else
      {
        aim = min(kMaxAim, aim + traveltime); 
      }
    aToNode->SetThreatAimQuality(aim);

    float costs;
    costs = risk * traveltime * (1 + aim);

    return costs;
  }


float ASE_Costs::CellBasedNormalMovementHeuristic(_asNode* aFromNode, _asNode* aToNode)
  {
    int manhattandist;
    manhattandist =   abs(aFromNode->GetX() - aToNode->GetX())
                    + abs(aFromNode->GetY() - aToNode->GetY());
    return static_cast<float>(manhattandist);
  }


float ASE_Costs::CellBasedRelativeMovementHeuristic(_asNode* aFromNode, _asNode* aToNode)
  {
    return CellBasedNormalMovementHeuristic(aFromNode, aToNode);
  }


float ASE_Costs::VectorBasedNormalMovementHeuristic(_asNode* aFromNode, _asNode* aToNode)
  {
    float distx;
    float disty;
    distx  = static_cast<float>(aToNode->GetX() - aFromNode->GetX());
    distx *= distx;
    disty  = static_cast<float>(aToNode->GetY() - aFromNode->GetY());
    disty *= disty;
    return static_cast<float>(sqrt(distx + disty));
  }


float ASE_Costs::ThreatsAnyModeAnyMovementHeuristic(_asNode* aFromNode, _asNode* aToNode)
  {
    return 0;
  }


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -