c - 我无法判断这个旋转功能是否按预期工作

标签 c rotation

所以我导出了这样的旋转函数:

  • 我想绕 x 轴旋转 (a, b, c)

  • a 的值不会改变

  • 这相当于在 2d map 中围绕原点旋转 (b, c)

  • 对于极坐标中的二维 map ,旋转 d 度非常简单: θ = θ + d

  • 对于点 P(x, y),x = Rcos(θ)y = Rsin(θ)

  • 设Q为旋转后的点,则Q = (Rcos(θ + d), Rsin(θ + d))

因为 R2 = x2 + y2 且 θ = arctan(y/x):

Q = (sqrt(x2 + y2) * cos(arctan(y/x) + d, sqrt(x2) > + y2) * sin(arctan(y/x) + d)

然后我创建了一个给出坐标的 C 函数:arot_amount(通常为 1),它会为我旋转坐标。

static void     xrotate_coor(t_coor *a, int rot_amount)
{
        double d;
        double e;

        d = a->y;
        e = a->z;
        if (e == 0 && d == 0)
                return ;
        if (d == 0)
        {
                a->y = sqrt(d * d + e * e) * cos(atan(INFIN) + rot_amount * M_PI / 50);
                a->z = sqrt(d * d + e * e) * sin(atan(INFIN) + rot_amount * M_PI / 50);
                return  ;
        }
        a->y = sqrt(d * d + e * e) * cos(atan(e / d) + rot_amount * M_PI / 50);
        a->z = sqrt(d * d + e * e) * sin(atan(e / d) + rot_amount * M_PI / 50);
}

INFIN是一个宏,我设置为999999。

我不确定这是否正确,因为使用这个公式,我旋转的形状正在变形,所以我觉得我的逻辑在某个地方有缺陷......

最佳答案

您在计算中遇到了累积的错误。这是由计算机中数字表示方式的本质造成的。

在计算机图形学中处理此问题的典型方法是保持对象的坐标固定并将其转换到渲染帧所需的位置。在您的情况下,这意味着不是逐渐旋转对象,而是将对象保留在其原始位置,并根据当前应显示的位置简单地计算到绕 X 轴的当前角度的平移。

换句话说,如果您一次平移 360 度总共 20 度,则在第一次迭代中显示 20 度处的平移坐标,在第二次迭代中显示 40 度处的平移坐标,而不是每次实际平移 20 度.

关于c - 我无法判断这个旋转功能是否按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45703833/

相关文章:

c - 如何重新启动C语言程序?

c - 尝试在 if 函数中使用 strcmp 来计算句子中的字谜词

c - 为什么另一个结构中的一个结构被更新,而另一个结构却没有更新?

c# - 旋转后更改 WPF 元素的父元素(设置新坐标问题)

c# - 基于带有滑动手势的对象方向的光线转换

c++ - 扩展功能(也称为修改)visual studio C/C++ 编译器

c - 不使用数组从 n 个数中取最大的三个数

c++ - 使用 OpenCV 围绕一个点旋转一个点

android ImageView 一指旋转

math - 如何将3x3旋转矩阵转换为4x4矩阵?