#ifndef INDOOR_GW3_STRUCTS_H #define INDOOR_GW3_STRUCTS_H #include "../../../geo/Heading.h" #include "../../../geo/Point3.h" #include #include "../../../math/Distributions.h" #include "../../../grid/Grid.h" namespace GW3 { struct StepSizes { float stepSizeFloor_m = NAN; float stepSizeStair_m = NAN; bool isValid() const { return (stepSizeFloor_m==stepSizeFloor_m) && (stepSizeStair_m==stepSizeStair_m); } template float inMeter(const int steps, const Point3 start, const Grid& grid) const { Assert::isTrue(isValid(), "invalid step-sizes given"); const GridPoint gp = grid.toGridPoint(start); const Node& n = grid.getNodeFor(gp); if (grid.isPlain(n)) { return stepSizeFloor_m * steps; } else { return stepSizeStair_m * steps; } } }; /** paremters for the walk */ struct WalkParams { //Distribution::Normal dDistFloor; //Distribution::Normal dDistStair; Point3 start; //float distance_m; int numSteps; Heading heading = Heading(0); float lookFurther_m = 1.5; StepSizes stepSizes; template float getDistanceInMeter(const Grid& grid) const { return stepSizes.inMeter(numSteps, start, grid); } }; /** result of the random walk */ struct WalkResult { Point3 position; Heading heading = Heading(0); double probability = 1.0; }; /** several nodes */ template struct Nodes : public std::vector { }; /** one walk along several nodes */ template struct Walk : public std::vector { }; /** several walks */ template struct Walks : public std::vector> { }; } #endif // INDOOR_GW3_STRUCTS_H