【问题标题】:How can I scale and rotate a square to fit within a square at a user inputted angle?如何以用户输入的角度缩放和旋转正方形以适应正方形?
【发布时间】:2021-01-09 21:49:24
【问题描述】:

我目前正在尝试以递归方式在正方形内绘制一个正方形,该正方形将适合其各自的正方形。用户将输入正方形缩放和旋转的次数,并选择角度。

例如输入5个45度角的分割,会产生:

Image scaled by sin(45) and rotated at a 45 degree angle 5 times

现在这没问题,但它只适用于 45 度角。我将如何获得不同角度的比例?假设以 19 度角输入 5 的除法?

下面是我现在的代码(它在 OpenGL 中,但它仍然是一个三角/数学问题):

glm::vec3 vector = transformObject(1.0f, Z_AXIS, 0.0f, glm::vec3(0.0f, 0.0f, 0.0f));
glDrawArrays(GL_LINE_LOOP, 0, 4);
float scale = 1.0f;
float SinOfAngle = glm::sin(glm::degrees(inputtedAngle));
for (int i = 0; i < userInputTimes; i++)
{
    scale *= SinOfAngle;
    vector = transformObject(scale , Z_AXIS, inputtedAngle, glm::vec3(0.0f, 0.0f, 0.0f));
    glDrawArrays(GL_LINE_LOOP, 0, 4);
    inputtedAngle += inputtedAngle;
}

【问题讨论】:

    标签: c++ opengl rotation trigonometry glm-math


    【解决方案1】:

    因为它仍然是一个三角/数学问题我会用数学来回答。

    无论正方形如何旋转,它们的中心点始终相同。这是一个仿射变换问题,

    假设用户提供了一个角度 θ,重复 k 次。

    固定向量n,即指向上方的单位向量。

    1. 将向量 v1 从中心固定到一个角。
    2. 将向量v1旋转θ度,你会得到v1`
    3. 缩放因子为:float factor = glm::dot(v1, n) / glm::dot(v1`, n)
    4. 缩放并旋转原始正方形和n(因子,θ),你会得到图2中的红色正方形 //记住先缩放然后旋转,顺序在这里很重要。

    重复 1、2、3 次 k 次,你应该能够得到那 k 个旋转的正方形。


    ps 1. 证明意味着如果我们将 v1 和 v1` 投影到向量 n,由于三角形相似,垂直边和斜边的因子是相同的。所以 glm::dot(v1, n) / glm::dot(v1`, n) 是一个有效的因素。

    ps 2. 只有第一次迭代依赖于全局框架,其余操作都依赖于之前迭代生成的局部框架。

    【讨论】:

    • 我在试图理解这一点时有点困惑。说vector.x是正方形边的长度(1)。我有长边,我有斜边(sqrt((1 * 1 + 1 * 1)),我有角度(90、45、45)。不知道我应该如何插入这些数字以获得比例尺。我发现一旦你得到第一个比例尺,它就会递归地按比例缩小。所以对于 45 度旋转,每次迭代的比例尺* = 0.707107。对于 19 度旋转,它是比例尺 *= ~ 0.785 每次迭代。
    • @JohnCannatoid 在这种情况下,v1 将是 (-0.5, 0.5),旋转后的 v1' 将是 (0, sqrt(2)/2),n 将是 (0,1) .通过插入数字,您得到 dot(v1, n) / dot(v1',n) = 0.5 / (sqrt(2)/2) => 0.707107。
    • 用户输入的角度在这个方程中的什么位置起作用?所以像19度旋转?似乎方程总是会输出一个仅适用于 45 度旋转的比例
    • @JohnCannatoid 用户输入角度为θ
    • 我试过你给我的公式,我想知道在哪里把theta放进去?我试过制作两个向量。一个是 (-0.5, 0.5),另一个是 (theta, sqrt(2)/2),n 是 (0, 1)。然后我做了两个点值的划分。在任何输入角度,答案都是 0.707107,它不适用于 19 度旋转。如果用户输入 19 作为旋转角度,它应该给我一个 0.785 的近似比例,尽管在任何输入的角度我都会得到 0.707107
    猜你喜欢
    • 2021-11-19
    • 1970-01-01
    • 1970-01-01
    • 2017-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多