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

📄 ase_costs.cpp

📁 A*算法的演示程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/* 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 <cmath>


#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<float>
                   ( 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<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::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<float>(pow(kAimDecay, traveltime));
      }    
    else
      {
        aim = min(kMaxAim, aim + traveltime); 
      }
    aToNode->SetThreatAimQuality(aim);

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

⌨️ 快捷键说明

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