Skip to content

Commit

Permalink
Add simple tests for NormalFilter
Browse files Browse the repository at this point in the history
True planes in each of XY, XZ, and YZ
  • Loading branch information
chambbj committed Feb 25, 2020
1 parent 4683fdf commit 5d1bd23
Show file tree
Hide file tree
Showing 2 changed files with 161 additions and 0 deletions.
1 change: 1 addition & 0 deletions test/unit/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -279,6 +279,7 @@ PDAL_ADD_TEST(pdal_filters_additional_merge_test
INCLUDES
${NLOHMANN_INCLUDE_DIR}
)
PDAL_ADD_TEST(pdal_filters_normal_test FILES filters/NormalFilterTest.cpp)
PDAL_ADD_TEST(pdal_filters_overlay_test FILES filters/OverlayFilterTest.cpp)
PDAL_ADD_TEST(pdal_filters_pmf_test FILES filters/PMFFilterTest.cpp)
PDAL_ADD_TEST(pdal_filters_reprojection_test FILES
Expand Down
160 changes: 160 additions & 0 deletions test/unit/filters/NormalFilterTest.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,160 @@
/******************************************************************************
* Copyright (c) 2020 Bradley J Chambers (brad.chambers@gmail.com)
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following
* conditions are met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided
* with the distribution.
* * Neither the name of Helix Re Inc. nor the
* names of its contributors may be used to endorse or promote
* products derived from this software without specific prior
* written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
* OF SUCH DAMAGE.
****************************************************************************/

#include <pdal/pdal_test_main.hpp>

#include <filters/NormalFilter.hpp>
#include <io/FauxReader.hpp>
#include <pdal/PointView.hpp>

#include "Support.hpp"

namespace pdal
{

TEST(NormalFilterTest, XYPlane)
{
using namespace Dimension;

PointTable table;
table.layout()->registerDims({Id::X, Id::Y, Id::Z});

FauxReader reader;
Options readerOps;
readerOps.add("mode", "grid");
readerOps.add("bounds", "([0, 2], [0, 2], [0, 0])");
readerOps.add("count", 4);
reader.setOptions(readerOps);
NormalFilter filter;
Options filterOps;
filterOps.add("knn", 3);
filter.setInput(reader);
filter.setOptions(filterOps);
filter.prepare(table);

PointViewSet viewSet = filter.execute(table);
PointViewPtr outView = *viewSet.begin();

Dimension::Id nx = table.layout()->findDim("NormalX");
Dimension::Id ny = table.layout()->findDim("NormalY");
Dimension::Id nz = table.layout()->findDim("NormalZ");
Dimension::Id c = table.layout()->findDim("Curvature");

for (point_count_t idx = 0; idx < outView->size(); ++idx)
{
PointRef p = outView->point(idx);
ASSERT_FLOAT_EQ(p.getFieldAs<float>(nx), 0.0);
ASSERT_FLOAT_EQ(p.getFieldAs<float>(ny), 0.0);
ASSERT_FLOAT_EQ(p.getFieldAs<float>(nz), 1.0);
ASSERT_FLOAT_EQ(p.getFieldAs<float>(c), 0.0);
}
}

TEST(NormalFilterTest, XZPlane)
{
using namespace Dimension;

PointTable table;
table.layout()->registerDims({Id::X, Id::Y, Id::Z});

FauxReader reader;
Options readerOps;
readerOps.add("mode", "grid");
readerOps.add("bounds", "([0, 2], [0, 0], [0, 2])");
readerOps.add("count", 4);
reader.setOptions(readerOps);
NormalFilter filter;
Options filterOps;
filterOps.add("knn", 3);
filter.setInput(reader);
filter.setOptions(filterOps);
filter.prepare(table);

PointViewSet viewSet = filter.execute(table);
PointViewPtr outView = *viewSet.begin();

Dimension::Id nx = table.layout()->findDim("NormalX");
Dimension::Id ny = table.layout()->findDim("NormalY");
Dimension::Id nz = table.layout()->findDim("NormalZ");
Dimension::Id c = table.layout()->findDim("Curvature");

for (point_count_t idx = 0; idx < outView->size(); ++idx)
{
PointRef p = outView->point(idx);
ASSERT_FLOAT_EQ(p.getFieldAs<float>(nx), 0.0);
ASSERT_FLOAT_EQ(p.getFieldAs<float>(ny), 1.0);
ASSERT_FLOAT_EQ(p.getFieldAs<float>(nz), 0.0);
ASSERT_FLOAT_EQ(p.getFieldAs<float>(c), 0.0);
}
}

TEST(NormalFilterTest, YZPlane)
{
using namespace Dimension;

PointTable table;
table.layout()->registerDims({Id::X, Id::Y, Id::Z});

FauxReader reader;
Options readerOps;
readerOps.add("mode", "grid");
readerOps.add("bounds", "([0, 0], [0, 2], [0, 2])");
readerOps.add("count", 4);
reader.setOptions(readerOps);
NormalFilter filter;
Options filterOps;
filterOps.add("knn", 3);
filter.setInput(reader);
filter.setOptions(filterOps);
filter.prepare(table);

PointViewSet viewSet = filter.execute(table);
PointViewPtr outView = *viewSet.begin();

Dimension::Id nx = table.layout()->findDim("NormalX");
Dimension::Id ny = table.layout()->findDim("NormalY");
Dimension::Id nz = table.layout()->findDim("NormalZ");
Dimension::Id c = table.layout()->findDim("Curvature");

for (point_count_t idx = 0; idx < outView->size(); ++idx)
{
PointRef p = outView->point(idx);
ASSERT_FLOAT_EQ(p.getFieldAs<float>(nx), 1.0);
ASSERT_FLOAT_EQ(p.getFieldAs<float>(ny), 0.0);
ASSERT_FLOAT_EQ(p.getFieldAs<float>(nz), 0.0);
ASSERT_FLOAT_EQ(p.getFieldAs<float>(c), 0.0);
}
}

} // namespace pdal

0 comments on commit 5d1bd23

Please sign in to comment.