引言
Day9連結:https://ithelp.ithome.com.tw/articles/10219455
昨天我們簡單得討論了關於旋轉矩陣的概念,還沒看過的朋友可以點上面的連結去看看哦!
今天我們一樣要使用C語言來實作座標軸旋轉的模擬:利用旋轉矩陣。
有了這個基礎,你就可以GET「旋轉」技能,看到電視囉XD(昨天的梗
座標公式Review
我們先來再次Review昨天得出的旋轉後座標公式:
( 假設旋轉前座標是(x, y, z),以下公式將原本為0的項簡化 )
因此我們就照著上面的公式寫出程式吧!
C語言實作
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main()
{
int ox, oy, oz; // 使用者輸入原始座標
float rx, ry, rz; // 座標軸旋轉後座標
double theta_x, theta_y, sin_x, sin_y, cos_x, cos_y; // 設定旋轉角度用、存放三角函數結果用
printf("請輸入原始座標(ox, oy, oz):\n");
scanf("%d %d %d", &ox, &oy, &oz);
printf("原始: ox:%d oy:%d oz:%d\n\n", ox, oy, oz);
for(;;)
{
printf("請輸入旋轉角度(theta_x, theta_y)(弧度):\n");
scanf("%lf %lf", &theta_x, &theta_y);
sin_x = sin(theta_x); // 先行計算三角函數值
sin_y = sin(theta_y);
cos_x = cos(theta_x);
cos_y = cos(theta_y);
rx = ox; // 先初始化,稍後全部以rx計算,ox當作保存原始值
ry = oy;
rz = oz;
// 繞x軸旋轉
rx = rx;
int temp_y = ry; // 稍後ry會被蓋掉,先保存起來
ry = cos_x * ry + (-sin_x) * rz;
rz = sin_x * temp_y + cos_x * rz; // 原本ry的地方以temp_y取代
// 繞y軸旋轉
int temp_x = rx; // 稍後rx會被蓋掉,先保存起來
rx = cos_y * rx + sin_y * rz;
ry = ry;
rz = (-sin_y) * temp_x + cos_y * rz; // 原本rx的地方以temp_x取代
// 印出新座標
printf("旋轉後: rx:%f ry:%f rz:%f\n\n", rx, ry, rz);
}
return 0;
}
程式執行結果
首先輸入原始座標,範例:(10, 20, 30)
輸入兩組數據,分別是:
途中打叉的地方表示該地方無變化,我們可以得到小小結論:
繞著某軸旋轉,則該軸座標在當次旋轉中不改變