水平翻转角度

4
我想知道一种在水平轴上翻转角度的方法,而不必进行多次操作。假设我有一个角度为0(在我的代码坐标系中“向右指”),翻转后的角度应为180(指向左)。如果是90(指向上),翻转后仍应为90。89变成91,依此类推。 我可以对角度所暗示的X/Y速度进行操作,但这会减慢事情的进程,而且我感觉这不是正确的方法。 我不太懂数学,所以可能用错了术语……有人能帮忙吗? 编辑:抱歉,我回复得很晚,我不在电脑旁边,好的… http://img215.imageshack.us/img215/8095/screenshot031v.jpg 这个截图可能有用。上面的结构是两个卫星和一个光束连接到中心的白点。两个卫星应该继承白点的角度(可见于调试目的),所以如果它指向一个角度,它们将跟随。左边的卫星是镜像的,所以我按照建议计算了180-角度,尽管这也是我的第一次尝试。正如你所看到的,它不是镜像的,而是翻转的。当白点旋转时,它会向后旋转。另一个做得很好。
这是与其他东西链接的内容的角度重新计算,pid将是父对象,id为当前pin。ang是角度偏移量,在对象链接到另一个对象时复制,因此在旋转时保持位置不变。
if(object[id].mirror)
    object[id].angle = 180 - (object[id].pin.ang + object[pid].angle);
else
    object[id].angle = object[id].pin.ang + object[pid].angle;

这是具体的旋转部分。OpenGL。offx/y用于偏离中心旋转的物体,例如即将出现的光束,它可以正确渲染其他所有内容。

glTranslatef(list[index[i]].x, list[index[i]].y, 0);
glRotatef(list[index[i]].angle, 0.0, 0.0, 1.0);
glTranslatef(list[index[i]].offx, -list[index[i]].offy, 0);

旋转似乎也会错过旋转速度(每次重绘时添加到当前角度的整数,顺时针旋转为正,如下所示: http://img216.imageshack.us/img216/7/screenshot032ulr.jpg。 因此,它绝对不是180-角度,尽管这显而易见。镜像是通过反转纹理坐标来完成的,因此不会影响角度。我担心这可能是GL旋转的一个怪癖。

1
听起来你想要“围绕垂直轴翻转”。 - pavium
你想把指向下视为270度还是-90度?或者这种情况永远不会发生? - pavium
1
如果你做180+角度,它会给你完全相反的方向(例如:上左变成下右)。 如果你做180-角度,它会将其左右翻转,而不影响上下(例如:上左变成上右)。 - Samuel Jaeschke
那么你到底想要什么,你想在Y轴上反射它吗?因为从180中减去角度可以完美地解决问题,你能否更清楚地解释一下在你的示例中哪些角度不起作用。针对你第一篇帖子中所说的所有内容,从180中减去是可行的。然而,你可以通过操作x/y坐标来将y坐标乘以-1。这将始终在y轴上反射你的坐标。 - JSchlather
我希望两个卫星在旋转时面对彼此,而不是向后旋转。除了angle+=rotatespeed之外,没有与角度相关的代码了。 - DalGr
显示剩余2条评论
7个回答

13

仅从数学上看,反射角度应该是(180 - angle)

Angle | Reflection
------+-----------
    0 |        180
   90 |         90
   89 |         91
   91 |         89
  360 |       -180
  270 |        -90

注意,如果您跌落到“水平面”以下,则会出现负数 - 您可以将其保留为原样,或将其作为特殊情况处理。


180度的角度也会垂直翻转,就像数字9和6一样。我应该注意到我正在用它来处理图形。当设置标志时,图形将被翻转,并且我希望它具有相反的角度,以便在旋转基础时保持相同的构造。但是,180度减去角度会导致对象上下颠倒。 - DalGr
1
你可以通过加上或减去360度的倍数来将角度归一化到例如[0;360)区间内。 - starblue
1
@DalGr:在这种情况下,没有办法通过改变角度来翻转对象。您需要镜像它,即单独翻转对象中的每个点。 - Guffa
@DalGr:我觉得你有些混淆了。你想要翻转的模型是什么样子的?翻转后应该是什么样子? - Svante
你能发布一张截图吗?这取决于你的图片是怎么构建的。但是,像 @Guffa 所说的那样,你可能需要翻转图片。 - Samuel Jaeschke
@ DalGr - 你应该将这个添加到问题中。在这种情况下,@Guffa是正确的。 - butterchicken

3

这难道不是简单的

结果 = 180 - (你的角度)


2

如前所述,您可以通过从180度中减去您的角度来找到相反的角度。例如:

180 - yourangle

直接操作X/Y速度并不会很麻烦。您只需通过将其乘以负1来反转X速度的方向,例如:speedx = (-1) * speedx。这将更改左右方向,例如:向左移动的物体将开始向右移动,反之亦然,垂直速度将不受影响。
如果您正在使用正弦/余弦(sin/cos)重新计算您的X/Y速度分量,则*(-1)方法可能更有效。最终它取决于您程序的上下文。如果您正在寻找更好的解决方案,请在问题中提供更多细节。

2
这个解决方案是针对-Y向角度(就像手表一样)的!对于+X方向(就像学校数学) ,您需要交换X和Y。
public static float FlipAngleX(float angle)
{
    angle = NormalizeAngle(angle);

    angle = TwoPi - angle;

    return angle;
}

public static float FlipAngleY(float angle)
{
    angle = NormalizeAngle(angle);

    if (angle < Pi)
    {
        angle = Pi - angle;
    }
    else
    {
        angle = TwoPi - angle + Pi;
    }
    return angle;
}

/// <summary>
/// Keeps angle between 0 - Two Pi
/// </summary>
public static float NormalizeAngle(float angle)
{
    if (angle < 0)
    {
        int backRevolutions = (int)(-angle / TwoPi);
        return angle + TwoPi * (backRevolutions + 1);
    }
    else
    {
        return angle % TwoPi;
    }
}

0
啊,看来问题毕竟是来自负数,我确保它们为正数,现在旋转正常了,我甚至不需要重新计算角度... 感谢大家,最终我因为每个回答的一点点都找到了答案。

0
将翻转计数器从逆时针改为顺时针(右边的270度变成右边的90度) < p> < code>角度-360

--

垂直翻转(180度在上方 -> 0/360度在上方)

Math.Normalize(angle - 180)

--

两者:

float flipped_vertical = angle - 360 float flipped_vertical_and_horizontal = Math.Normalize(flipped_vertical- 180)


-1

只需使用360-angle,您的角度就会水平翻转而不是垂直翻转


对于情况(360-角度),将水平和垂直翻转。 - Volodymyr Prysiazhniuk
它只会相对于X轴(水平轴)进行镜像。我猜回答者被措辞搞混了。 - Salvador Medina

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接