게임 수학 - 산술

정선호·2023년 5월 2일
0

게임 수학

목록 보기
1/6

관련 강좌

01_01_Addition & Subtraction

  • 일반적인 산술과 다르게 컴퓨터의 숫자들은 형식에 따른 최대/최솟값이 정해져 있다. 따라서 게임 엔진에서의 덧셈과 뺄셈에서 오버플로우/언더플로우를 주의해야 한다.
  • 덧셈은 더할 수의 위치를 바꿔도 결과값이 변하지 않지만 뺄셈은 뺄 수의 위치를 바꾸면 결과값이 달라진다.

01_02_Rounding

  • 반올림은 최종 데미지 계산 등과 같은 많은 부분에서 사용되지만, 반올림으로 인해 원하지 않는 값이 나올 수 있다.
  • 통상적으로 반올림은 반올림 할 자릿수의 다음 수를 보고 5보다 크거나 같으면 올림, 아니면 내림을 실행한다.
  • 2.73을 -2의 자리에서 반올림하면 2.7이 되고, 2.7을 -1의 자리에서 반올림하면 3이 된다. 그리고 9.99를 -2의 자리에서 반올림하면 10이 아닌 10.0이 된다.

게임 속의 반올림

  • 매우 약한 몬스터가 플레이어를 공격할 때 0.62정도의 데미지를 준다고 가정하면 항상 버림을 적용해 데미지를 0으로 만들거나, 항상 올림을 적용해 데미지를 1로 만들 수 있다. 이는 약한 몬스터가 플레이어를 죽일 수 없나 있나의 차이를 만들어 낸다.
  • 반올림은 항상 모든 계산이 끝난 후에 해야한다. 오차를 일으키고 계산 파워를 많이 잡아먹는다.
  • C#에서는 Math.Round(x, p), Math.Floor(x, p), Math.Ceil(x, p)로 실수 x를 p의 자리에 맞춰 각각 반올림, 내림, 올림을 할 수 있다.

01_03_Multiplication & Number Blocks

  • 게임 내에서 곱셈은 정말 많은 곳에 사용된다.
  • 덧셈과 뺄셈이 선 위에서 이루어진 연산이었다면, 곱셈은 면에서 이루어지는 연산이다.
  • 이차원 숫자 좌표상에서 가로세로 크기 1인 블록을 기준으로 곱셈을 계산할 수 있다.
  • 오른쪽 위, 왼쪽 아래는 +, 나머지 부분은 -이다. 즉 두 수의 부호가 같으면 +, 다르면 - 결과값이 나온다는 뜻이다.

01_04_Division

  • 곱셈으로 쌓아올린 블록들을 나누는 것으로 나누기를 표현할 수 있다.
  • (2/8) / (1) = (2/8) / (2/2) = (2/2) / (8/2) = 1/4 = 2/8
  • 나눗셈 또한 곱셈과 마찬가지로 두 수의 부호가 같으면 +, 다르면 -값이 나온다.

사칙연산 노트

  • 덧셈와 곱셈은 두 수의 순서에 구애받지 않는다.
  • 뺄셈은 순서가 바뀌면 결과값의 부호가 바뀐다.
  • 나눗셈은 순서가 바뀌면 결과값의 크기가 바뀐다.
  • 어떠한 수든 0으로 나누면 안된다.
  • 나눗셈은 대체로 곱하기보다 연산 속도가 느리다.
  • 컴퓨터 계산 내에서 덧셈, 뺄셈, 곱셈은 숫자의 범위를 초과할 가능성이 있다.
  • 컴퓨터 계산 내에서 뺄셈과 나눗셈은 숫자의 정확성을 낮출 가능성이 있다.

01_05_Remainders

  • 5를 2로 나누면 2와 나머지 1이 남는다. 즉 어떠한 수를 무언가로 나누었을 때 나누어 떨어지지 않고 남는 자투리 수를 나머지라고 한다.
  • 이러한 나머지의 정의는 짝수와 홀수를 정의 및 판별하는 데에도 사용된다. 어떠한 수를 2로 나누었을 때 나머지가 있으면 홀수, 없으면 짝수이다.

