unidades resueltos problemas metricas longitud fisica ejercicios conversiones conversion c++ gcc boost boost-units

c++ - resueltos - Conversión de unidades en boost.units de angular_velocity a degrees_per_second



unidades de longitud (2)

Necesito hacer una conversión de angular_velocity general a grados / segundo.

Para ilustrar este problema, el ejemplo boostUnits.cpp:

#include <boost/units/systems/si.hpp> #include <boost/units/systems/angle/revolutions.hpp> #include <boost/units/systems/angle/degrees.hpp> #include <boost/units/conversion.hpp> #include <boost/units/pow.hpp> #include <iostream> #include <iterator> #include <algorithm> int main() { boost::units::quantity< boost::units::si::angular_velocity> m_speed( (30.0*boost::units::si::radians_per_second) ); std::cout << "m_speed: " << m_speed << std::endl; uint32_t result = static_cast<uint32_t>( boost::units::quantity<boost::units::si::angular_velocity,uint32_t>( m_speed*boost::units::degree::degrees/boost::units::si::seconds ).value() ); std::cout << " result: "<< result << std::endl; return(0); }

Produce este resultado del compilador:

g++ boostUnits.cpp /usr/local/include/boost/units/detail/conversion_impl.hpp: In static member function ‘static boost::units::quantity<Unit2, T2> boost::units::conversion_helper<boost::units::quantity<Unit1, T1>, boost::units::quantity<Unit2, T2> >::convert(const boost::units::quantity<Unit1, T1>&) [with Unit1 = boost::units::unit<boost::units::list<boost::units::dim<boost::units::time_base_dimension, boost::units::static_rational<-0x000000002l, 1l> >, boost::units::list<boost::units::dim<boost::units::plane_angle_base_dimension, boost::units::static_rational<2l, 1l> >, boost::units::dimensionless_type> >, boost::units::heterogeneous_system<boost::units::heterogeneous_system_impl<boost::units::list<boost::units::heterogeneous_system_dim<boost::units::angle::degree_base_unit, boost::units::static_rational<1l, 1l> >, boost::units::list<boost::units::heterogeneous_system_dim<boost::units::si::second_base_unit, boost::units::static_rational<-0x000000002l, 1l> >, boost::units::list<boost::units::heterogeneous_system_dim<boost::units::angle::radian_base_unit, boost::units::static_rational<1l, 1l> >, boost::units::dimensionless_type> > >, boost::units::list<boost::units::dim<boost::units::time_base_dimension, boost::units::static_rational<-0x000000002l, 1l> >, boost::units::list<boost::units::dim<boost::units::plane_angle_base_dimension, boost::units::static_rational<2l, 1l> >, boost::units::dimensionless_type> >, boost::units::dimensionless_type> >, void>, T1 = double, Unit2 = boost::units::unit<boost::units::list<boost::units::dim<boost::units::time_base_dimension, boost::units::static_rational<-0x000000001l, 1l> >, boost::units::list<boost::units::dim<boost::units::plane_angle_base_dimension, boost::units::static_rational<1l, 1l> >, boost::units::dimensionless_type> >, boost::units::homogeneous_system<boost::units::list<boost::units::si::meter_base_unit, boost::units::list<boost::units::scaled_base_unit<boost::units::cgs::gram_base_unit, boost::units::scale<10l, boost::units::static_rational<3l, 1l> > >, boost::units::list<boost::units::si::second_base_unit, boost::units::list<boost::units::si::ampere_base_unit, boost::units::list<boost::units::si::kelvin_base_unit, boost::units::list<boost::units::si::mole_base_unit, boost::units::list<boost::units::si::candela_base_unit, boost::units::list<boost::units::angle::radian_base_unit, boost::units::list<boost::units::angle::steradian_base_unit, boost::units::dimensionless_type> > > > > > > > > >, void>, T2 = unsigned int]’: /usr/local/include/boost/units/quantity.hpp:193: instantiated from ‘boost::units::quantity<Unit, Y>::quantity(const boost::units::quantity<Unit2, YY>&, typename boost::disable_if<boost::mpl::and_<typename boost::units::is_implicitly_convertible<Unit2, Unit>::type, boost::units::detail::is_non_narrowing_conversion<YY, Y>, mpl_::bool_<true>, mpl_::bool_<true>, mpl_::bool_<true> >, typename boost::units::detail::disable_if_is_same<Unit, Unit2>::type>::type*) [with Unit2 = boost::units::unit<boost::units::list<boost::units::dim<boost::units::time_base_dimension, boost::units::static_rational<-0x000000002l, 1l> >, boost::units::list<boost::units::dim<boost::units::plane_angle_base_dimension, boost::units::static_rational<2l, 1l> >, boost::units::dimensionless_type> >, boost::units::heterogeneous_system<boost::units::heterogeneous_system_impl<boost::units::list<boost::units::heterogeneous_system_dim<boost::units::angle::degree_base_unit, boost::units::static_rational<1l, 1l> >, boost::units::list<boost::units::heterogeneous_system_dim<boost::units::si::second_base_unit, boost::units::static_rational<-0x000000002l, 1l> >, boost::units::list<boost::units::heterogeneous_system_dim<boost::units::angle::radian_base_unit, boost::units::static_rational<1l, 1l> >, boost::units::dimensionless_type> > >, boost::units::list<boost::units::dim<boost::units::time_base_dimension, boost::units::static_rational<-0x000000002l, 1l> >, boost::units::list<boost::units::dim<boost::units::plane_angle_base_dimension, boost::units::static_rational<2l, 1l> >, boost::units::dimensionless_type> >, boost::units::dimensionless_type> >, void>, YY = double, Unit = boost::units::unit<boost::units::list<boost::units::dim<boost::units::time_base_dimension, boost::units::static_rational<-0x000000001l, 1l> >, boost::units::list<boost::units::dim<boost::units::plane_angle_base_dimension, boost::units::static_rational<1l, 1l> >, boost::units::dimensionless_type> >, boost::units::homogeneous_system<boost::units::list<boost::units::si::meter_base_unit, boost::units::list<boost::units::scaled_base_unit<boost::units::cgs::gram_base_unit, boost::units::scale<10l, boost::units::static_rational<3l, 1l> > >, boost::units::list<boost::units::si::second_base_unit, boost::units::list<boost::units::si::ampere_base_unit, boost::units::list<boost::units::si::kelvin_base_unit, boost::units::list<boost::units::si::mole_base_unit, boost::units::list<boost::units::si::candela_base_unit, boost::units::list<boost::units::angle::radian_base_unit, boost::units::list<boost::units::angle::steradian_base_unit, boost::units::dimensionless_type> > > > > > > > > >, void>, Y = unsigned int]’ boostUnits.cpp:16: instantiated from here /usr/local/include/boost/units/detail/conversion_impl.hpp:345: error: no matching function for call to ‘conversion_factor(boost::units::unit<boost::units::list<boost::units::dim<boost::units::time_base_dimension, boost::units::static_rational<-0x000000002l, 1l> >, boost::units::list<boost::units::dim<boost::units::plane_angle_base_dimension, boost::units::static_rational<2l, 1l> >, boost::units::dimensionless_type> >, boost::units::heterogeneous_system<boost::units::heterogeneous_system_impl<boost::units::list<boost::units::heterogeneous_system_dim<boost::units::angle::degree_base_unit, boost::units::static_rational<1l, 1l> >, boost::units::list<boost::units::heterogeneous_system_dim<boost::units::si::second_base_unit, boost::units::static_rational<-0x000000002l, 1l> >, boost::units::list<boost::units::heterogeneous_system_dim<boost::units::angle::radian_base_unit, boost::units::static_rational<1l, 1l> >, boost::units::dimensionless_type> > >, boost::units::list<boost::units::dim<boost::units::time_base_dimension, boost::units::static_rational<-0x000000002l, 1l> >, boost::units::list<boost::units::dim<boost::units::plane_angle_base_dimension, boost::units::static_rational<2l, 1l> >, boost::units::dimensionless_type> >, boost::units::dimensionless_type> >, void>&, boost::units::unit<boost::units::list<boost::units::dim<boost::units::time_base_dimension, boost::units::static_rational<-0x000000001l, 1l> >, boost::units::list<boost::units::dim<boost::units::plane_angle_base_dimension, boost::units::static_rational<1l, 1l> >, boost::units::dimensionless_type> >, boost::units::homogeneous_system<boost::units::list<boost::units::si::meter_base_unit, boost::units::list<boost::units::scaled_base_unit<boost::units::cgs::gram_base_unit, boost::units::scale<10l, boost::units::static_rational<3l, 1l> > >, boost::units::list<boost::units::si::second_base_unit, boost::units::list<boost::units::si::ampere_base_unit, boost::units::list<boost::units::si::kelvin_base_unit, boost::units::list<boost::units::si::mole_base_unit, boost::units::list<boost::units::si::candela_base_unit, boost::units::list<boost::units::angle::radian_base_unit, boost::units::list<boost::units::angle::steradian_base_unit, boost::units::dimensionless_type> > > > > > > > > >, void>&)’

