Skip to content

Commit

Permalink
added tests for untested aabb primitives
Browse files Browse the repository at this point in the history
  • Loading branch information
soesau committed Apr 17, 2024
1 parent 8cd4e29 commit 2c41686
Show file tree
Hide file tree
Showing 9 changed files with 323 additions and 12 deletions.
16 changes: 8 additions & 8 deletions AABB_tree/examples/AABB_tree/AABB_indexed_triangle_2_example.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ struct Projection_xy_point_map {
}
};

typedef std::vector<std::array<uint8_t, 3> >::iterator IndexIterator;
typedef std::vector<std::array<uint8_t, 3> >::const_iterator IndexIterator;
typedef std::vector<Point_3> PointRange;
typedef CGAL::AABB_indexed_triangle_primitive_2<K, IndexIterator, PointRange, CGAL::Tag_false, Projection_xy_point_map<K>> Primitive;
typedef CGAL::AABB_traits_2<K, Primitive> AABB_triangle_traits;
Expand Down Expand Up @@ -61,17 +61,17 @@ int main()
// point sampling
Point_and_primitive_id id;
id = tree.closest_point_and_primitive(Point_2(0.5, 0.4));
std::cout << std::distance(triangles.begin(), id.second) << ". triangle" << std::endl;
std::cout << std::distance(triangles.cbegin(), id.second) << ". triangle" << std::endl;
id = tree.closest_point_and_primitive(Point_2(0.5, 0.6));
std::cout << std::distance(triangles.begin(), id.second) << ". triangle" << std::endl;
std::cout << std::distance(triangles.cbegin(), id.second) << ". triangle" << std::endl;
id = tree.closest_point_and_primitive(Point_2(1.5, 0.5));
std::cout << std::distance(triangles.begin(), id.second) << ". triangle" << std::endl;
std::cout << std::distance(triangles.cbegin(), id.second) << ". triangle" << std::endl;
id = tree.closest_point_and_primitive(Point_2(1.5, 0.6));
std::cout << std::distance(triangles.begin(), id.second) << ". triangle" << std::endl;
std::cout << std::distance(triangles.cbegin(), id.second) << ". triangle" << std::endl;
id = tree.closest_point_and_primitive(Point_2(1.0, 0.0));
std::cout << std::distance(triangles.begin(), id.second) << ". triangle" << std::endl;
std::cout << std::distance(triangles.cbegin(), id.second) << ". triangle" << std::endl;
id = tree.closest_point_and_primitive(Point_2(3.0, 0.5));
std::cout << std::distance(triangles.begin(), id.second) << ". triangle" << std::endl;
std::cout << std::distance(triangles.cbegin(), id.second) << ". triangle" << std::endl;

Ray ray(Point_2(5.5, 0.5), Point_2(1.5, 0.5));
Ray_intersection intersection = tree.first_intersection(ray);
Expand All @@ -81,7 +81,7 @@ int main()
return EXIT_FAILURE;
}
else {
std::cout << std::distance(triangles.begin(), intersection->second) << ". triangle" << std::endl;
std::cout << std::distance(triangles.cbegin(), intersection->second) << ". triangle" << std::endl;
}

std::list<Ray_intersection> intersections;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,14 +14,14 @@ typedef K::Segment_2 Segment;
typedef K::Point_2 Point;

typedef std::vector<Point> PointRange;
typedef PointRange::iterator Iterator_pr;
typedef PointRange::const_iterator Iterator_pr;
typedef CGAL::AABB_polyline_segment_primitive_2<K, Iterator_pr, PointRange> Primitive_pr;
typedef CGAL::AABB_traits_2<K, Primitive_pr> Traits_pr;
typedef CGAL::AABB_tree<Traits_pr> Tree_pr;
typedef Tree_pr::Point_and_primitive_id Point_and_primitive_id_pr;

typedef CGAL::Polygon_2<K> Polygon_2;
typedef Polygon_2::iterator Iterator_poly;
typedef Polygon_2::const_iterator Iterator_poly;
typedef CGAL::AABB_polyline_segment_primitive_2<K, Iterator_poly, Polygon_2> Primitive_poly;
typedef CGAL::AABB_traits_2<K, Primitive_poly> Traits_poly;
typedef CGAL::AABB_tree<Traits_poly> Tree_poly;
Expand Down
2 changes: 1 addition & 1 deletion AABB_tree/examples/AABB_tree/AABB_segment_2_example.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ typedef K::Segment_2 Segment;
typedef K::Point_2 Point;

