Skip to content

Commit

Permalink
Add 64 bit map distance square function, use clamping for uint version
Browse files Browse the repository at this point in the history
  • Loading branch information
JGRennison committed Oct 20, 2024
1 parent fd05cdd commit 713014c
Show file tree
Hide file tree
Showing 4 changed files with 7 additions and 8 deletions.
4 changes: 1 addition & 3 deletions src/linkgraph/linkgraph_gui.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -648,10 +648,8 @@ bool LinkGraphOverlay::ShowTooltip(Point pt, TooltipCloseCondition close_cond)
builder += "\n\n";
TileIndex t0 = Station::Get(i->from_id)->xy;
TileIndex t1 = Station::Get(i->to_id)->xy;
uint dx = Delta(TileX(t0), TileX(t1));
uint dy = Delta(TileY(t0), TileY(t1));
SetDParam(0, DistanceManhattan(t0, t1));
SetDParam(1, IntSqrt64(((uint64_t)dx * (uint64_t)dx) + ((uint64_t)dy * (uint64_t)dy))); // Avoid overflow in DistanceSquare
SetDParam(1, IntSqrt64(DistanceSquare64(t0, t1))); // Avoid overflow in DistanceSquare
GetString(builder, STR_LINKGRAPH_STATS_TOOLTIP_DISTANCE);
}

Expand Down
6 changes: 3 additions & 3 deletions src/map.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -250,10 +250,10 @@ uint DistanceManhattan(TileIndex t0, TileIndex t1)
* @param t1 the end tile
* @return the distance
*/
uint DistanceSquare(TileIndex t0, TileIndex t1)
uint64_t DistanceSquare64(TileIndex t0, TileIndex t1)
{
const int dx = TileX(t0) - TileX(t1);
const int dy = TileY(t0) - TileY(t1);
const int64_t dx = (int)TileX(t0) - (int)TileX(t1);
const int64_t dy = (int)TileY(t0) - (int)TileY(t1);
return dx * dx + dy * dy;
}

Expand Down
3 changes: 2 additions & 1 deletion src/map_func.h
Original file line number Diff line number Diff line change
Expand Up @@ -350,7 +350,8 @@ inline TileIndexDiffC TileIndexToTileIndexDiffC(TileIndex tile_a, TileIndex tile

/* Functions to calculate distances */
uint DistanceManhattan(TileIndex, TileIndex); ///< also known as L1-Norm. Is the shortest distance one could go over diagonal tracks (or roads)
uint DistanceSquare(TileIndex, TileIndex); ///< euclidian- or L2-Norm squared
uint64_t DistanceSquare64(TileIndex, TileIndex); ///< euclidian- or L2-Norm squared
inline uint DistanceSquare(TileIndex t0, TileIndex t1) { return ClampTo<uint>(DistanceSquare64(t0, t1)); }
uint DistanceMax(TileIndex, TileIndex); ///< also known as L-Infinity-Norm
uint DistanceMaxPlusManhattan(TileIndex, TileIndex); ///< Max + Manhattan
uint DistanceFromEdge(TileIndex); ///< shortest distance from any edge of the map
Expand Down
2 changes: 1 addition & 1 deletion src/viewport.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6477,7 +6477,7 @@ calc_heightdiff_single_direction:;
if (dx != 1 || dy != 1) {
heightdiff = CalcHeightdiff(style, 0, t0, t1);
SetDParam(0, DistanceManhattan(t0, t1));
SetDParam(1, IntSqrt64(((uint64_t)dx * (uint64_t)dx) + ((uint64_t)dy * (uint64_t)dy))); // Avoid overflow in DistanceSquare
SetDParam(1, IntSqrt64(DistanceSquare64(t0, t1))); // Avoid overflow in DistanceSquare
} else {
SetDParam(0, 0);
SetDParam(1, 0);
Expand Down

0 comments on commit 713014c

Please sign in to comment.