c++ - 旋转功能奇怪的行为

标签 c++ rotation

我一直在研究旋转函数。这些点在每个循环中都会轻微移动到旋转中心。它取决于一个函数来获取中心和要旋转的点之间的距离:

struct Vector3F
{
    float x, y, z;
};

inline float GetDistance3FX_inline(Vector3F* v1, Vector3F* v2) 
{ 
    return v1->x - v2->x; 
}

inline float GetDistance3FZ_inline(Vector3F* v1, Vector3F* v2) 
{ 
    return v1->z - v2->z; 
}

确实起作用的实际旋转函数:

void Rotate3FY(Vector3F* point, Vector3F* center, float rad)
{
    float x = GetDistance3FX_inline(point, center);
    float z = GetDistance3FZ_inline(point, center);
    point->x = x * cos(rad) - z * sin(rad) + center->x;
    point->z = z * cos(rad) + x * sin(rad) + center->z;
}

起作用的函数:

void Rotate3FY(Vector3F* point, Vector3F* center, float rad)
{
    point->x = GetDistance3FX_inline(point, center) * cos(rad) - GetDistance3FZ_inline(point, center) * sin(rad) + center->x;
    point->z = GetDistance3FZ_inline(point, center) * cos(rad) + GetDistance3FX_inline(point, center) * sin(rad) + center->z;
}

我不知道这两者之间有什么逻辑上的区别。 感谢您的任何建议。

最佳答案

在第二个函数中,当您更新 point->x 时,您正在更改 point 的属性。因此,当您稍后在设置point->z 时再次调用相同的函数时,point->x 的值已经改变。

void Rotate3FY(Vector3F* point, Vector3F* center, float rad)
{
    point->x = GetDistance3FX_inline(point, center) * cos(rad) - GetDistance3FZ_inline(point, center) * sin(rad) + center->x;
    // point is now different to what it was at the start because you just 
    // changed is x member!!!!!!!
    point->z = GetDistance3FZ_inline(point, center) * cos(rad) + GetDistance3FX_inline(point, center) * sin(rad) + center->z;
}

在第一个函数中,您修改之前将所需的值存储在单独的变量中。

关于c++ - 旋转功能奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33528714/

相关文章:

html - 您将如何实现一些文本旋转 90° 的 Web UI

ios - 旋转问题后翻转图像(需要同时执行两项操作,只执行一项)

UITableView 旋转问题

c++ - 我可以用静态版本替换共享库依赖项吗?

c++ - 如何将变量附加到 QTextEdit 控件

c++ - 使用 SDL 时出现段错误

php - 从 iOS 应用程序错误旋转上传的图像

iphone - 使用分页旋转 UIScrollView 时出现问题

C++ "unresolved external symbol"用于 main 之外的函数

c++ - 崩溃 : terminate called after throwing an instance of 'std::system_error' what(): Resource deadlock avoided