typedef std::list<Segment> SegmentRange;
typedef SegmentRange::iterator Iterator;
typedef SegmentRange::const_iterator Iterator;
typedef CGAL::AABB_segment_primitive_2<K, Iterator> Primitive;
typedef CGAL::AABB_traits_2<K, Primitive> Traits;
typedef CGAL::AABB_tree<Traits> Tree;
Expand Down
2 changes: 1 addition & 1 deletion AABB_tree/examples/AABB_tree/AABB_triangle_3_example.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ typedef K::Ray_3 Ray;
typedef K::Point_3 Point;
typedef K::Triangle_3 Triangle;

typedef std::list<Triangle>::iterator Iterator;
typedef std::list<Triangle>::const_iterator Iterator;
typedef CGAL::AABB_triangle_primitive_3<K, Iterator> Primitive;
typedef CGAL::AABB_traits_3<K, Primitive> AABB_triangle_traits;
typedef CGAL::AABB_tree<AABB_triangle_traits> Tree;
Expand Down
88 changes: 88 additions & 0 deletions AABB_tree/test/AABB_tree/aabb_test_indexed_triangle_2.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
#include <iostream>
#include <vector>
#include <array>

#include <CGAL/Simple_cartesian.h>
#include <CGAL/AABB_tree.h>
#include <CGAL/AABB_traits_2.h>
#include <CGAL/AABB_indexed_triangle_primitive_2.h>

typedef CGAL::Simple_cartesian<double> K;
typedef K::Point_3 Point_3;
typedef K::Point_2 Point_2;
typedef K::Ray_2 Ray;

template <class GeomTraits>
struct Projection_xy_point_map {

typedef typename GeomTraits::Point_3 key_type;
typedef typename GeomTraits::Point_2 value_type;
typedef value_type reference;

typedef boost::readable_property_map_tag category;
typedef Projection_xy_point_map<GeomTraits> Self;

Projection_xy_point_map() {}

inline friend value_type get(Self, key_type p)
{
return value_type(p.x(), p.y());
}
};

typedef std::vector<std::array<uint8_t, 3> >::const_iterator IndexIterator;
typedef std::vector<Point_3> PointRange;
typedef CGAL::AABB_indexed_triangle_primitive_2<K, IndexIterator, PointRange, CGAL::Tag_false, Projection_xy_point_map<K>> Primitive;
typedef CGAL::AABB_traits_2<K, Primitive> AABB_triangle_traits;
typedef CGAL::AABB_tree<AABB_triangle_traits> Tree;
typedef Tree::Point_and_primitive_id Point_and_primitive_id;
typedef std::optional<Tree::Intersection_and_primitive_id<Ray>::Type> Ray_intersection;

int main()
{
Point_3 a(0.0, 0.0, 0.0);
Point_3 b(0.0, 1.0, 0.0);
Point_3 c(1.0, 0.0, 0.0);
Point_3 d(1.0, 1.0, 0.0);
Point_3 e(2.0, 0.0, 0.0);
Point_3 f(2.0, 1.0, 0.0);

std::vector<Point_3> points = { a, b, c, d, e, f };

std::vector<std::array<uint8_t, 3> > triangles;
triangles.push_back({ 0, 2, 1 });
triangles.push_back({ 1, 2, 3 });
triangles.push_back({ 3, 2, 4 });
triangles.push_back({ 3, 4, 5 });

// constructs AABB tree
Tree tree(triangles.begin(), triangles.end(), points);

// point sampling
Point_and_primitive_id id;
id = tree.closest_point_and_primitive(Point_2(0.5, 0.4));
assert(std::distance(triangles.cbegin(), id.second) == 0);
id = tree.closest_point_and_primitive(Point_2(0.5, 0.6));
assert(std::distance(triangles.cbegin(), id.second) == 1);
id = tree.closest_point_and_primitive(Point_2(1.5, 0.5));
assert(std::distance(triangles.cbegin(), id.second) == 2);
id = tree.closest_point_and_primitive(Point_2(1.5, 0.6));
assert(std::distance(triangles.cbegin(), id.second) == 3);
id = tree.closest_point_and_primitive(Point_2(1.0, 0.0));
assert(std::distance(triangles.cbegin(), id.second) == 0);
id = tree.closest_point_and_primitive(Point_2(3.0, 0.5));
assert(std::distance(triangles.cbegin(), id.second) == 3);

Ray ray(Point_2(5.5, 0.5), Point_2(1.5, 0.5));
Ray_intersection intersection = tree.first_intersection(ray);

assert(intersection.has_value());

assert(std::distance(triangles.cbegin(), intersection->second) == 3);

std::list<Ray_intersection> intersections;
tree.all_intersections(ray, std::back_inserter(intersections));
assert(intersections.size() == 4);

return EXIT_SUCCESS;
}
66 changes: 66 additions & 0 deletions AABB_tree/test/AABB_tree/aabb_test_polyline_segment_2.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
#include <iostream>
#include <vector>

