⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 intersection_3_1_impl.h

📁 很多二维 三维几何计算算法 C++ 类库
💻 H
📖 第 1 页 / 共 2 页
字号:
	     const K& k){  return intersection(seg, box, k);}template <class K>Objectintersection(const typename CGAL_WRAP(K)::Line_3 &line,	     const typename CGAL_WRAP(K)::Iso_cuboid_3 &box, 	     const K&){    typedef typename K::Point_3 Point_3;    typedef typename K::Vector_3 Vector_3;    typedef typename K::Segment_3 Segment_3;    typedef typename K::RT RT;    typedef typename K::FT FT;    bool all_values = true;    FT _min = 0, _max = 0; // initialization to stop compiler warning    Point_3 const & _ref_point=line.point();    Vector_3 const & _dir=line.direction().vector();    Point_3 const & _iso_min=(box.min)();    Point_3 const & _iso_max=(box.max)();    for (int i=0; i< _ref_point.dimension(); i++) {        if (_dir.homogeneous(i) == 0) {            if (_ref_point.cartesian(i) < _iso_min.cartesian(i)) {                return Object();            }            if (_ref_point.cartesian(i) > _iso_max.cartesian(i)) {                return Object();            }        } else {            FT newmin, newmax;            if (_dir.homogeneous(i) > 0) {                newmin = (_iso_min.cartesian(i) - _ref_point.cartesian(i)) /                    _dir.cartesian(i);                newmax = (_iso_max.cartesian(i) - _ref_point.cartesian(i)) /                    _dir.cartesian(i);            } else {                newmin = (_iso_max.cartesian(i) - _ref_point.cartesian(i)) /                    _dir.cartesian(i);                newmax = (_iso_min.cartesian(i) - _ref_point.cartesian(i)) /                    _dir.cartesian(i);            }            if (all_values) {                _min = newmin;                _max = newmax;            } else {                if (newmin > _min)                    _min = newmin;                if (newmax < _max)                    _max = newmax;                if (_max < _min) {                    return Object();                }            }            all_values = false;        }    }    CGAL_kernel_assertion(!all_values);    if (_max == _min) {        return make_object(Point_3(_ref_point + _dir * _min ));    }    return make_object(        Segment_3(_ref_point + _dir*_min, _ref_point + _dir*_max));}template <class K>inlineObjectintersection(const typename CGAL_WRAP(K)::Iso_cuboid_3 &box, 	     const typename CGAL_WRAP(K)::Line_3 &line, 	     const K& k){  return intersection(line, box, k);}template <class K>Objectintersection(const typename CGAL_WRAP(K)::Ray_3 &ray,	     const typename CGAL_WRAP(K)::Iso_cuboid_3 &box, 	     const K&){    typedef typename K::Point_3 Point_3;    typedef typename K::Vector_3 Vector_3;    typedef typename K::Segment_3 Segment_3;    typedef typename K::RT RT;    typedef typename K::FT FT;    bool all_values = true;    FT _min = 0, _max = 0; // initialization to prevent compiler warning    Point_3 const & _ref_point=ray.source();    Vector_3 const & _dir=ray.direction().vector();    Point_3 const & _iso_min=(box.min)();    Point_3 const & _iso_max=(box.max)();    for (int i=0; i< _ref_point.dimension(); i++) {        if (_dir.homogeneous(i) == 0) {            if (_ref_point.cartesian(i) < _iso_min.cartesian(i)) {                return Object();            }            if (_ref_point.cartesian(i) > _iso_max.cartesian(i)) {                return Object();            }        } else {            FT newmin, newmax;            if (_dir.homogeneous(i) > 0) {                newmin = (_iso_min.cartesian(i) - _ref_point.cartesian(i)) /                    _dir.cartesian(i);                newmax = (_iso_max.cartesian(i) - _ref_point.cartesian(i)) /                    _dir.cartesian(i);            } else {                newmin = (_iso_max.cartesian(i) - _ref_point.cartesian(i)) /                    _dir.cartesian(i);                newmax = (_iso_min.cartesian(i) - _ref_point.cartesian(i)) /                    _dir.cartesian(i);            }            if (all_values) {                _max = newmax;            } else {                if (newmax < _max)                    _max = newmax;            }            if (newmin > _min)                 _min = newmin;            if (_max < _min)                return Object();            all_values = false;        }    }    CGAL_kernel_assertion(!all_values);    if (_max == _min) {        return make_object(Point_3(_ref_point + _dir * _min ));    }    return make_object(        Segment_3(_ref_point + _dir*_min, _ref_point + _dir*_max));}template <class K>inlineObjectintersection(const typename CGAL_WRAP(K)::Iso_cuboid_3 &box, 	     const typename CGAL_WRAP(K)::Ray_3 &ray,	     const K& k){  return intersection(ray, box, k);}template <class K>Objectintersection(const typename CGAL_WRAP(K)::Segment_3 &seg,	     const typename CGAL_WRAP(K)::Iso_cuboid_3 &box, 	     const K&){    typedef typename K::Point_3 Point_3;    typedef typename K::Vector_3 Vector_3;    typedef typename K::Segment_3 Segment_3;    typedef typename K::RT RT;    typedef typename K::FT FT;    FT _min = 0, _max;    Point_3 const & _ref_point=seg.source();    Vector_3 const & _dir=seg.direction().vector();    Point_3 const & _iso_min=(box.min)();    Point_3 const & _iso_max=(box.max)();    int main_dir =        (CGAL_NTS abs(_dir.x()) > CGAL_NTS abs(_dir.y()) )            ? (CGAL_NTS abs(_dir.x()) > CGAL_NTS abs(_dir.z()) ? 0 : 2)            : (CGAL_NTS abs(_dir.y()) > CGAL_NTS abs(_dir.z()) ? 1 : 2);    _max = (seg.target().cartesian(main_dir)-_ref_point.cartesian(main_dir)) /            _dir.cartesian(main_dir);    for (int i=0; i< _ref_point.dimension(); i++) {        if (_dir.homogeneous(i) == 0) {            if (_ref_point.cartesian(i) < _iso_min.cartesian(i)) {                return Object();            }            if (_ref_point.cartesian(i) > _iso_max.cartesian(i)) {                return Object();            }        } else {            FT newmin, newmax;            if (_dir.homogeneous(i) > 0) {                newmin = (_iso_min.cartesian(i) - _ref_point.cartesian(i)) /                    _dir.cartesian(i);                newmax = (_iso_max.cartesian(i) - _ref_point.cartesian(i)) /                    _dir.cartesian(i);            } else {                newmin = (_iso_max.cartesian(i) - _ref_point.cartesian(i)) /                    _dir.cartesian(i);                newmax = (_iso_min.cartesian(i) - _ref_point.cartesian(i)) /                    _dir.cartesian(i);            }            if (newmax < _max)                _max = newmax;            if (newmin > _min)                 _min = newmin;            if (_max < _min)                return Object();        }    }    if (_max == _min) {        return make_object(Point_3(_ref_point + _dir * _min ));    }    return make_object(        Segment_3(_ref_point + _dir*_min, _ref_point + _dir*_max));}template <class K>inlineObjectintersection(const typename CGAL_WRAP(K)::Iso_cuboid_3 &box, 	     const typename CGAL_WRAP(K)::Segment_3 &seg,	     const K& k){  return intersection(seg, box, k);}template <class K>Objectintersection(    const typename CGAL_WRAP(K)::Iso_cuboid_3 &icub1,    const typename CGAL_WRAP(K)::Iso_cuboid_3 &icub2,     const K&){    typedef typename K::Point_3 Point_3;    typedef typename K::Iso_cuboid_3 Iso_cuboid_3;    Point_3 min_points[2];    Point_3 max_points[2];    min_points[0] = (icub1.min)();    min_points[1] = (icub2.min)();    max_points[0] = (icub1.max)();    max_points[1] = (icub2.max)();    typedef typename K::FT FT;    const int DIM = 3;    int min_idx[DIM];    int max_idx[DIM];    Point_3 newmin;    Point_3 newmax;    for (int dim = 0; dim < DIM; ++dim) {        min_idx[dim] =          min_points[0].cartesian(dim) >= min_points[1].cartesian(dim) ? 0 : 1;        max_idx[dim] =          max_points[0].cartesian(dim) <= max_points[1].cartesian(dim) ? 0 : 1;        if (min_idx[dim] != max_idx[dim]                && max_points[max_idx[dim]].cartesian(dim)                   < min_points[min_idx[dim]].cartesian(dim))            return Object();    }    if (min_idx[0] == min_idx[1] && min_idx[0] == min_idx[2]) {        newmin = min_points[min_idx[0]];    } else {        newmin = Point_3(            min_idx[0] == 0                ? wmult_hw((K*)0, min_points[0].hx(), min_points[1])                : wmult_hw((K*)0, min_points[1].hx(), min_points[0])            ,            min_idx[1] == 0                ? wmult_hw((K*)0, min_points[0].hy(), min_points[1])                : wmult_hw((K*)0, min_points[1].hy(), min_points[0])            ,            min_idx[2] == 0                ? wmult_hw((K*)0, min_points[0].hz(), min_points[1])                : wmult_hw((K*)0, min_points[1].hz(), min_points[0])            ,            wmult_hw((K*)0, min_points[0].hw(), min_points[1]) );    }    if (max_idx[0] == max_idx[1] && max_idx[0] == max_idx[2]) {        newmax = max_points[max_idx[0]];    } else {        newmax = Point_3(            max_idx[0] == 0                ? wmult_hw((K*)0, max_points[0].hx(), max_points[1])                : wmult_hw((K*)0, max_points[1].hx(), max_points[0])            ,            max_idx[1] == 0                ? wmult_hw((K*)0, max_points[0].hy(), max_points[1])                : wmult_hw((K*)0, max_points[1].hy(), max_points[0])            ,            max_idx[2] == 0                ? wmult_hw((K*)0, max_points[0].hz(), max_points[1])                : wmult_hw((K*)0, max_points[1].hz(), max_points[0])            ,            wmult_hw((K*)0, max_points[0].hw(), max_points[1]) );    }    Object result = make_object(Iso_cuboid_3(newmin, newmax));    return result;}} // namespace CGALitemplate <class K>inlineObject intersection(const Plane_3<K> &plane1, const Plane_3<K> &plane2){  return typename K::Intersect_3()(plane1, plane2);}template <class K>inlineObject intersection(const Plane_3<K> &plane1, const Plane_3<K> &plane2,             const Plane_3<K> &plane3){  return typename K::Intersect_3()(plane1, plane2, plane3);}template <class K>inlineObjectintersection(const Plane_3<K>  &plane, const Line_3<K> &line){  return typename K::Intersect_3()(plane, line);}template <class K>inlinebooldo_intersect(const Plane_3<K> &plane, const Line_3<K> &line){  return typename K::Do_intersect_3()(plane, line);}template <class K>inlineObjectintersection(const Plane_3<K> &plane, const Ray_3<K> &ray){  return typename K::Intersect_3()(plane, ray);}template <class K>inlinebooldo_intersect(const Plane_3<K> &plane, const Ray_3<K> &ray){  return typename K::Do_intersect_3()(plane, ray);}template <class K>inlineObjectintersection(const Plane_3<K> &plane, const Segment_3<K> &seg){  return typename K::Intersect_3()(plane, seg);}template <class K>inlinebooldo_intersect(const Plane_3<K>  &plane, const Segment_3<K> &seg){  return typename K::Do_intersect_3()(plane, seg);}template <class K>inlineObjectintersection(const Line_3<K> &line,	     const Bbox_3 &box){  return typename K::Intersect_3()(line, box);}template <class K>inlineObjectintersection(const Ray_3<K> &ray,	     const Bbox_3 &box){  return typename K::Intersect_3()(ray, box);}template <class K>inlineObjectintersection(const Segment_3<K> &seg,	     const Bbox_3 &box){  return typename K::Intersect_3()(seg, box);}template <class K>inlineObjectintersection(const Line_3<K> &line,	     const Iso_cuboid_3<K> &box){  return typename K::Intersect_3()(line, box);}template <class K>inlineObjectintersection(const Ray_3<K> &ray,	     const Iso_cuboid_3<K> &box){  return typename K::Intersect_3()(ray, box);}template <class K>inlineObjectintersection(const Segment_3<K> &seg,	     const Iso_cuboid_3<K> &box){  return typename K::Intersect_3()(seg, box);}template <class K>inlineObjectintersection(const Iso_cuboid_3<K> &icub1,	     const Iso_cuboid_3<K> &icub2){  return typename K::Intersect_3()(icub1, icub2);}CGAL_END_NAMESPACE

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -