Boost logo

Boost Users :

Subject: Re: [Boost-users] [Units] Converting from angular_velocity to degrees_per_second
From: Andrew Hundt (athundt_at_[hidden])
Date: 2010-12-01 16:20:38


Steven,

Thanks! That worked perfectly. I spent quite a bit of time trying to solve
this problem and others similar to it, and could not find anything in the
examples. Would it be reasonable if I were to take a bit of time to add this
example to conversion.cpp (or whatever example you feel is appropriate) and
add it to the documentation?

Cheers!
Andrew Hundt

-------------------------------------------------------------------------
For those who search for boost.units conversion examples, here is a working
solution 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>

      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);
    }

-------------------------------------------------------------------------
Output:
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

-------------------------------------------------------------------------

Steven Watanabe <watanabesj <at> gmail.com> writes:

>
> AMDG
>
> On 12/1/2010 11:10 AM, Andrew Hundt wrote:
> > I have made my question more specific so it will be easier to answer.
> > I need to make a conversion from a general angular_velocity to
> > degrees/second.
>
> There's no such thing as a general angular_velocity.
> I assume that you mean that you want to convert
> from radians/second to degrees/second.
>
> > To illustrate this problem the example 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);
> > }
>
> Try
>
> typedef boost::units::divide_typeof_helper<
> boost::units::degree::plane_angle,
> boost::units::si::time
> >::type degrees_per_second;
>
> static_cast<boost::units::quantity<degrees_per_second> >(m_speed);
>
> In Christ,
> Steven Watanabe
>

Cheers!
Andrew Hundt

On Wed, Dec 1, 2010 at 2:10 PM, Andrew Hundt <athundt_at_[hidden]> wrote:

> I have made my question more specific so it will be easier to answer.
> I need to make a conversion from a general angular_velocity to
> degrees/second.
>
> To illustrate this problem the example 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);
> }
>
> Produces this compiler output:
>
> 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>&)’
>
> What is the syntax to achieve the desired type specification and subsequent
> conversion?
> Do I need to specify a degrees_per_second unit, and if so, how?
>
> Thank you in advance for your help.
>
> Cheers!
> Andrew Hundt
>
>
>
> On Tue, Nov 30, 2010 at 7:29 PM, Andrew Hundt <athundt_at_[hidden]> wrote:
>
>> I need to make a conversion from a general angular_velocity to
>> degrees/second. For example:
>>
>> boost::units::quantity< boost::units::si::angular_velocity>
>> m_speed((30.0*boost::units::si::radians_per_second));
>> 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());
>>
>> However it fails to compile in gcc 4.4, reporting:
>> error:incomplete type '[type removed]' used in nested name specifier
>>
>> Could someone explain the proper syntax to achieve the desired type
>> specification and subsequent conversion? Do I need to specify a
>> degrees_per_second unit, and if so, how? Thank you in advance for your help.
>>
>> Cheers!
>> Andrew Hundt
>>
>>
>



Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net