게임에서의 나머지 계산

  • 나머지의 원리를 이용해 멀티플레이에서의 여러 계산을 수행할 수 있다.
  • 예를 들어 한 명이 한 턴당 30초가 주어지는 2인용 게임에 84초가 지났을 때, 3번째 턴까지 6초가 남았다는 사실 등을 알 수 있다.
  • 코드상에서는 %기호를 사용해 나머지를 구할 수 있고, 해당 기호는 사칙연산과 동일하게 사용할 수 있다.

01_06_BODMAS

  • 컴퓨터 내 연산의 규칙이다.
  • BODMAS 혹은 PEMDAS로 축약되어 말한다.
    • Brackets, Parentheses : 괄호 우선
    • Orders, Exponents : 지수(제곱, 제곱근 등)
    • Multiplication : 곱셈
    • Division : 나눗셈
    • Addition : 덧셈
    • Substraction : 뺄셈
    • 순으로 계산한다.

01_07_Squaring, Cubing & Powers

  • 2 + 2 + 2를 2 3으로 축약할 수 있듯이 2 2 * 2를 2 ^ 3으로 축약할 수 있다. 이를 거듭제곱(power)이라 한다.
  • 제곱을 Square, 세제곱을 Cube라 한다.
  • 여러 프로그래밍 언어에서는 제곱을 수행해주는 함수가 존재한다.

01_09_Squaring Decimals

  • 제곱 또한 곱셈처럼 좌표상의 블록 개수로 계산할 수 있다.
  • 2.5의 제곱만큼의 블록을 보면 온전한 블록 4개, 0.5짜리 블록 4개, 0.25짜리 블록 1개가 그려진다.
  • 이와 마찬가지로 3.5의 제곱만큼의 블록을 보면 온전한 블록 9개, 0.5짜리 블록 6개, 0.25짜리 블록 1개가 그려진다.

01_10_Reversing Powers

  • 거듭제곱을 거꾸로 하는 것은 해를 미지수로 지정하는 것 부터 시작이다.
  • 어떠한 수의 세제곱이 4096일 때 이를 x ^ 3 = 4096으로 표현할 수 있다.
  • (a ^ b) ^ c는 a ^ (b * c)와 동일하므로 위의 식을 (x ^ 3) ^ (1 / 3) = 4096 ^ (1 / 3)이라 할 수 있다.
  • 따라서 x = 4096 ^ (1 / 3)이다.

01_11_Charts & Graphs 101

  • 그래프들은 어떠한 수치를 적용하기 이전에 청사진을 그리거나, 어떠한 데이터들을 정리하는 데에 탁월한 효능을 보인다.
  • x축과 y축을 그린 후 각각의 축에 어떠한 데이터가 들어가는지 정하여 그래프를 정의할 수 있다.
  • 각각의 축에 데이터 이름 / 데이터의 도량기준으로 기준을 잡는다. ex) 속도 = speed/ms^-1, 시간 = time/s
  • 도량기준을 같이 표시하는 이유는 타인에게 혼동을 주지 않기 위해서이다.
  • 다음은 x축의 변화에 따른 y축의 변화값을 점의 연속으로 표현하면 된다.
  • 해당 축에서 표현할 수 있는 최소-최대 길이를 데이터 값에 따라 유연하게 조정해 그래프의 선이 가시적으로 잘 보이게끔 조정한다.

01_12_Area Under Chart 101

  • x축값 50, y축값 30이 고정적으로 0부터 유지되었을 때 이로 인해 생긴 직사각형 유닛의 크기는 1500이다.
  • 만일 위의 유닛에서 x축이 시간(s)이고 y축이 속력(m/s)이면 유닛의 단위는 s * (m/s)이므로 미터가 되고, 유닛은 어떠한 물체가 일정 시간만큼 일정한 속력으로 나아갔다는 것을 의미하므로 거리가 된다.
  • x축값과 따라서 y축값이 달라지는 그래프의 경우에는 유닛의 x축을 일정 단위로 쪼갠 다음 따로따로 크기를 구한 것을 합하여 최종 유닛의 크기를 구한다. 이를 적분이라 한다.

