使用纵横比旋转2D矢量

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用纵横比旋转2D矢量相关的知识,希望对你有一定的参考价值。

我们中的许多人都熟悉在给定角度theta的情况下围绕原点旋转2D矢量的方法:

newX = x * cos(theta) - y * sin(theta);
newY = x * sin(theta) + y * cos(theta);

我现在正试图在图像UV空间中旋转坐标,如下所示:

(从this借来的图像问题。)

这里u轴的单位比v轴的单位宽,所以上面的方法导致坐标围绕椭圆旋转而不是圆。我需要矢量的旋转来表现为坐标是方形的,这意味着需要考虑纵横比。我认为它就像将坐标拉伸到方形空间,旋转然后向后拉伸一样简单,尽管看起来矢量仍然是椭圆形旋转的:

newX = (x * cos(theta) * Aspect - y * sin(theta)) / Aspect;
newY = x * sin(theta) * Aspect + y * cos(theta);

任何帮助表示赞赏,提前谢谢!

答案

旋转和纵横比的一般版本是:

(center_c,center_y)是旋转的中心

(aspect_x,aspect_y)是aspect_ratio

tmp_x = (x-center_x)/aspect_x
tmp_y = (y-center_y)/aspect_y
tmp_x = tmp_x * cos(theta) - tmp_y * sin(theta)
tmp_x = tmp_x * sin(theta) + tmp_y * cos(theta)
new_x = aspect_x*tmp_x-center_x
new_y = aspect_y*tmp_x-center_y

希望有所帮助。

以上是关于使用纵横比旋转2D矢量的主要内容,如果未能解决你的问题,请参考以下文章

旋转 UIView 并在旋转后保持纵横比

XCode:调整图像大小使用纵横比并向下移动图像下方的元素

html5视频android:全屏保持纵横比

使用纵横比和空白区域裁剪图像

android相机预览错误的纵横比

在 Unity 中支持多种纵横比