¿Cuál es la sintaxis para lograr la especificación de tipo deseada y la conversión posterior? ¿Debo especificar una unidad degrees_per_second, y si es así, cómo?

Documentación: http://www.boost.org/doc/libs/1_37_0/doc/html/boost_units.html

Gracias de antemano por su ayuda.


Steven Wantabe proporcionó la solución en la lista de correo de boost-users.
Implementé un ejemplo de trabajo a continuación.

boostUnits.cpp:

#include <boost/units/systems/si.hpp> #include <boost/units/systems/angle/revolutions.hpp> #include <boost/units/systems/angle/degrees.hpp> #include <boost/units/conversion.hpp> #include <boost/units/pow.hpp> #include <boost/units/io.hpp> #include <iostream> #include <iterator> #include <algorithm> typedef boost::units::divide_typeof_helper< boost::units::degree::plane_angle, boost::units::si::time >::type degrees_per_second; int main() { boost::units::quantity< boost::units::si::angular_velocity> m_speed( (30.0*boost::units::si::radians_per_second) ); std::cout << "m_speed rad/sec: " << m_speed << std::endl; std::cout << "m_speed deg/sec: " << static_cast< boost::units::quantity<degrees_per_second> >(m_speed) << std::endl; uint32_t result = static_cast<uint32_t>( static_cast< boost::units::quantity<degrees_per_second> >(m_speed).value()); std::cout << "int result: "<< result << std::endl; return(0); }

Salida de terminal:

g++ boostUnits.cpp ./a.out m_speed rad/sec: 30 s^-1 rad m_speed deg/sec: 1718.87 deg s^-1 int result: 1718


No necesitas tanto código. El álgebra natural puede llevarte allí.

#include<boost/units/systems/si/io.hpp> #include<boost/units/systems/cgs/io.hpp> #include <boost/units/systems/angle/degrees.hpp> #include<boost/units/cmath.hpp> #include<iostream> using std::cout; using namespace boost::units; int main(){ quantity<si::angular_velocity> m_speed = 30.*si::radian/si::second ; cout << m_speed << ''/n'' << m_speed/(degree::degree/si::second) << ''/n'' << quantity<si::dimensionless>(m_speed/(degree::degree/si::second))*(degree::degree/si::second) << ''/n'' << (quantity<si::dimensionless>(m_speed/(degree::degree/si::second))*(degree::degree/si::second)).value() << ''/n'' << int((quantity<si::dimensionless>(m_speed/(degree::degree/si::second))*(degree::degree/si::second)).value()) ; }

Salida:

30 s^-1 rad 30 deg^-1 rad 1718.87 deg s^-1 1718.87 1718