added new sanity checks and compile-time assertions to prevent errors
fixed stair-building issue new test-cases added elevator support fixed/improved some walker modules
This commit is contained in:
@@ -26,7 +26,12 @@ struct HelperPoly {
|
||||
|
||||
/** ctor from floorplan-quad */
|
||||
HelperPoly(const Floorplan::Quad3& quad) {
|
||||
add(quad.p1); add(quad.p2); add(quad.p3); add(quad.p4);
|
||||
add(quad.p1*100); add(quad.p2*100); add(quad.p3*100); add(quad.p4*100);
|
||||
}
|
||||
|
||||
/** ctor from floorplan-polygon */
|
||||
HelperPoly(const Floorplan::Polygon2& poly) {
|
||||
for (Point2 p : poly.points) { add(p * 100); }
|
||||
}
|
||||
|
||||
void add(const Point2 p) {
|
||||
@@ -67,6 +72,30 @@ struct HelperPoly {
|
||||
|
||||
}
|
||||
|
||||
/** call a user-function for each GRID-ALIGNED point within the polygon */
|
||||
void forEachGridPoint(const int gridSize_cm, std::function<void(int x_cm, int y_cm)> callback) const {
|
||||
|
||||
int x1 = std::floor(bbox_cm.getMin().x / gridSize_cm) * gridSize_cm;
|
||||
int x2 = std::ceil(bbox_cm.getMax().x / gridSize_cm) * gridSize_cm;
|
||||
|
||||
int y1 = std::floor(bbox_cm.getMin().y / gridSize_cm) * gridSize_cm;
|
||||
int y2 = std::ceil(bbox_cm.getMax().y / gridSize_cm) * gridSize_cm;
|
||||
|
||||
// process each point within the (aligned) bbox
|
||||
for (int y = y1; y <= y2; y += gridSize_cm) {
|
||||
for (int x = x1; x <= x2; x += gridSize_cm) {
|
||||
|
||||
// does this point belong to the polygon?
|
||||
if (!contains(Point2(x,y))) {continue;}
|
||||
|
||||
// call the callback
|
||||
callback(x,y);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
|
||||
@@ -94,7 +123,7 @@ public:
|
||||
|
||||
}
|
||||
|
||||
/** connect the given node to all its neighbors */
|
||||
/** connect the given node to all its neighbors (x,y) */
|
||||
void connectToNeighbors(T& n1) {
|
||||
|
||||
const int gs_cm = grid.getGridSize_cm();
|
||||
@@ -120,6 +149,32 @@ public:
|
||||
}
|
||||
|
||||
|
||||
/** connect the given node to all its neighbors )x,y,z) */
|
||||
void connectToNeighborsXYZ(T& n1) {
|
||||
|
||||
const int gs_cm = grid.getGridSize_cm();
|
||||
|
||||
for (int z = -gs_cm; z <= +gs_cm; z += gs_cm) {
|
||||
for (int y = -gs_cm; y <= +gs_cm; y += gs_cm) {
|
||||
for (int x = -gs_cm; x <= +gs_cm; x += gs_cm) {
|
||||
|
||||
// skip the node itself
|
||||
if (x == 0 && y == 0 && z == 0) {continue;}
|
||||
|
||||
// try to find a matching neighbor
|
||||
const GridPoint gp(n1.x_cm + x, n1.y_cm + y, n1.z_cm + z);
|
||||
const T* n2 = grid.getNodePtrFor(gp);
|
||||
if (!n2) {continue;}
|
||||
|
||||
// connect
|
||||
if (n1.hasNeighbor(n2->getIdx())) {continue;}
|
||||
grid.connectUniDir(n1, *n2);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
int gridSize() const {
|
||||
return grid.getGridSize_cm();;
|
||||
|
||||
Reference in New Issue
Block a user