www.pudn.com > Sterren_ASe_Explorer.rar > ase_costs.cpp


/* Copyright (C) William van der Sterren, 2002.  
 * All rights reserved worldwide. 
 * 
 * This software is provided "as is" without express or implied 
 * warranties. You may freely copy and compile this source into 
 * applications you distribute provided that the copyright text 
 * below is included in the resulting source code, for example: 
 * "Portions Copyright (C) William van der Sterren, 2002" 
 */ 
 
/* Copyright (C) James Matthews, 2001.  
 * All rights reserved worldwide. 
 * 
 * This software is provided "as is" without express or implied 
 * warranties. You may freely copy and compile this source into 
 * applications you distribute provided that the copyright text 
 * below is included in the resulting source code, for example: 
 * "Portions Copyright (C) James Matthews, 2001" 
 */ 
 
/***************************************************************************   
 *                                                                             
 *     purpose: all cost functions grouped into one file and class 
*/ 
 
 
#include "stdafx.h" 
#include "ase_costs.h" 
 
#include "ase_terrain.h" 
#include "ase_threatboard.h" 
#include "ase_losapproxboard.h" 
#include "asincludes.h" 
 
#include  
 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
 
 
// statics 
const ASE_TerrainBoard*          ASE_Costs::m_TerrainBoard   = 0; 
const ASE_ThreatBoard*           ASE_Costs::m_ThreatBoard    = 0; 
const ASE_LOSApproximationBoard* ASE_Costs::m_LOFApproxBoard = 0; 
 
 
// methods 
void ASE_Costs::SetTerrainBoard(const ASE_TerrainBoard* theTerrainBoard) 
  { 
    assert( theTerrainBoard ); 
    m_TerrainBoard = theTerrainBoard; 
  } 
 
 
void ASE_Costs::SetThreatBoard(const ASE_ThreatBoard* theThreatBoard)   
  { 
    assert( theThreatBoard ); 
    m_ThreatBoard = theThreatBoard; 
  } 
 
 
 
void ASE_Costs::SetLOFApproximationBoard(const ASE_LOSApproximationBoard* theLOFApproxBoard)   
  { 
    assert( theLOFApproxBoard ); 
    m_LOFApproxBoard = theLOFApproxBoard; 
  } 
 
 
 
float ASE_Costs::CellBasedNormalMovementCosts(_asNode* aFromNode, _asNode* aToNode) 
  { 
	  float cost; 
    cost = m_TerrainBoard->GetMovementCostsCellBased(aFromNode->GetX(), aFromNode->GetY(),  
                                                     aToNode->GetX(),   aToNode->GetY()); 
 
	  return cost; 
  } 
 
 
float ASE_Costs::CellBasedRelativeMovementCosts(_asNode* aFromNode, _asNode* aToNode) 
  { 
    float cost; 
    cost = static_cast 
                   ( fabs(  m_TerrainBoard->GetCellValue(aFromNode->GetX(), aFromNode->GetY()) 
                          - m_TerrainBoard->GetCellValue(aToNode->GetX(), aToNode->GetY()) 
                         ) 
                   )  
                 +1.0f; 
 
	  return cost; 
  } 
 
 
float ASE_Costs::VectorBasedNormalMovementCosts(_asNode* aFromNode, _asNode* aToNode) 
  { 
	  float cost; 
    cost = m_TerrainBoard->GetMovementCostsVectorBased(aFromNode->GetX(), aFromNode->GetY(),  
                                                       aToNode->GetX(),   aToNode->GetY()); 
 
	  return cost; 
  } 
 
 
float ASE_Costs::ThreatsNoCosts(_asNode* aFromNode, _asNode* aToNode) 
  { 
    return 0; 
  } 
 
 
float ASE_Costs::CellBasedThreatsSimpleCosts(_asNode* aFromNode, _asNode* aToNode) 
  { 
    assert( ASE_ThreatBoard::eAnyLineOfFire == m_ThreatBoard->GetRiskModus() ); 
 
    const float kThreatCostFactor = 4; 
 
    float costs; 
    if ( !m_ThreatBoard->IsEmptyCell(aToNode->GetX(), aToNode->GetY()) ) 
      costs = kThreatCostFactor; 
    else 
      costs = 0; 
    return costs; 
  } 
 
 
float ASE_Costs::VectorBasedThreatsSimpleCosts(_asNode* aFromNode, _asNode* aToNode) 
  { 
    assert( ASE_ThreatBoard::eAnyLineOfFire == m_ThreatBoard->GetRiskModus() ); 
 
    const float kThreatCostFactor = 2; 
 
    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::CellBasedThreatsAimingCosts(_asNode* aFromNode, _asNode* aToNode) 
  { 
    return VectorBasedThreatsAimingCosts(aFromNode, aToNode); 
  } 
 
 
float ASE_Costs::VectorBasedThreatsAimingCosts(_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_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(pow(kAimDecay, traveltime)); 
      }     
    else 
      { 
        aim = min(kMaxAim, aim + traveltime);  
      } 
    aToNode->SetThreatAimQuality(aim); 
 
    float costs; 
    costs = risk * traveltime * (1 + aim); 
 
    return costs; 
  } 
 
 
float ASE_Costs::VectorBasedDistanceBasedSimpleCosts(_asNode* aFromNode, _asNode* aToNode) 
  { 
    assert( ASE_ThreatBoard::eMinLineOfFireDistance == 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::CellBasedDistanceBasedSimpleCosts(_asNode* aFromNode, _asNode* aToNode) 
  { 
    //! \note: assumes weapon effectivity decreases with linear distance, not with cell distance 
    return VectorBasedDistanceBasedSimpleCosts(aFromNode, aToNode); 
  } 
 
 
float ASE_Costs::VectorBasedDistanceBasedAimingCosts(_asNode* aFromNode, _asNode* aToNode) 
  { 
    assert( ASE_ThreatBoard::eMinLineOfFireDistance == 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(pow(kAimDecay, traveltime)); 
      }     
    else 
      { 
        aim = min(kMaxAim, aim + traveltime);  
      } 
    aToNode->SetThreatAimQuality(aim); 
 
    float costs; 
    costs = risk * traveltime * (1 + aim); 
 
    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(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(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(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(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(aToNode->GetX() - aFromNode->GetX()); 
    distx *= distx; 
    disty  = static_cast(aToNode->GetY() - aFromNode->GetY()); 
    disty *= disty; 
    return static_cast(sqrt(distx + disty)); 
  } 
 
 
float ASE_Costs::ThreatsAnyModeAnyMovementHeuristic(_asNode* aFromNode, _asNode* aToNode) 
  { 
    return 0; 
  }