c++ - 简化一段代码—— vector 旋转一圈

标签 c++ conditional-operator simplify

给定以下代码模式,其中我试图在整数 int x 上以 45 度的增量声明 vector 方向和 int y , 位于原点的圆圈内

// x == 0 && y == 0 case is already taken cared of 

if(x > 1) {
    if(y == 0) {
        // horizontal right
        m_rotation = 0;
    }else if(y < 1) {
        // diagonal down right
        m_rotation = 315;
    } else if(y > 1) {
        // diagonal up right
        m_rotation = 45;
    }
} else if(x == 0) {
    if(y < 1) {
        // vertical down
        m_rotation = 270;
    } else if(y > 1) {
        // vertical up
        m_rotation = 90;
    }
} else if(x < 1){
    if(y == 0) {
        // horizontal left
        m_rotation = 180;
    }else if(y < 1) {
        // diagonal down left
        m_rotation = 225;
    } else if(y > 1) {
        // diagonal up left
        m_rotation = 135;
    }
}

我正在寻找一种优雅的方式来使它紧凑。我知道有宇宙飞船运算符(operator) <=> ,但我需要限制自己使用 C++17

我尝试过的事情

  • 使用 m_rotation = x > 1? (y < 1? (y == 0? 0: 315): 45): (x == 0? (y < 1? 270: 90): (y < 1? (y == 0? 180: 225): 135)); 嵌套三元运算符, 但这看起来很奇怪
  • 我试着把 x == 0箱内x < 1 case 并将 later 转换为 else,但这并不足以简化代码
  • 使用绝对值比较xy , 但我很快就迷路了
  • 真的没有别的了,我不知道还能尝试什么

最佳答案

有点像

constexpr int rotation[3][3] = {
  {225, 180, 135},
  {270,   0,  90},
  {315,   0,  45},
};
if (x != 0 || y != 0)  // if (!(x == 0 && y == 0))
  m_rotation = rotation[1 + sign(x)][1 + sign(y)];

关于c++ - 简化一段代码—— vector 旋转一圈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71289889/

相关文章:

c++ - 在 switch case 语句中交叉初始化错误

c++ - boost::asio 如何以正确的方式读取完整缓冲区?

c++ - 如何初始化对在单独文件中声明的类的引用?

java - 在 Java 中转换内部条件运算符

c# - 如何在 datetime 为 null 时将可为空的 datetime 值转换为 string.empty?

mysql - 简化MySQL子查询

c++ - 在 Eigen C++ 中广播(两个) vector

c++ - 条件运算符无法解析重载的成员函数指针

javascript - 简化 jQuery 事件

python - 如何用 sympy 简化矩阵中的分数?