c語言旋轉矩陣
① c璇璦鐜鐟拌姳紼嬪簭
```htmlC璇璦緇樺埗鐜鐟拌姳鍥炬堢殑綆瑕佹傝堪
瑕佸壋寤轟竴涓狢璇璦紼嬪簭錛岀敤浜庣粯鍒朵竴涓緹庝附鐨勭帿鐟拌姳鍥炬堬紝鎴戜滑闇瑕佷竴浜涘熀鏈鐨勬暟瀛﹀嚱鏁板拰鐭╅樀鎿嶄綔銆備互涓嬫槸紼嬪簭鐨勫叧閿閮ㄥ垎錛屽寘鎷鏃嬭漿鐭╅樀銆佸悜閲忔搷浣滃拰鍏夌収妯″瀷錛
mat3 rotationXY(float x, float y) {
vec2 c, s = {sin(x), sin(y)};
mat3 m = {
c.y, 0.0f, -s.y,
s.y * s.x, c.x, c.y * s.x,
s.y * c.x, -s.x, c.y * c.x
};
return m;
}
鎺ョ潃鏄鐢ㄤ簬鎻忕粯鑺辯摚杈圭紭鐨勫嚱鏁癭sdPetal`鍜屾槧灝勫嚱鏁癭map`錛屼互鍙婅$畻姊搴︾殑`gradient`鍑芥暟錛屽畠浠鍦ㄧ粯鍒惰繃紼嬩腑璧峰埌鍏抽敭浣滅敤錛
涓轟簡鐢熸垚鐜鐟拌姳鐨3D鏁堟灉錛屾垜浠榪橀渶瑕佽$畻鍏夌嚎鏂瑰悜錛坄ray_dir`錛夊拰鍍忕礌鍏夌収錛坄f`錛夛紝鏈鍚庡湪涓誨嚱鏁癭main`涓灝嗚繖浜涚粍浠剁粨鍚堣搗鏉ョ敓鎴愬浘鍍忥細
vec3 ray_dir(float fov, vec2 pos) {
vec3 r = {pos.x, pos.y, -tan((90.0 - fov * 0.5) * DEG_TO_RAD)};
return normalize3(r);
}
float f(vec2 fragCoord) {
vec3 dir = ray_dir(45.0, fragCoord);
vec3 eye = {0.0f, 0.0f, 4.5f};
dir = mul(rotationXY(angle, pitch), dir);
eye = mul(rotationXY(angle, pitch), eye);
float depth = ray_marching(eye, dir, 0.0, clip_far);
if (depth >= clip_far) return 0.0f;
return shading(pos, gradient(pos), eye);
}
int main() {
for (int y = 0; y < 80; y++) {
for (int x = 0; x < 160; x++) {
char pixel = " .,-:;+=*#@"[(int)(f(make2((x / 160.0 - 0.5) * 2.0f, (y / 80.0 - 0.5f) * -2.0f)) * 12.0f)];
printf("%c", pixel);
}
printf("
");
}
}
榪欎釜C璇璦紼嬪簭閫氳繃宸у欑殑鐭╅樀鍙樻崲鍜屽厜鐓ц$畻錛屾瀯寤哄嚭涓涓緇嗚吇鐨勭帿鐟拌姳鍥炬堬紝灝嗘暟瀛︿箣緹庝笌緙栫▼鑹烘湳瀹岀編鋙嶅悎銆傛瘡涓鍍忕礌鐨勭敓鎴愰兘渚濊禆浜庡嶆潅鐨勫悜閲忓拰鐭╅樀榪愮畻錛屽睍紺轟簡紼嬪簭鍛樺瑰嚑浣曞拰鍏夌収鐨勭悊瑙c傚湪瀹為檯緙栫▼涓錛屼綘鍙浠ユ牴鎹闇瑕佽皟鏁村弬鏁板拰鍑芥暟緇嗚妭錛屼互鍒涘緩鍑烘洿澶氬彉鍖栫殑鐜鐟拌姳鏁堟灉銆
#include <stdlib.h>
#include <stdio.h>
#define N 5
int min(int a,int b,int c,int d)
{
a=a<b?a:b;
a=a<c?a:c;
a=a<d?a:d;
return a;
}
int main()
{
int arr[N][N],i,j;
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
arr[i][j]=min(i,j,N-1-i,N-1-j);
printf("%d ",arr[i][j]);
}
printf("\n");
}
system("pause");
return 0;
}