mirror of https://github.com/CGAL/cgal
add Cub_tr as a Lazy implementation. Remains only Bbo intersections for the 3D
This commit is contained in:
parent
5e9891ea75
commit
c391e0e876
|
|
@ -207,6 +207,24 @@ struct Intersection_traits<K, typename K::Plane_3, typename K::Iso_cuboid_3> {
|
|||
typedef typename boost::optional< variant_type > result_type;
|
||||
};
|
||||
|
||||
// Iso_cuboid_3 Triangle_3, variant of 4
|
||||
template<typename K>
|
||||
struct Intersection_traits<K, typename K::Iso_cuboid_3, typename K::Triangle_3> {
|
||||
typedef typename
|
||||
boost::variant< typename K::Point_3, typename K::Segment_3,
|
||||
typename K::Triangle_3, std::vector<typename K::Point_3> > variant_type;
|
||||
|
||||
typedef typename boost::optional< variant_type > result_type;
|
||||
};
|
||||
|
||||
template<typename K>
|
||||
struct Intersection_traits<K, typename K::Triangle_3, typename K::Iso_cuboid_3> {
|
||||
typedef typename
|
||||
boost::variant< typename K::Point_3, typename K::Segment_3,
|
||||
typename K::Triangle_3, std::vector<typename K::Point_3> > variant_type;
|
||||
|
||||
typedef typename boost::optional< variant_type > result_type;
|
||||
};
|
||||
|
||||
|
||||
// Point_3 Line_3, variant of one
|
||||
|
|
|
|||
|
|
@ -27,9 +27,11 @@
|
|||
#include <CGAL/Triangle_3.h>
|
||||
|
||||
#include <CGAL/Intersections_3/internal/Iso_cuboid_3_Triangle_3_do_intersect.h>
|
||||
#include <CGAL/Intersections_3/internal/Iso_cuboid_3_Triangle_3_intersection.h>
|
||||
|
||||
namespace CGAL {
|
||||
CGAL_DO_INTERSECT_FUNCTION(Iso_cuboid_3,Triangle_3, 3)
|
||||
CGAL_DO_INTERSECT_FUNCTION(Iso_cuboid_3, Triangle_3, 3)
|
||||
CGAL_INTERSECTION_FUNCTION(Iso_cuboid_3, Triangle_3, 3)
|
||||
}
|
||||
|
||||
#endif // CGAL_INTERSECTIONS_3_BBOX_3_TRIANGLE_3_H
|
||||
|
|
|
|||
|
|
@ -0,0 +1,212 @@
|
|||
// Copyright (c) 2019 GeometryFactory(France).
|
||||
// All rights reserved.
|
||||
//
|
||||
// This file is part of CGAL (www.cgal.org); you can redistribute it and/or
|
||||
// modify it under the terms of the GNU Lesser General Public License as
|
||||
// published by the Free Software Foundation; either version 3 of the License,
|
||||
// or (at your option) any later version.
|
||||
//
|
||||
// Licensees holding a valid commercial license may use this file in
|
||||
// accordance with the commercial license agreement provided with the software.
|
||||
//
|
||||
// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
|
||||
// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||
//
|
||||
// $URL$
|
||||
// $Id$
|
||||
// SPDX-License-Identifier: LGPL-3.0+
|
||||
//
|
||||
//
|
||||
// Author(s) : Maxime Gimeno
|
||||
//
|
||||
|
||||
#ifndef CGAL_INTERSECTIONS_3_INTERNAL_ISO_CUBOID_3_TRIANGLE_3_INTERSECTION_H
|
||||
#define CGAL_INTERSECTIONS_3_INTERNAL_ISO_CUBOID_3_TRIANGLE_3_INTERSECTION_H
|
||||
|
||||
#include <CGAL/kernel_basic.h>
|
||||
#include <CGAL/intersections.h>
|
||||
|
||||
#include <vector>
|
||||
#include <list>
|
||||
|
||||
namespace CGAL {
|
||||
|
||||
namespace Intersections {
|
||||
|
||||
namespace internal {
|
||||
|
||||
//only work for convex polygons, but in here that's always the case
|
||||
template<class K>
|
||||
void clip_poly_halfspace(
|
||||
const std::vector<typename K::Point_3>& input,
|
||||
const typename K::Plane_3& pl,
|
||||
std::vector<typename K::Point_3>& output)
|
||||
{
|
||||
if(input.empty())
|
||||
return;
|
||||
|
||||
typedef typename K::Point_3 Point;
|
||||
typedef typename K::Plane_3 Plane;
|
||||
typedef typename K::Segment_3 S;
|
||||
|
||||
typedef typename Intersection_traits<K,
|
||||
CGAL::Plane_3<K>,
|
||||
CGAL::Segment_3<K> >::result_type SP_type;
|
||||
|
||||
std::list<Point> p_list(input.begin(), input.end());
|
||||
auto it = p_list.begin();
|
||||
//corefine with plane.
|
||||
while(it != p_list.end())
|
||||
{
|
||||
Point p = *it;
|
||||
++it;
|
||||
if(it == p_list.end())
|
||||
break;
|
||||
if(do_intersect(S(p, *it), pl))
|
||||
{
|
||||
SP_type inter = typename K::Intersect_3()(S(p, *it), pl);
|
||||
if(inter)
|
||||
{
|
||||
Point* p_inter = boost::get<Point>(&*inter);
|
||||
if(p_inter
|
||||
&& *p_inter != p
|
||||
&& *p_inter != *it)
|
||||
p_list.insert(it, *p_inter);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(input.size() >2)
|
||||
{
|
||||
Point p2(p_list.front()),
|
||||
p1(p_list.back());
|
||||
S seg(p1, p2);
|
||||
if(do_intersect(seg, pl))
|
||||
{
|
||||
SP_type inter = typename K::Intersect_3()(seg, pl);
|
||||
if(inter)
|
||||
{
|
||||
Point* p_inter = boost::get<Point>(&*inter);
|
||||
if(p_inter
|
||||
&& *p_inter != p1
|
||||
&& *p_inter != p2)
|
||||
p_list.push_back(*p_inter);
|
||||
}
|
||||
}
|
||||
}
|
||||
//remove all points on positive side
|
||||
|
||||
for(auto p_it = p_list.begin();
|
||||
p_it != p_list.end();)
|
||||
{
|
||||
if(pl.has_on_positive_side(*p_it))
|
||||
p_it = p_list.erase(p_it);
|
||||
else
|
||||
++p_it;
|
||||
}
|
||||
for(auto p : p_list)
|
||||
output.push_back(p);
|
||||
|
||||
}
|
||||
|
||||
template <class K>
|
||||
typename Intersection_traits<K, typename K::Iso_cuboid_3, typename K::Triangle_3>::result_type
|
||||
intersection(
|
||||
const typename K::Iso_cuboid_3 &cub,
|
||||
const typename K::Triangle_3 &tr,
|
||||
const K&)
|
||||
{
|
||||
typedef typename K::Point_3 Point;
|
||||
typedef typename K::Segment_3 Segment;
|
||||
typedef typename K::Triangle_3 Triangle;
|
||||
typedef typename K::Plane_3 Plane_3;
|
||||
typedef std::vector<Point> Poly;
|
||||
|
||||
typedef typename Intersection_traits<K,
|
||||
CGAL::Iso_cuboid_3<K>,
|
||||
CGAL::Triangle_3<K> >::result_type Res_type;
|
||||
|
||||
//Lazy implem: clip 6 times the input triangle.
|
||||
Plane_3 planes[6];
|
||||
planes[0] = Plane_3(cub.vertex(0),
|
||||
cub.vertex(1),
|
||||
cub.vertex(5));
|
||||
|
||||
planes[1] = Plane_3(cub.vertex(0),
|
||||
cub.vertex(4),
|
||||
cub.vertex(3));
|
||||
|
||||
planes[2]=Plane_3(cub.vertex(0),
|
||||
cub.vertex(3),
|
||||
cub.vertex(1));
|
||||
|
||||
planes[3] = Plane_3(cub.vertex(7),
|
||||
cub.vertex(6),
|
||||
cub.vertex(1));
|
||||
|
||||
planes[4] = Plane_3(cub.vertex(7),
|
||||
cub.vertex(3),
|
||||
cub.vertex(4));
|
||||
|
||||
planes[5] = Plane_3(cub.vertex(7),
|
||||
cub.vertex(4),
|
||||
cub.vertex(6));
|
||||
|
||||
std::vector<Point> poly;
|
||||
poly.push_back(tr.vertex(0));
|
||||
poly.push_back(tr.vertex(1));
|
||||
poly.push_back(tr.vertex(2));
|
||||
|
||||
for (int i = 0; i < 6; ++i)
|
||||
{
|
||||
Poly clipped;
|
||||
clip_poly_halfspace<K>(poly, planes[i], clipped);
|
||||
poly = clipped;
|
||||
for(auto p : poly)
|
||||
std::cout<<p<<std::endl;
|
||||
}
|
||||
|
||||
switch(poly.size())
|
||||
{
|
||||
case 0:
|
||||
return Res_type();
|
||||
break;
|
||||
case 1:
|
||||
{
|
||||
Point res = poly.front();
|
||||
return Res_type(std::forward<Point>(res));
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
{
|
||||
Segment res = Segment(poly.front(), poly.back());
|
||||
return Res_type(std::forward<Segment>(res));
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
{
|
||||
|
||||
Triangle res = Triangle (poly[0], poly[1], poly[2]);
|
||||
return Res_type(std::forward<Triangle>(res));
|
||||
}
|
||||
break;
|
||||
default:
|
||||
{
|
||||
return Res_type(std::forward<Poly>(poly));
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
template <class K>
|
||||
typename Intersection_traits<K, typename K::Iso_cuboid_3, typename K::Triangle_3>::result_type
|
||||
intersection(
|
||||
const typename K::Triangle_3 &tr,
|
||||
const typename K::Iso_cuboid_3 &cub,
|
||||
const K& k)
|
||||
{
|
||||
return intersection(cub, tr, k);
|
||||
}
|
||||
}}}
|
||||
|
||||
#endif // CGAL_INTERSECTIONS_3_INTERNAL_ISO_CUBOID_3_TRIANGLE_3_INTERSECTION_H
|
||||
|
|
@ -920,9 +920,10 @@ struct Test {
|
|||
check_intersection (cub, Pl(P(2, 1.66, 2),
|
||||
P(1.66,2,2),
|
||||
P(2,2,1.66)),
|
||||
Tr(P(2, 1.66, 2),
|
||||
Tr(P(2, 2, 1.66),
|
||||
P(1.66,2,2),
|
||||
P(2,2,1.66)));
|
||||
P(2,1.66,2)));
|
||||
|
||||
//random
|
||||
Pl pl(0.265189, 0.902464, 0.33946, -2.47551);
|
||||
res = CGAL::intersection(cub, pl);
|
||||
|
|
@ -952,11 +953,77 @@ struct Test {
|
|||
}
|
||||
}
|
||||
|
||||
void Cub_Tr(bool is_exact)
|
||||
{
|
||||
std::cout << "Triangle_3 - Cuboid_3\n";
|
||||
|
||||
Cub cub(P(1,1,1), P(2,2,2));
|
||||
|
||||
check_no_intersection(cub, Tr(P(1.1, 2,0),
|
||||
P(2, 3, 1),
|
||||
P(4, 5, 6)));
|
||||
|
||||
//tr in a face
|
||||
check_intersection(cub, Tr(P(1,1.1,1),
|
||||
P(1,1.5,1),
|
||||
P(1,1,1.1)),
|
||||
Tr(P(1,1.1,1),
|
||||
P(1,1.5,1),
|
||||
P(1,1,1.1))
|
||||
);
|
||||
//face in a tr
|
||||
|
||||
typedef typename CGAL::Intersection_traits<K,
|
||||
typename K::Triangle_3,
|
||||
typename K::Iso_cuboid_3>::result_type Res;
|
||||
Tr tr(P(-3, -3, 1), P(3,-3,1), P(1.5,6,1));
|
||||
Res res = CGAL::intersection(cub, tr);
|
||||
if(is_exact)
|
||||
{
|
||||
std::vector<P>* poly = boost::get<std::vector<P> >(&*res);
|
||||
CGAL_assertion(poly != nullptr);
|
||||
CGAL_assertion(poly->size() == 4);
|
||||
for(auto p : *poly)
|
||||
{
|
||||
CGAL_assertion(tr.has_on(p) && cub.has_on_boundary(p));
|
||||
}
|
||||
}
|
||||
|
||||
//tr adj to a point
|
||||
|
||||
check_intersection (cub, Tr(P(1, 0.5, 0.5),
|
||||
P(3, 2, 1),
|
||||
P(3, 1, 2)),
|
||||
P(2,1,1));
|
||||
//tr adj to an edge
|
||||
check_intersection (cub, Tr(P(1,0,4), P(2,1,0), P(4,3,0)),
|
||||
S(P(2,1,2), P(2,1,1)));
|
||||
//tr inside
|
||||
check_intersection (cub, Tr(P(1.1,1.1,1.1), P(1.8,1.8,1.8), P(1.5,1.8,1.1)),
|
||||
Tr(P(1.1,1.1,1.1), P(1.8,1.8,1.8), P(1.5,1.8,1.1)));
|
||||
//tr through
|
||||
tr = Tr(P(2, 4, 2),
|
||||
P(1, 3.5, -0.5),
|
||||
P(1, -1, 1));
|
||||
res = CGAL::intersection(cub, tr);
|
||||
if(is_exact)
|
||||
{
|
||||
std::vector<P>* poly = boost::get<std::vector<P> >(&*res);
|
||||
CGAL_assertion(poly != nullptr);
|
||||
CGAL_assertion(poly->size() == 4);
|
||||
for(auto p : *poly)
|
||||
{
|
||||
std::cout<<p<<std::endl;
|
||||
CGAL_assertion(tr.has_on(p) && cub.has_on_boundary(p));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
void run(bool is_exact = false)
|
||||
{
|
||||
std::cout << "3D Intersection tests\n";
|
||||
/*
|
||||
P_do_intersect();
|
||||
Cub_Cub();
|
||||
L_Cub();
|
||||
|
|
@ -971,23 +1038,23 @@ struct Test {
|
|||
S_L();
|
||||
R_L();
|
||||
R_S();
|
||||
R_R();*/
|
||||
R_R();
|
||||
|
||||
//If not exact, only check that it doesn't crash{
|
||||
//Tet_L(is_exact);
|
||||
//Tet_S(is_exact);
|
||||
//Tet_R(is_exact);
|
||||
//Tet_Pl(is_exact);
|
||||
//If not exact, only check that it doesn't crash
|
||||
//@{
|
||||
Tet_L(is_exact);
|
||||
Tet_S(is_exact);
|
||||
Tet_R(is_exact);
|
||||
Tet_Pl(is_exact);
|
||||
Tet_Tr(is_exact);
|
||||
// Pl_Cub(is_exact);
|
||||
//}
|
||||
/*
|
||||
Bbox_L();
|
||||
Bbox_R();
|
||||
Bbox_Tr();
|
||||
*/
|
||||
}
|
||||
Pl_Cub(is_exact);
|
||||
Cub_Tr(is_exact);
|
||||
//@}
|
||||
|
||||
Bbox_L();
|
||||
Bbox_R();
|
||||
Bbox_Tr();
|
||||
}
|
||||
};
|
||||
|
||||
int main()
|
||||
|
|
|
|||
Loading…
Reference in New Issue