-
Notifications
You must be signed in to change notification settings - Fork 3
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
added tests for untested aabb primitives
- Loading branch information
Showing
9 changed files
with
323 additions
and
12 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | ||
} |