worked on grid creation
fixed some issues with stairs fixed/added LINT
This commit is contained in:
@@ -31,19 +31,23 @@ private:
|
||||
// keep a list of all vertices below stairwells and remove them hereafter
|
||||
std::vector<T*> toDelete;
|
||||
|
||||
bool tryImproveStairConnections = true;
|
||||
|
||||
private:
|
||||
|
||||
/** helper struct */
|
||||
struct StairNode {
|
||||
|
||||
const int x_cm;
|
||||
const int y_cm;
|
||||
const int belongsToQuadIdx;
|
||||
int x_cm;
|
||||
int y_cm;
|
||||
int belongsToQuadIdx;
|
||||
|
||||
float z_cm; // interpolated
|
||||
int gridIdx = -1;
|
||||
|
||||
StairNode(const int x_cm, const int y_cm, const int quadIdx) : x_cm(x_cm), y_cm(y_cm), belongsToQuadIdx(quadIdx) {;}
|
||||
|
||||
|
||||
};
|
||||
|
||||
|
||||
@@ -62,7 +66,15 @@ public:
|
||||
|
||||
|
||||
|
||||
void build(const Floorplan::Floor* floor, const Floorplan::Stair* stair) {
|
||||
void build(const Floorplan::IndoorMap* map, const Floorplan::Floor* floor, const Floorplan::Stair* stair) {
|
||||
|
||||
// starting-height of all available floors (in cm)
|
||||
// needed to ensure that stairs start and end at floors
|
||||
std::vector<int> floorsAtHeight_cm;
|
||||
for (const Floorplan::Floor* f : map->floors) {
|
||||
const int floorAtHeight_cm = std::round(f->atHeight*100);
|
||||
floorsAtHeight_cm.push_back(floorAtHeight_cm);
|
||||
}
|
||||
|
||||
const int gs_cm = grid.getGridSize_cm();
|
||||
|
||||
@@ -123,20 +135,56 @@ public:
|
||||
|
||||
}
|
||||
|
||||
const float stairAbsStart_m = floor->atHeight + stair->getParts().front().start.z;
|
||||
const float stairAbsEnd_m = floor->atHeight + stair->getParts().back().end.z;
|
||||
//const float stairHeight_m = stairAbsEnd_m - stairAbsStart_m;
|
||||
const float stairAbsStart_cm = std::round(stairAbsStart_m*100);
|
||||
const float stairAbsEnd_cm = std::round(stairAbsEnd_m*100);
|
||||
const float stairHeight_cm = stairAbsEnd_cm - stairAbsStart_cm;
|
||||
|
||||
// this might lead to stairs the start slightly above the starting-floor
|
||||
// or ending slightly below the ending floor. this would lead to DISCONNECTION!
|
||||
// therefore re-scale the z-values to ensure they start at floor1 and end at floor 2
|
||||
float minZ = +9999999;
|
||||
float maxZ = -9999999;
|
||||
for (const StairNode& sn : stairNodes) {
|
||||
if (sn.z_cm < minZ) {minZ = sn.z_cm;}
|
||||
if (sn.z_cm > maxZ) {maxZ = sn.z_cm;}
|
||||
}
|
||||
for (StairNode& sn : stairNodes) {
|
||||
const float zPercent = (sn.z_cm - minZ) / (maxZ - minZ); // current percentage from minZ to maxZ
|
||||
sn.z_cm = floor->getStartingZ()*100 + zPercent * floor->height*100; // apply percentage to floorStartZ <-> floorEndZ
|
||||
{
|
||||
|
||||
float minZ = +9999999;
|
||||
float maxZ = -9999999;
|
||||
for (const StairNode& sn : stairNodes) {
|
||||
if (sn.z_cm < minZ) {minZ = sn.z_cm;}
|
||||
if (sn.z_cm > maxZ) {maxZ = sn.z_cm;}
|
||||
}
|
||||
|
||||
for (StairNode& sn : stairNodes) {
|
||||
const float zPercent = (sn.z_cm - minZ) / (maxZ - minZ); // current percentage from minZ to maxZ
|
||||
//sn.z_cm = floor->getStartingZ()*100 + zPercent * floor->height*100; // apply percentage to floorStartZ <-> floorEndZ
|
||||
sn.z_cm = std::round(stairAbsStart_cm + zPercent * stairHeight_cm); // apply percentage to floorStartZ <-> floorEndZ
|
||||
}
|
||||
|
||||
// snap stair-nodes to nearby grid nodes, if possible
|
||||
if (tryImproveStairConnections) {
|
||||
for (StairNode& sn : stairNodes) {
|
||||
if (std::abs(sn.z_cm-stairAbsStart_cm) < gs_cm*0.75 && grid.hasNodeFor(GridPoint(sn.x_cm, sn.y_cm, stairAbsStart_cm)) ) {sn.z_cm = stairAbsStart_cm;}
|
||||
if (std::abs(sn.z_cm-stairAbsEnd_cm) < gs_cm*0.75 && grid.hasNodeFor(GridPoint(sn.x_cm, sn.y_cm, stairAbsEnd_cm))) {sn.z_cm = stairAbsEnd_cm;}
|
||||
}
|
||||
}
|
||||
|
||||
// stort all stair-nodes by z (ascending)
|
||||
const auto comp = [] (const StairNode& sn1, const StairNode& sn2) {return sn1.z_cm < sn2.z_cm;};
|
||||
std::sort(stairNodes.begin(), stairNodes.end(), comp);
|
||||
|
||||
// get first and last stair note
|
||||
const bool end1OK = std::find(floorsAtHeight_cm.begin(), floorsAtHeight_cm.end(), stairNodes.front().z_cm) != floorsAtHeight_cm.end();
|
||||
const bool end2OK = std::find(floorsAtHeight_cm.begin(), floorsAtHeight_cm.end(), stairNodes.back().z_cm) != floorsAtHeight_cm.end();
|
||||
|
||||
// be sure both are connected to a floor
|
||||
if (!end1OK || !end2OK) {
|
||||
throw Exception("stair's start or end is not directly connectable to a floor");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
// track z-positions of already-existing grid nodes we connected the stair to
|
||||
// if this list contains 2 distinctive values, the stair is successfully connected to starting and ending floor!
|
||||
std::unordered_set<float> connectedWithHeights;
|
||||
@@ -167,15 +215,16 @@ public:
|
||||
// check if there is a nearby floor-node to delete
|
||||
// -> remove nodes directly above/below the stair
|
||||
const int deleteDist_cm = 100;
|
||||
const float distToBelow = gp.z_cm - floor->getStartingZ()*100;
|
||||
const float distToAbove = floor->getEndingZ()*100 - gp.z_cm;
|
||||
const float distToBelow = gp.z_cm - stairAbsStart_cm;//floor->getStartingZ()*100;
|
||||
const float distToAbove = stairAbsEnd_cm - gp.z_cm;//floor->getEndingZ()*100 - gp.z_cm;
|
||||
//if (distToBelow > gs_cm && distToBelow < deleteDist_cm) {
|
||||
if (distToBelow > 0 && distToBelow < deleteDist_cm) {
|
||||
T* n = (T*) grid.getNodePtrFor(GridPoint(gp.x_cm, gp.y_cm, floor->getStartingZ()*100));
|
||||
T* n = (T*) grid.getNodePtrFor(GridPoint(gp.x_cm, gp.y_cm, stairAbsStart_cm));//floor->getStartingZ()*100));
|
||||
if (n) {toDelete.push_back(n);}
|
||||
//} else if (distToAbove > gs_cm && distToAbove < deleteDist_cm) {
|
||||
} else if (distToAbove > 0 && distToAbove < deleteDist_cm) {
|
||||
T* n = (T*) grid.getNodePtrFor(GridPoint(gp.x_cm, gp.y_cm, floor->getEndingZ()*100));
|
||||
}
|
||||
if (distToAbove > 0 && distToAbove < deleteDist_cm) {
|
||||
T* n = (T*) grid.getNodePtrFor(GridPoint(gp.x_cm, gp.y_cm, stairAbsEnd_cm));//floor->getEndingZ()*100));
|
||||
if (n) {toDelete.push_back(n);}
|
||||
}
|
||||
|
||||
@@ -191,7 +240,7 @@ public:
|
||||
// one for the starting floor
|
||||
// one for the ending floor
|
||||
// this mainly fails, when there is a REMOVING outline-area that removes to many nodes and the stair can not be connected
|
||||
Assert::isTrue(connectedWithHeights.size() == 2, "stair is not correctly connected to starting and ending floor!");
|
||||
Assert::isTrue(connectedWithHeights.size() == 2, "stair is not correctly connected to starting and ending floor!");
|
||||
|
||||
// now connect all new nodes with their neighbors
|
||||
// do not perform normal grid-connection but examine the nodes within the generated vector
|
||||
|
||||
Reference in New Issue
Block a user