载入中...
搜索中...
未找到
RTSFormationClearance.cpp
浏览该文件的文档.
1#include "map/Pathfinder.h"
3
4#include <algorithm>
5#include <cmath>
6#include <limits>
7
11 if (!isFinitePosition(from) || !isFinitePosition(to) || !std::isfinite(radius) || radius <= 0.f ||
12 !std::isfinite(grid.cellSize) || grid.cellSize <= 0.f || !std::isfinite(grid.originX) ||
13 !std::isfinite(grid.originY))
14 return false;
15 const double cell = grid.cellSize;
16 const double ax = (static_cast<double>(from.x) - grid.originX) / cell;
17 const double ay = (static_cast<double>(from.y) - grid.originY) / cell;
18 const double bx = (static_cast<double>(to.x) - grid.originX) / cell;
19 const double by = (static_cast<double>(to.y) - grid.originY) / cell;
20 const double reach = static_cast<double>(radius) / cell + 0.5;
21 const double minX = std::ceil(std::min(ax, bx) - reach);
22 const double maxX = std::floor(std::max(ax, bx) + reach);
23 const double minY = std::ceil(std::min(ay, by) - reach);
24 const double maxY = std::floor(std::max(ay, by) + reach);
25 constexpr double minIndex = static_cast<double>(std::numeric_limits<int>::min()) + 1.0;
26 constexpr double maxIndex = static_cast<double>(std::numeric_limits<int>::max()) - 1.0;
27 if (minX < minIndex || maxX > maxIndex || minY < minIndex || maxY > maxIndex ||
28 (maxX - minX + 1.0) * (maxY - minY + 1.0) > 4096.0)
29 return false;
30 for (int y = static_cast<int>(minY); y <= static_cast<int>(maxY); ++y) {
31 for (int x = static_cast<int>(minX); x <= static_cast<int>(maxX); ++x) {
32 if (pathfinder.isWalkable(x, y)) continue;
33 double enter = 0.0, leave = 1.0;
34 const auto intersectsSlab = [&](double start, double delta, double low, double high) {
35 if (delta == 0.0) return start >= low && start <= high;
36 double first = (low - start) / delta;
37 double last = (high - start) / delta;
38 if (first > last) std::swap(first, last);
39 enter = std::max(enter, first);
40 leave = std::min(leave, last);
41 return enter <= leave;
42 };
43 if (intersectsSlab(ax, bx - ax, x - reach, x + reach) && intersectsSlab(ay, by - ay, y - reach, y + reach))
44 return false;
45 }
46 }
47 return true;
48}
49} // namespace eve::rts::systems_internal
Duration start
float y
Definition AnimClip.cpp:738
float x
Definition AnimClip.cpp:738
std::string from
int ax
Definition CaveMesh.cpp:113
int ay
Definition CaveMesh.cpp:113
int bx
Definition CaveMesh.cpp:114
int by
Definition CaveMesh.cpp:114
#define EVENGINE_API_DOMAINS
Definition Export.h:110
std::int32_t first
HexCoordinates to
Cell the unit walks towards on this segment.
Definition HexUnits.cpp:64
float radius
Cell cell
Pathfinding facade. Single-agent: A*. Group (same goal): Flow Field + follow. Grid/topology internals...
Definition Pathfinder.h:20
bool isWalkable(int x, int y) const
True when walkable.
bool isFinitePosition(WorldPosition position)
EVENGINE_API_DOMAINS bool isFormationSegmentClear(const map::Pathfinder &pathfinder, const NavigationGrid &grid, WorldPosition from, WorldPosition to, float radius)
World/grid conversion used when an RTS composition consumes a canonical map Pathfinder.
Definition RTSSystems.h:263
Two-dimensional deterministic RTS world position.
Definition RTSTypes.h:48