01_13_Measuring Gradient 101

  • 그래프의 기울기는 기본적으로 x축값의 변화에 따른 y축값의 변화이다. 즉 Δy / Δx라 할 수 있다.
  • 직선 그래프의 기울기는 직관적으로 계산하여 구할 수 있다.
  • 곡선 그래프의 기울기는 그 곡선을 잘게 쪼개 직선이 되었다는 가정을 하여 해당 위치에서의 기울기를 구하는 방식을 쓴다.

01_14_Distance, Speed & Time

  • 거리 = 속력 * 시간이다.
  • 속도-시간 그래프에서 유닛의 넓이는 총 거리, 선의 기울기는 가속도이다.

01_15_Rates Of Change

01_16_The Magic of e

  • 자연상수 e는 x축이 a, y축이 e^a인 그래프에서 어떠한 a가 와도 기울기가 항상 e^a인 상수이다.
  • 자연상수는 2.718...로 시작되는 무한소수이다.
  • 상세 내용

01_17_Logarithms 101

01_18_Logarithms - Changing Base

  • log_b(a) = log_x(a) / log_x(b)와 같다. ex) log_2(32) = log_10(32) / log_10(2)
  • C#의 Mathf.Log함수는 두 가지 종류가 있는데, Mathf.Log(x)는 ln(x)이고, Mathf.log(x, b)는 log_b(x)이다.

01_19_Factorials & Permutations

  • 팩토리얼은 양수 n을 1이 될 때까지 계속 곱한 결과값이다. 즉 n! = n (n-1) (n-2) ... 2 * 1이다.
  • 0!는 1이고 음수는 팩토리얼을 할 수 없다. 2.3!과 같이 유리수에 대한 팩토리얼도 가능하다.
  • 팩토리얼이 가장 많이 사용되는 곳은 경우의 수 구하기이다. 예를 들어 다섯 개의 책을 한 책장에 순서대로 꽂아놓을 수 있는 경우의 수는 5!이 된다. 첫 번째 위치에 넣을 수 있는 책의 개수는 5개, 두 번째 위치에는 4개, 세 번째 위치에는 3개처럼 팩토리얼 식으로 구할 수 있다.

01_20_Number Bases

  • 십진수 93은 10 9 + 1 3인 수이다. 십진수는 자릿수가 한 칸 왼쪽으로 갈 때마다 10이 곱해지는 숫자 표기법이다.
  • 이진수 101은 4 1 + 2 0 + 1 * 1인 수이다. 이진수는 자릿수가 한 칸 왼쪽으로 갈 때마다 2가 곱해지는 숫자 표기법이다.
  • 십진수 n을 2로 계속 나누어 나온 나머지를 거꾸로 작성하면 2진수로 n이 표기가 된다. 예시로 91은 1011011(2)로 표기가 된다. 이는 단순이 2진수 뿐만 아니라 모든 진수에서도 통용된다.

01_21_Scientific Notation

  • 경, 해의 단위같이 매우 큰 숫자들은 단순 표기로는 너무 길어진다.
  • 16,000,000,000과 같은 숫자들을 1.6 * (10 ^ 10)으로 표기할 수 있다. 이러한 표기법을 대수표기법이라 한다.
  • 0.0024 = 2.4 * (10 ^ -3)처럼 소수에 관한 표기에도 사용할 수 있다.
  • 컴퓨터에서 대수표기법을 사용할 때에는 (10 n)을 단순하게 En으로 줄려 사용한다. 위의 0.0024의 경우에는 2.4 E-3이 된다.
  • 대수표기법의 덧셈 혹은 뺄셈을 할 때에는 두 수의 자릿수를 둘 중에 더 큰 수로 맞춘 후 계산한다. 예시로 1.4 E5 + 2.3 E4 = (1.4 + 0.23) * E5가 된다.
  • 대수표기법의 곱셈을 할 때에는 밑을 곱하고 지수의 승수를 더해서 계산한다. 예시로 (1.4 E5) (2.3 E4) = (1.4 2.3) * (E(5 + 4))이다.
  • 대수표기법의 나눗셈을 할 때에는 밑을 나누고 지수의 승수를 빼서 계산한다. 예시로 (6.3 E2) / (2.1 E5) = (6.3 / 2.1) * (E(2 - 5))이다.
profile
학습한 내용을 빠르게 다시 찾기 위한 저장소

0개의 댓글