1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 |
- #ifndef BOOST_COMPUTE_INTEROP_VTK_BOUNDS_HPP
- #define BOOST_COMPUTE_INTEROP_VTK_BOUNDS_HPP
- #include <vector>
- #include <iterator>
- #include <boost/compute/system.hpp>
- #include <boost/compute/command_queue.hpp>
- #include <boost/compute/algorithm/copy_n.hpp>
- #include <boost/compute/algorithm/reduce.hpp>
- #include <boost/compute/container/array.hpp>
- namespace boost {
- namespace compute {
- template<class PointIterator>
- inline void vtk_compute_bounds(PointIterator first,
- PointIterator last,
- double bounds[6],
- command_queue &queue = system::default_queue())
- {
- typedef typename std::iterator_traits<PointIterator>::value_type T;
- const context &context = queue.get_context();
-
- array<T, 2> extrema(context);
- reduce(first, last, extrema.begin() + 0, min<T>(), queue);
- reduce(first, last, extrema.begin() + 1, max<T>(), queue);
-
- std::vector<T> buffer(2);
- copy_n(extrema.begin(), 2, buffer.begin(), queue);
-
- bounds[0] = buffer[0][0]; bounds[1] = buffer[1][0];
- bounds[2] = buffer[0][1]; bounds[3] = buffer[1][1];
- bounds[4] = buffer[0][2]; bounds[5] = buffer[1][2];
- }
- }
- }
- #endif
|