재밌는 코드 Donut-shaped C code에 대하여
- 일상
- 2022. 4. 30.
얼마전에 유튜브에서 재밌는 C-code를 보게 되었다.
별로 쓸데는 없지만 재밌어 보여서 나도 구현해보고 싶어졌다. 하지만 구글에 Donut-shaped C code를 검색해봐도 제대로 된 코드를 찾기가 쉽지 않았다. 겨우 찾은 코드에서 몇가지 오류가 나는 것을 해결해서 완성한 코드는 다음과 같다.
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <unistd.h>
int main(){
int k;
float A=0, B=0, i, j, z[1760];
char b[1760];
printf("\x1b[2J");
for(; ; ) {
memset(b,32,1760);
memset(z,0,7040);
for(j=0; 6.28>j; j+=0.07) {
for(i=0; 6.28 >i; i+=0.02) {
float sini=sin(i),
cosj=cos(j),
sinA=sin(A),
sinj=sin(j),
cosA=cos(A),
cosj2=cosj+2,
mess=1/(sini*cosj2*sinA+sinj*cosA+5),
cosi=cos(i),
cosB=cos(B),
sinB=sin(B),
t=sini*cosj2*cosA-sinj* sinA;
int x=40+30*mess*(cosi*cosj2*cosB-t*sinB),
y= 12+15*mess*(cosi*cosj2*sinB +t*cosB),
o=x+80*y,
N=8*((sinj*sinA-sini*cosj*cosA)*cosB-sini*cosj*sinA-sinj*cosA-cosi *cosj*sinB);
if(22>y&&y>0&&x>0&&80>x&&mess>z[o]){
z[o]=mess;
b[o]=".,-~:;=!*#$@"[N>0?N:0];
}
}
}
system("cls");
for(k=0; 1761>k; k++)
putchar(k%80?b[k]:10);
A+=0.08;
B+= 0.02;
}
return 0;
}
이 코드의 원리는 간략하게 다음과 같다.
1. R2에 중심을 둔 반지름 R1의 원을 만든다.
2. Y축을 기준으로 원을 회전시켜 도넛을 만든다.
3. 생성한 도넛을 X, Z 축 주위로 회전시킨다.
4. 도넛을 2D 화면에 표시한다.
5. 특정 광원을 선택한 후 표면 법선을 계산하여 조명을 선택한다(?) - (무슨 말인지 아시는 분 댓글 좀 달아주세요...)
혹시라도 더 자세히 원리에 대해 알고 싶다면 다음을 참고하자. 상당히 복잡하다.
반응형
'일상' 카테고리의 다른 글
윈도우10 Git 자동 push 배치 파일 만들기 (2) | 2022.02.08 |
---|