| 41 | using namespace pdal; |
| 42 | |
| 43 | TEST(NNDistanceTest, kdist) |
| 44 | { |
| 45 | StageFactory f; |
| 46 | Stage *reader(f.createStage("readers.faux")); |
| 47 | Stage *filter(f.createStage("filters.nndistance")); |
| 48 | |
| 49 | // Make a 10x10x10 grid of points. |
| 50 | Options rOpts; |
| 51 | rOpts.add("mode", "grid"); |
| 52 | rOpts.add("bounds", "([0, 10],[0,10],[0,10])"); |
| 53 | rOpts.add("count", 1000); |
| 54 | reader->setOptions(rOpts); |
| 55 | |
| 56 | // Kth distance with k == 3 |
| 57 | Options fOpts; |
| 58 | fOpts.add("mode", "kth"); |
| 59 | fOpts.add("k", 3); |
| 60 | filter->setOptions(fOpts); |
| 61 | filter->setInput(*reader); |
| 62 | |
| 63 | PointTable t; |
| 64 | filter->prepare(t); |
| 65 | PointViewSet s = filter->execute(t); |
| 66 | PointViewPtr v = *(s.begin()); |
| 67 | |
| 68 | for (PointId i = 0; i < v->size(); ++i) |
| 69 | EXPECT_EQ(v->getFieldAs<double>(Dimension::Id::NNDistance, i), 1); |
| 70 | |
| 71 | // Kth distance with k == 4 |
| 72 | Options opts2; |
| 73 | opts2.add("k", 4); |
| 74 | filter->setOptions(opts2); |
| 75 | |
| 76 | PointTable t2; |
| 77 | filter->prepare(t2); |
| 78 | s = filter->execute(t2); |
| 79 | v = *(s.begin()); |
| 80 | |
| 81 | for (PointId i = 0; i < v->size(); ++i) |
| 82 | { |
| 83 | double d = v->getFieldAs<double>(Dimension::Id::NNDistance, i); |
| 84 | double x = v->getFieldAs<double>(Dimension::Id::X, i); |
| 85 | double y = v->getFieldAs<double>(Dimension::Id::Y, i); |
| 86 | double z = v->getFieldAs<double>(Dimension::Id::Z, i); |
| 87 | if ((x == 9 || x == 0) && (y == 9 || y == 0) && (z == 9 || z == 0)) |
| 88 | EXPECT_EQ(d, sqrt(2)); |
| 89 | } |
| 90 | |
| 91 | // Test for avg distance. |
| 92 | Options opts3; |
| 93 | opts3.add("mode", "avg"); |
| 94 | opts3.add("k", 6); |
| 95 | filter->setOptions(opts3); |
| 96 | |
| 97 | PointTable t3; |
| 98 | filter->prepare(t3); |
| 99 | s = filter->execute(t3); |
| 100 | v = *(s.begin()); |
nothing calls this directly
no test coverage detected