如何缩放和旋转正方形以适合用户输入角度的正方形?

问题描述

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

例如,当以45度角输入5个格时,将产生:

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));
glDrawArrays(GL_LINE_LOOP,4);
float scale = 1.0f;
float SinOfAngle = glm::sin(glm::degrees(inputtedAngle));
for (int i = 0; i < userInputTimes; i++)
{
    scale *= SinOfAngle;
    vector = transformObject(scale,inputtedAngle,0.0f));
    glDrawArrays(GL_LINE_LOOP,4);
    inputtedAngle += inputtedAngle;
}

解决方法

由于它仍然是一个trig / math问题,我会用数学的方式回答。

enter image description here

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

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

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

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

将k,1、2、3重复k次,您应该能够获得k个旋转的正方形。


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

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

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...