使用boost转换度数分钟秒弧度boost_1_48_0

时间:2013-05-09 15:52:47

标签: c++ boost boost-geometry

我有这个代码可以工作:

typedef model::point<double, 2, cs::spherical_equatorial<degree> > degree_point;

degree_point FlindersSE(-37.0, 144.0);

和此:

quantity<plane_angle> Flinders = 0.375 * radians; //this works 0.375 radians

但我想做几分钟和几分钟&amp;转换为弧度然后再回来。

我花了一天的时间试图了解助推系统是如何工作的 - 实例在地面上有点薄,所以我想知道是否有人可以展示一个简单的例子?

提前致谢8 +)

修改

//quantity<degree_base_unit> FlindersSDeg2.value(-37.0);
//quantity< angle::arcminute_base_unit> FlindersSMin = 57.0;
//quantity< angle::arcsecond_base_unit> FlindersSSec = 3.72030;

我想我需要更好地理解声明是如何工作的。 :)

EDIT2:

非常感谢 - 也许我花了整整一个时间来寻找方法来实现它的提升和放大设施不在那里!我以为可能是因为我在这里找到了这个过时的代码http://www.boost.org/doc/libs/1_47_0/libs/geometry/doc/doxy/doxygen_input/sourcecode/doxygen_1.cpp

void example_dms()
{
/*
Extension, other coordinate system:
// Construction with degree/minute/seconds
boost::geometry::dms<boost::geometry::east> d1(4, 53, 32.5);

// Explicit conversion to double.
std::cout << d1.as_value() << std::endl;

// Conversion to string, with optional strings
std::cout << d1.get_dms(" deg ", " min ", " sec") << std::endl;

// Combination with latitude/longitude and cardinal directions
{
    using namespace boost::geometry;
    point_ll<double, boost::geometry::cs::geographic<boost::geometry::degree> >        canberra(
        latitude<>(dms<south>(35, 18, 27)),
        longitude<>(dms<east>(149, 7, 27.9)));
    std::cout << canberra << std::endl;
}
*/
}

3 个答案:

答案 0 :(得分:3)

以下是我使用升压单位和角度的一些转换方法:

double ToDegrees(const Angle & angle)
{
    return static_cast<boost::units::quantity<boost::units::degree::plane_angle>>(angle).value();
}

double ToRadians(const Angle & angle)
{
    return static_cast<boost::units::quantity<boost::units::si::plane_angle>>(angle).value();
}

这些是由类型安全的工厂补充的:

Angle Degrees(double angleInDegrees)
{
    return angleInDegrees * boost::units::degree::degrees;
}

Angle Radians(double angleInRadians)
{
    return Angle(angleInRadians * boost::units::si::radians);
}

要捕获度,分,秒,请使用如下转换结构替换上面的度数:

struct DMS
{
    DMS(double value)
    {
        degrees = std::floor(value);
        double rem = (value-degrees) * 60;
        minutes = std::floor(rem);
        seconds = (rem-minutes) * 60;
    }

    operator double() const
    {
        return degrees + minutes/60 + seconds/3600;
    }

    double degrees;
    double minutes;
    double seconds;
};

答案 1 :(得分:0)

您的第一个类型安全工厂未返回角度。

也许你可以试试:

return Angle( angleInDegrees * boost::units::degree::degrees);

答案 2 :(得分:0)

并确保您拥有正确的类型,以便进行正确的数字转换(即PI / 180)。使用这些函数进行测试:

///  theta is radian units  (si)
template<class Y>
bool isRad(const boost::units::quantity<si::plane_angle, Y>& theta)
{
    return true;
}
///  theta in other angular units 
template<class System, class Y>
bool isRad(const boost::units::quantity<boost::units::unit<boost::units::plane_angle_dimension, 
System>, Y>& theta)
{
    return false;
}