#include <CGAL/Simple_cartesian.h>
#include <CGAL/AABB_tree.h>
#include <CGAL/AABB_traits_2.h>
#include <CGAL/AABB_polyline_segment_primitive_2.h>
#include <CGAL/AABB_segment_primitive_2.h>
#include <CGAL/Polygon_2.h>

typedef CGAL::Simple_cartesian<double> K;
typedef K::Segment_2 Segment;
typedef K::Point_2 Point;

typedef std::vector<Point> PointRange;
typedef PointRange::const_iterator Iterator_pr;
typedef CGAL::AABB_polyline_segment_primitive_2<K, Iterator_pr, PointRange> Primitive_pr;
typedef CGAL::AABB_traits_2<K, Primitive_pr> Traits_pr;
typedef CGAL::AABB_tree<Traits_pr> Tree_pr;
typedef Tree_pr::Point_and_primitive_id Point_and_primitive_id_pr;

typedef CGAL::Polygon_2<K> Polygon_2;
typedef Polygon_2::const_iterator Iterator_poly;
typedef CGAL::AABB_polyline_segment_primitive_2<K, Iterator_poly, Polygon_2> Primitive_poly;
typedef CGAL::AABB_traits_2<K, Primitive_poly> Traits_poly;
typedef CGAL::AABB_tree<Traits_poly> Tree_poly;
typedef Tree_poly::Point_and_primitive_id Point_and_primitive_id_poly;

template<class AABBTree, class PPId>
void test(AABBTree tree) {
tree.build();

tree.accelerate_distance_queries();

// counts #intersections with a segment query
Segment segment_query(Point(1.0, 0.0), Point(0.0, 7.0));

assert(tree.number_of_intersected_primitives(segment_query) == 2);

// computes the closest point from a point query
Point point_query(4.0, 5.0);
Point closest = tree.closest_point(point_query);
assert(closest == Point(3.0, 4.0));

PPId id = tree.closest_point_and_primitive(point_query);
assert(id.first == closest);
}

int main()
{
Point a(0.0, 0.0);
Point b(2.0, 1.0);
Point c(3.0, 4.0);
Point d(1.0, 6.0);
Point e(-1.0, 3.0);

std::vector<Point> polyline = { a, b, c, d, e };

Polygon_2 poly(polyline.begin(), polyline.end());

test<Tree_poly, Point_and_primitive_id_poly>(Tree_poly(poly.begin(), poly.end(), poly));

test<Tree_pr, Point_and_primitive_id_pr>(Tree_pr(polyline.begin(), std::prev(polyline.end()), polyline));

return EXIT_SUCCESS;
}
58 changes: 58 additions & 0 deletions AABB_tree/test/AABB_tree/aabb_test_segment_2.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
#include <iostream>
#include <list>

#include <CGAL/Simple_cartesian.h>
#include <CGAL/AABB_tree.h>
#include <CGAL/AABB_traits_2.h>
#include <CGAL/AABB_segment_primitive_2.h>
#include <CGAL/Polygon_2.h>

typedef CGAL::Simple_cartesian<double> K;

typedef K::FT FT;
typedef K::Segment_2 Segment;
typedef K::Point_2 Point;

typedef std::list<Segment> SegmentRange;
typedef SegmentRange::const_iterator Iterator;
typedef CGAL::AABB_segment_primitive_2<K, Iterator> Primitive;
typedef CGAL::AABB_traits_2<K, Primitive> Traits;
typedef CGAL::AABB_tree<Traits> Tree;
typedef Tree::Point_and_primitive_id Point_and_primitive_id;

