Skip to content

Commit

Permalink
Add octile distance for tripoints.
Browse files Browse the repository at this point in the history
Part of #74945. This will allow for better vertical pathfinding calculations,
allowing flying monsters to actually fly.
  • Loading branch information
CLIDragon committed Nov 7, 2024
1 parent 60cf27e commit 3758efa
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 1 deletion.
8 changes: 8 additions & 0 deletions src/coordinates.h
Original file line number Diff line number Diff line change
Expand Up @@ -840,6 +840,14 @@ inline int octile_dist( const coords::coord_point_ob<Point, Origin, Scale> &loc1
return octile_dist( loc1.raw(), loc2.raw(), multiplier );
}


template<typename Point, coords::origin Origin, coords::scale Scale>
inline float octile_dist_exact( const coords::coord_point<Point, Origin, Scale> &loc1,
const coords::coord_point<Point, Origin, Scale> &loc2 )
{
return octile_dist_exact( loc1.raw(), loc2.raw() );
}

template<typename Point, coords::origin Origin, coords::scale Scale>
direction direction_from( const coords::coord_point_ob<Point, Origin, Scale> &loc1,
const coords::coord_point_ob<Point, Origin, Scale> &loc2 )
Expand Down
13 changes: 13 additions & 0 deletions src/line.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -284,6 +284,19 @@ float octile_dist_exact( const point &loc1, const point &loc2 )
return d.x + d.y - 2 * mind + mind * M_SQRT2;
}

float octile_dist_exact( const tripoint &from, const tripoint &to )
{
const tripoint d = ( from - to ).abs();
const int min = std::min( d.x, std::min( d.y, d.z ) );
const int max = std::max( d.x, std::max( d.y, d.z ) );
const int mid = d.x + d.y + d.z - min - max;

constexpr int one_axis = 1;
constexpr float two_axis = M_SQRT2;
constexpr float three_axis = 1.73205f;
return ( three_axis - two_axis ) * min + ( two_axis - one_axis ) * mid + one_axis * max;
}

units::angle atan2( const point &p )
{
return units::atan2( p.y, p.x );
Expand Down
3 changes: 2 additions & 1 deletion src/line.h
Original file line number Diff line number Diff line change
Expand Up @@ -254,9 +254,10 @@ float rl_dist_exact( const tripoint &loc1, const tripoint &loc2 );
int manhattan_dist( const point &loc1, const point &loc2 );

// Travel distance between 2 points on a square grid, assuming diagonal moves
// cost sqrt(2) and cardinal moves cost 1.
// cost sqrt(2) or sqrt(3) and cardinal moves cost 1.
int octile_dist( const point &loc1, const point &loc2, int multiplier = 1 );
float octile_dist_exact( const point &loc1, const point &loc2 );
float octile_dist_exact( const tripoint &from, const tripoint &to );

// get angle of direction represented by point
units::angle atan2( const point & );
Expand Down

0 comments on commit 3758efa

Please sign in to comment.