給定以下代碼模式,其中我試圖以 45 度的增量在整數上宣告一個向量方向,int x并且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;
}
}
我正在尋找一種優雅的方式來使這個緊湊。我知道有spaceship 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案例中并將后者轉換為其他,但這并沒有足夠簡化代碼 - 使用絕對值比較
xandy,但我很快就迷路了 - 真的沒什么,我不知道還有什么可以嘗試的
uj5u.com熱心網友回復:
就像是
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)];
uj5u.com熱心網友回復:
有一個封閉的形式:
// standard sign functions
int xs = x < 0 ? -1 : x > 0;
int ys = y < 0 ? -1 : y > 0;
return 180 - 45 * (xs 2) * ys 90 * (xs * xs xs) * (ys * ys - 1);
或更短
return 180 * (x < 0 || y) - 45 * (xs 2) * ys;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/433862.html
上一篇:C 中指標的初始值
