재밌는 코드 Donut-shaped C code에 대하여

얼마전에 유튜브에서 재밌는 C-code를 보게 되었다. 

 

https://youtu.be/DEqXNfs_HhY

Donut-shaped 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;
}

 

이 코드의 원리는 간략하게 다음과 같다.

 

출처 : https://www.youtube.com/watch?v=DEqXNfs_HhY 캡처

 

1. R2에 중심을 둔 반지름 R1의 원을 만든다.

2. Y축을 기준으로 원을 회전시켜 도넛을 만든다.

3. 생성한 도넛을 X, Z 축 주위로 회전시킨다.

4. 도넛을 2D 화면에 표시한다.

5. 특정 광원을 선택한 후 표면 법선을 계산하여 조명을 선택한다(?) - (무슨 말인지 아시는 분 댓글 좀 달아주세요...)

 

 

혹시라도 더 자세히 원리에 대해 알고 싶다면 다음을 참고하자. 상당히 복잡하다.

 

 

Donut math: how donut.c works

 

www.a1k0n.net

 

반응형

'일상' 카테고리의 다른 글

윈도우10 Git 자동 push 배치 파일 만들기  (2) 2022.02.08

댓글

Designed by JB FACTORY