c++ - 弧度和度数的角度类

标签 c++ math trigonometry

我想做一个以弧度或度数初始化的角度类,但我不知道这是否是个好主意。我在想这样的事情:

Class Diagram

class Radian;
class Degree;

/**
  * My angle class.
  **/
class Angle
{
    private:
        float m_radian;

    public:
        explicit Angle(const Radian& rad);

        explicit Angle(const Degree& deg);

        float GetRadian(void) const
        {
            return this->m_radian;
        }

        float GetDegree(void) const
        {
            return ToDegree(this->m_radian);
        }

        bool IsEqual(const Angle& angle, float epsilon = 0.001f) const
        {
            return Abs<float>(this->m_radian - angle.m_radian) < epsilon;
        }

        void Set(const Angle& ang);

    protected:
        Angle(void) : m_radian(0.0f)
        {}

        Angle(float rad) : m_radian(rad)
        {}
};

class Radian : public Angle
{
    public:
        Radian(void)
        {}

        Radian(float r) : Angle(r)
        {}
};

class Degree : public Angle
{
    public:
        Degree(void)
        {}

        Degree(float d) : Angle(ToRadian(d))
        {}
};

/// Trigonometric functions.
float Sin(const Angle& angle);
...

这样我就不会在我的代码中混淆弧度和度数。但是,这是个好主意还是我应该使用其他设计?

最佳答案

你在这里根本不需要任何继承。一旦构建了对象,您就不再关心差异了——它们的行为完全相同。因此,您必须解决的唯一问题是如何以可读的方式制作构造 Angle 对象。

通常的解决方案是使用 named constructors :

class Angle
{
    public:
        static Angle fromRadians( float v );
        static Angle fromDegrees( float v );
        // ...

    private:
        Angle( float rad );
        // ...
};

不是直接调用构造函数,而是提供具有表达性名称的工厂函数。所以你写:

void f( Angle::fromDegrees( 3.0 ), Angle::fromRadians( 17.0 ) );

关于c++ - 弧度和度数的角度类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12124228/

相关文章:

c++ - void指针函数的输出

c++ - 如何更改 QPlainTextEdit 中文本 block 的背景

c++ - 使用一维数组的矩阵乘法

ios - 计算大于360度的旋转角度而不是倾斜角度

javascript - 在javascript中计算旋转矩形的中点

android:为sqlite创建函数

c++ - eclipse 和 VC++6 : NMAKE fatal error U1073

c++ - Boost.Spirit 解析可选前缀

haskell - 欧拉计划 #14 Haskell 的技巧?

javascript - 将 x 分成 y 部分随机数,最大值为 n