int main()
{
Point a(0.0, 0.0);
Point b(2.0, 1.0);
Point c(3.0, 4.0);
Point d(1.0, 6.0);
Point e(-1.0, 3.0);

std::list<Segment> seg;
seg.push_back(Segment(a, b));
seg.push_back(Segment(b, c));
seg.push_back(Segment(c, d));
seg.push_back(Segment(d, e));
seg.push_back(Segment(e, a));

// constructs the AABB tree and the internal search tree for
// efficient distance computations.
Tree tree(seg.begin(), seg.end());
tree.build();

tree.accelerate_distance_queries();

// counts #intersections with a segment query
Segment segment_query(Point(1.0, 0.0), Point(0.0, 7.0));
assert(tree.number_of_intersected_primitives(segment_query) == 2);

// computes the closest point from a point query
Point point_query(5.0, 5.0);
Point closest = tree.closest_point(point_query);
assert(closest == c);

Point_and_primitive_id id = tree.closest_point_and_primitive(Point(1.5, 3.0));
assert(id.second->source() == b && id.second->target() == c);

return EXIT_SUCCESS;
}
50 changes: 50 additions & 0 deletions AABB_tree/test/AABB_tree/aabb_test_triangle_2.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
// Author(s) : Camille Wormser, Pierre Alliez

#include <iostream>
#include <list>

#include <CGAL/Simple_cartesian.h>
#include <CGAL/AABB_tree.h>
#include <CGAL/AABB_traits_2.h>
#include <CGAL/AABB_triangle_primitive_2.h>

typedef CGAL::Simple_cartesian<double> K;

typedef K::FT FT;
typedef K::Ray_2 Ray;
typedef K::Point_2 Point;
typedef K::Triangle_2 Triangle;

typedef std::list<Triangle>::const_iterator Iterator;
typedef CGAL::AABB_triangle_primitive_2<K, Iterator> Primitive;
typedef CGAL::AABB_traits_2<K, Primitive> AABB_triangle_traits;
typedef CGAL::AABB_tree<AABB_triangle_traits> Tree;

int main()
{
Point a(1.0, 0.0);
Point b(0.0, 1.0);
Point c(1.0, 1.0);
Point d(0.0, 0.0);

std::list<Triangle> triangles;
triangles.push_back(Triangle(a, b, c));
triangles.push_back(Triangle(a, b, d));
triangles.push_back(Triangle(a, d, c));

// constructs AABB tree
Tree tree(triangles.begin(), triangles.end());

// counts #intersections
Ray ray_query(a, b);
assert(tree.number_of_intersected_primitives(ray_query) == 3);

// compute closest point and squared distance
Point point_query(2.0, 2.0);
Point closest_point = tree.closest_point(point_query);
assert(closest_point == c);

assert(tree.squared_distance(point_query) == 2);

return EXIT_SUCCESS;
}
49 changes: 49 additions & 0 deletions AABB_tree/test/AABB_tree/aabb_test_triangle_3.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
// Author(s) : Camille Wormser, Pierre Alliez

#include <iostream>
#include <list>

#include <CGAL/Simple_cartesian.h>
#include <CGAL/AABB_tree.h>
#include <CGAL/AABB_traits_3.h>
#include <CGAL/AABB_triangle_primitive_3.h>

typedef CGAL::Simple_cartesian<double> K;

typedef K::FT FT;
typedef K::Ray_3 Ray;
typedef K::Point_3 Point;
typedef K::Triangle_3 Triangle;

typedef std::list<Triangle>::const_iterator Iterator;
typedef CGAL::AABB_triangle_primitive_3<K, Iterator> Primitive;
typedef CGAL::AABB_traits_3<K, Primitive> AABB_triangle_traits;
typedef CGAL::AABB_tree<AABB_triangle_traits> Tree;

int main()
{
Point a(1.0, 0.0, 0.0);
Point b(0.0, 1.0, 0.0);
Point c(0.0, 0.0, 1.0);
Point d(0.0, 0.0, 0.0);

std::list<Triangle> triangles;
triangles.push_back(Triangle(a, b, c));
triangles.push_back(Triangle(a, b, d));
triangles.push_back(Triangle(a, d, c));

// constructs AABB tree
Tree tree(triangles.begin(), triangles.end());

// counts #intersections
Ray ray_query(a, b);
assert(tree.number_of_intersected_primitives(ray_query) == 3);

// compute closest point and squared distance
Point point_query(3.0, 2.0, 2.0);
Point closest_point = tree.closest_point(point_query);
assert(closest_point == a);
assert(tree.squared_distance(point_query) == 12);

return EXIT_SUCCESS;
}

0 comments on commit 2c41686

Please sign in to comment.