向量旋转任意角度坐标

向量 \(\overrightarrow{a} = (x, y)\) 顺时针旋转 \(\alpha\) 得到的向量的坐标为 \((x', y')\)
\(x' = \sin \alpha * y + cos \alpha * x, y' = cos \alpha * y - \sin \alpha * x\)

\(\overrightarrow{a} = (\cos \beta, \sin \beta)\)
旋转后
\(\overrightarrow{a} = [\cos (\alpha - \beta), \sin (\alpha - \beta)]\)

将坐标展开得到
\(\overrightarrow{a} = (\cos \alpha \cos \beta + \sin \alpha \sin \beta, \sin \alpha \cos\beta - \cos\alpha \sin\beta)\)

从而
\(x' = \sin \alpha * y + cos \alpha * x, y' = cos \alpha * y - \sin \alpha * x\)

转载于:https://www.cnblogs.com/sssy/p/9775175.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于二维数组的顺时针和逆时针旋转任意角度,可以使用向量投影来进行角度的转换。下面是一个示例的C语言代码: ```c #include <stdio.h> #include <math.h> #define PI 3.14159265 // 顺时针旋转任意角度 void rotateClockwise(float angle, int arr[][3], int rows, int cols) { float radian = angle * PI / 180.0; int i, j; float cosVal = cos(radian); float sinVal = sin(radian); int tmp[3][3]; for (i = 0; i < rows; i++) { for (j = 0; j < cols; j++) { tmp[i][j] = arr[i][j]; arr[i][j] = cosVal * tmp[i][j] + sinVal * tmp[rows-1-j][i]; } } } // 逆时针旋转任意角度 void rotateCounterClockwise(float angle, int arr[][3], int rows, int cols) { float radian = angle * PI / 180.0; int i, j; float cosVal = cos(radian); float sinVal = sin(radian); int tmp[3][3]; for (i = 0; i < rows; i++) { for (j = 0; j < cols; j++) { tmp[i][j] = arr[i][j]; arr[i][j] = cosVal * tmp[i][j] - sinVal * tmp[j][cols-1-i]; } } } int main() { int arr[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}; printf("Original Array:\n"); for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { printf("%d ", arr[i][j]); } printf("\n"); } rotateClockwise(45, arr, 3, 3); printf("Clockwise Rotated Array:\n"); for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { printf("%d ", arr[i][j]); } printf("\n"); } rotateCounterClockwise(30, arr, 3, 3); printf("Counter Clockwise Rotated Array:\n"); for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { printf("%d ", arr[i][j]); } printf("\n"); } return 0; } ``` 在这个示例代码中,我们定义了两个函数 `rotateClockwise` 和 `rotateCounterClockwise`,分别用于顺时针和逆时针旋转任意角度。这两个函数接受一个角度参数 `angle`、一个二维数组 `arr`、以及数组的行数 `rows` 和列数 `cols`。我们使用 `cos` 和 `sin` 函数来计算角度的余弦和正弦值。 在旋转过程中,我们使用一个临时数组 `tmp` 来保存原始数组的值,避免被覆盖。根据向量投影的原理,我们可以得到新的坐标点 `(x', y')`: - 对于顺时针旋转,新的横坐标 `x'` 为 `cos(angle) * x + sin(angle) * y`,新的纵坐标 `y'` 为 `cos(angle) * y - sin(angle) * x`。 - 对于逆时针旋转,新的横坐标 `x'` 为 `cos(angle) * x - sin(angle) * y`,新的纵坐标 `y'` 为 `cos(angle) * y + sin(angle) * x`。 在示例代码中,我们对一个3x3的数组进行了顺时针旋转45度和逆时针旋转30度,并输出旋转后的结果。 希望以上代码和解释可以帮助你理解如何在C语言中实现二维数组的顺时针和逆时针旋转任意角度

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值