inline typename Cylinder<T>::position_type random_position(Cylinder<T> const& shape, Trng& rng) { // -1 < rng() < 1. See for example CylindricalSurface.hpp. return add(shape.position(), multiply(shape.unit_z(), rng() * shape.half_length())); }
inline std::pair<typename Cylinder<T_>::length_type, typename Cylinder<T_>::length_type> to_internal(Cylinder<T_> const& obj, typename Cylinder<T_>::position_type const& pos) { // Return pos relative to position of cylinder. typedef typename Cylinder<T_>::position_type position_type; typedef typename Cylinder<T_>::length_type length_type; const position_type pos_vector(subtract(pos, obj.position())); // z can be < 0 const length_type z(dot_product(pos_vector, obj.unit_z())); // r is always >= 0 const length_type r(length(pos_vector - multiply(obj.unit_z(), z))); return std::make_pair(r, z); }
inline std::pair<typename Cylinder<T_>::position_type, typename Cylinder<T_>::length_type> projected_point(Cylinder<T_> const& obj, typename Cylinder<T_>::position_type const& pos) { typedef typename Cylinder<T_>::length_type length_type; // The projection lies on the z-axis. std::pair<length_type, length_type> r_z(to_internal(obj, pos)); return std::make_pair( add(obj.position(), multiply(obj.unit_z(), r_z.second)), r_z.first); }
bool operator==(const Cylinder& rhs) const { return position_ == rhs.position() && radius_ == rhs.radius() && unit_z_ == rhs.unit_z() && half_length_ == rhs.half_length(); }