问题描述
我目前正在尝试在一个正方形内递归绘制一个正方形,以适合其各自的正方形。用户将输入正方形缩放和旋转多少次,然后选择角度。
例如,当以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问题,我会用数学的方式回答。
无论正方形如何旋转,其中心点都将始终相同。这是一个仿射变换问题,
假设用户提供一个角度θ,重复k次。
固定向量n,即向上的单位向量。
- 将向量v1从中心固定到一个角。
- 将向量v1旋转θ度,您将得到v1`
- 比例因子将为:浮点因子= glm :: dot(v1,n)/ glm :: dot(v1`,n)
- 缩放并旋转原始正方形,然后按(因子θ)旋转n,您将在图2中得到红色正方形//首先记住缩放比例然后旋转,这里的顺序非常重要。
将k,1、2、3重复k次,您应该能够获得k个旋转的正方形。
ps 1.证明意味着如果将v1和v1`投影到向量n,则由于相似的三角形,垂直边和斜边的因数都相同。所以glm :: dot(v1,n)/ glm :: dot(v1`,n)是有效的因子。
ps 2.只有第一个迭代依赖于全局框架,其余操作都取决于先前的迭代生成的局部框架。