본문 바로가기

전체 글612

[C++] 챕터 10 - 구조체 : 다양한 타입의 정보를 한 곳에 모으는 법 // 10-1 : 구조체의 정의 #include using namespace std; // 구조체 정의 struct StudentInfo { char bloodType; // 혈액형 int stdNumber; // 학번 float grade; // 평점 }; int main() { // 구조체 타입의 '변수' 정의 StudentInfo si1; StudentInfo si2; return 0; } /* --- 결과 --- ------ 구조체의 가장 중요한 목표는 여러가지 변수를 그룹처럼 만드는 것이다. main함수 안에서도 정의할 수 있다. 그러나 밖에서 정의하는 것이 일반적이다. 구조체 정의는 붕어빵 틀이다. 구조체 변수 정의는 붕어빵이다. 구조체 정의시 별도 메모리 공간이 할당되지 않는다. 구조체 '변.. 2023. 4. 27.
[GLSL] 11 - Noise 현실 세계 무작위성을 가지고 있지만, 랜덤과는 다르다. 이 다양성을 어떻게 표현할까? 1980년대 초 영화 "트론"을 위해 보다 사실적인 텍스처를 생성해 달라는 의뢰를 받은 켄 펄린은 이 문제를 해결했다. 이에 대한 해답으로 노이즈 알고리즘을 고안해냈다. 다음은 고전적인 펄린 노이즈 알고리즘은 아니지만, 노이즈 생성 방법을 이해하기 위한 기초 예제이다. float i = floor(x); // integer float f = fract(x); // fraction y = rand(i); //rand() is described in the previous chapter y = mix(rand(i), rand(i + 1.0), f); // 선형 보간법 y = mix(rand(i), rand(i + 1.0),.. 2023. 4. 26.
[GLSL] 10 - Random 랜덤은 엔트로피의 최대 표현이다. 코드에서 어떻게 랜덤을 생성할 수 있을까? 다음 함수를 분석해보자. y = fract(sin(x)*1.0); sin 값은 -1.0과 1.0 사이에서 변동한다. 소수점 뒤를 잘라서 0.0과 1.0 사이의 모든 양수 값으로 만들었다. 이를 사용하면, 사인파를 잘게 쪼개서 랜덤 값을 얻을 수 있다. sin(x)의 뒤에 큰 숫자를 곱하는 것이다. 100000.0만큼 곱하면 더 이상 사인파를 식별할 수 없게 된다. Controlling chaos 랜덤 사용시 주의할 점이 있다. 충분히 무작위적이지 않을 수 있다. 자세히 살펴보면 -1.5707과 1.5707에서 sin() 형태가 보인다. 이 지점은 사인파의 최대값과 최소값이 발생하는 지점이기 때문이다. 또한 분포가 가장자리에 비해.. 2023. 4. 25.
[C++] 챕터 9 - 배열 : 변수를 여러개 모아 놓은 변수 // 9-1 : 배열의 사용 int main() { int kor_scores[5]; kor_scores[0] = 100; kor_scores[1] = 88; kor_scores[2] = 92; kor_scores[3] = 40; kor_scores[4] = 76; return 0; } /* 변수를 몇개 만들어 대괄호 안에 적어준다. */ // 9-2, 3 : 100번째 원소에 접근하기, 원소의 탐색 int main() { int kor_scores[5]; kor_scores[100] = 100; return 0; } /* 접근위반하면 프로그램 갑자기 죽을 수 있다. (잘못된 원소에 접근) 올바른 범위 인덱스 사용은 개발자 책임이다. */ /* --- 9-3 --- 원소 탐색법 알려준다. for문 돌려서.. 2023. 4. 25.
[C++] 챕터 8 - 성적표 프로젝트 Ver 1 // 8-1 : 성적표 Ver 1.0 #include using namespace std; int main() { while (1) // 계속해서 메뉴 보여주기 { // 메뉴 cout > Eng >> Math; // 평균 계산 float Ave = float(Kor + Eng + Math) / 3.0f; // 현재 입력된 학생수에 따라 변수에 값 넣기 if (0 == NumberOfStudent) { // 개인 정보 S1_No = NumberOfStudent + 1; S1_Kor = Kor; S1_Eng = Eng; S1_Math = Math; S1_Ave = Ave; // 전체 평균 TotalAve = S1_Ave; } else if (1 == NumberOfStudent) { // 개인 정보 S2_N.. 2023. 4. 25.
[C++] 챕터 7-2 - 분기와 반복 : 프로그램의 흐름 조절 // 7-23 : while의 사용 #include using namespace std; int main() { int i = 1; int sum = 0; while (i 10) { break; } } cout > n; // 사용자로부터 값을 받는다. } while(10 != n); */ /* 7 - 35 do while 대신 while로만 구현하면 다음과 같다. cin >> n이 두 부분으로, 중복이 생긴다. 코드 수정시 두군데를 수정해야한다는 치명적 문제점이 있다. int n; cin >> n; while(10 != n) { cin >> n; } */ 2023. 4. 25.
[C++] 챕터 7-1 - 분기와 반복 : 프로그램의 흐름 조절 // 7-1, 2, 3 : 간단한 if 사용 if문 사용 기본에 대해 설명한다. // 7-4 : 여러개의 else if 사용 if와 else 사이에 개수 제한 없이 사용 가능하다. // 7-5, 7-6 : if와 else만으로 표현 else if의 원리에 대한 설명이다. else if는 else와 if를 합쳐놓은 기능이다. if와 else 사용 후, else 블록 안에 if하나 더 있는 것이다. // 7-7 : 논리 연산자로 표현 논리 연산자를 사용하면 else if를 대체할 수 있는 경우도 있다. if ( ... && ...)와 같이 말이다. // 7-8 : 들여쓰기 들여쓰기는 코드를 읽기 쉽게 하는 용도다. 프로그램 관점에서는 있든 없든 상관없다. // 7-9, 10, 11, 12 : if와 관련된 .. 2023. 4. 25.
[C++] 챕터 6 - 연산자 : 정보를 가공하는 법 // 6-1 : 사칙연산 int 타입의 +, -, *, /, %에 대해 알아본다. 연산자의 대상이 되는 애들을 피연산자라고 한다. // 6-2 : 대입 연산자 int main() { int a, b, c; a = b = c = 100; return 0; } /* c = 100이 제일 먼저 실행된다. a,b,c 모두 100이 된다. */ // 6-3 : 관계 연산자 #include using namespace std; int main() { int a = 3; int b = 5; bool b1, b2, b3, b4, b5, b6; b1 = a > b; b2 = a >= b; // ... 생략 b6 = a != b; cout 2023. 4. 21.
[GLSL] 9 - Patterns 정규화된 좌표계를 3으로 늘린다. 여기에 fract 함수를 적용한다. 0-1값에서 생성된 실수값, 1-2 값에서 생성된 실수값, 2-3 값에서 생성된 실수값. 3x3 셀을 얻을 수 있다. float circle(in vec2 _st, in float _radius){ vec2 l = _st-vec2(0.5); return 1.-smoothstep(_radius-(_radius*0.01), _radius+(_radius*0.01), dot(l,l)*4.0); } void main() { vec2 st = gl_FragCoord.xy/u_resolution; vec3 color = vec3(0.0); st *= 3.0; // Scale up the space by 3 st = fract(st); // Wra.. 2023. 4. 20.