📄 intersection_3_1_impl.h
字号:
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 + -