4

私はこのコードを動作させました:

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

しかし、私は度分と秒を実行し、ラジアンに変換してから再び戻したいと思います。

ブーストシステムがどのように機能するかを理解するために1日を費やしました-例は地面に少し薄いので、誰かが簡単な例を示すことができるかどうか疑問に思っていました?

よろしくお願いします 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;

宣言がどのように機能するかをよりよく理解する必要があると思います。:)

編集2:

どうもありがとうございました - おそらく私はブーストでそれを行う方法を探していましたが、その機能はありませんでした! ここでこの古いコードを見つけたからかもしれないと思いました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;
}
*/
}
4

3 に答える 3

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

度、分、秒をキャプチャするには、上記の度の double を次のような変換構造体に置き換えます。

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;
};
于 2013-05-09T15:57:33.263 に答える