분류 전체보기 188

ECS (Entity Component System)

ECS 정의 "A different paradigm of writing code, where we model our programs in a data oriented way" 유니티 ECS 메뉴얼에서는 ECS를 위와 같이 정의했다. 데이터 지향 설계방식은 아래 글을 참고. https://tsyang.tistory.com/68 Data-oriented Design (데이터 지향 설계, DoD) CppCon 2014 - Mike Acton의 "Data-Oriented Design and C++"을 주로 참고해서 씀. https://www.youtube.com/watch?v=rX0ItVEVjHc 인트로 1. 소프트웨어는 플랫폼이다. 2. 코드는 실제 세계의 모델을 중심으로 설.. tsyang.tistory.c..

이론/설계 2021.09.26

Data-oriented Design (데이터 지향 설계, DoD)

CppCon 2014 - Mike Acton의 "Data-Oriented Design and C++"을 주로 참고해서 씀. https://www.youtube.com/watch?v=rX0ItVEVjHc 인트로 1. 소프트웨어는 플랫폼이다. 2. 코드는 실제 세계의 모델을 중심으로 설계되어야 한다. 3. 코드는 데이터보다 중요하다. 저 위의 3가지 명제를 보면 그럴 듯 하다. 특히 2번의 경우에는, 게임 클라 개발자로써 많이 의식하는 명제인 것 같다. 누가 저렇게 하라고 시키지는 않았지만 많은 예제코드에서 저런 식으로 코드를 짜니까. (ex. 몬스터 클래스가 있고 그 안에 transform, status, animation... 등을 포함) 강연자인 Mike Acton은 저 위의 3가지 명제를 거짓말이라고..

이론/설계 2021.09.19

2차원에서 방향 판단하기 (CCW)

문제 위와 같이 2차원 평면에 벡터 $\overrightarrow{AB}$가 있다. 점 C는 왼쪽방향 혹은 반시계방향(CCW)이고 점 D는 오른쪽방향 혹은 시계방향(CW)라고 할 수 있다. 이때 점C와 점D가 CW인지 CCW인지를 어떻게 판별할 수 있을까? 벡터의 외적으로 알아내기 두 3차원 벡터 $\overrightarrow{a}$와 $\overrightarrow{b}$가 있다. 이때 두 벡터의 외적은 다음과 같이 정의할 수 있다. $\overrightarrow{a}\times\overrightarrow{b} = \hat{n}\vert\overrightarrow{a}\vert \vert\overrightarrow{b}\vert\sin\theta$ $\theta$는 두 벡터의 각도이며 $\hat{n}$은..

알고리즘/일반 2021.09.12

한 점과 가장 가까운 곡선 위의 점 구하기

※ 매개변수로 표현할 수 있는 곡선 (ex. 베지에 곡선)의 경우만 다룸. 관련 글 : 2021.07.11 - [이론] - 곡선(Curve) & 스플라인(Spline) 곡선(Curve) & 스플라인(Spline) 곡선 곡선을 표현하기에 앞서, 두 정점 (A, B) 사이에 있는 점 P를 다음과 같이 표현할 수 있다. 또한 곡선은 t에 대한 방정식(P(t))으로 표현할 수 있다. 베지에 곡선(Bézier Curves) n차 베지에 곡선은 n tsyang.tistory.com 문제 Q ) t에대한 다항식으로 이뤄져 있는 곡선 $q(t)$ 와 곡선 밖의 점 $P$가 있다. 이때 점 $P$와 가장 가까운 곡선 $q(t)$ 위의 점 $X$는 어떻게 구할 수 있을까? 곡선 $q(t)$를 2차원상의 3차 베지에 곡선이..

수학/이론 2021.09.04

다항식의 근 구하기

루트격리(root isolation) 루트 격리는 근이 여러 개인 다항식에서 정해진 개수의 근이 존재하는 구간을 구하는 것이다. (주로 근이 1개인 구간을 구한다.) 이를 이용해서 근 구하기 알고리즘 등을 사용한다. 1. 스트룸 정리 아래에 있는 데카르트 부호 법칙에 기반한 방법이나, 빈센트 정리에 기반한 방법보다는 느리고 덜 효율적이다. 중근을 한 개로 간주한다는 특징이 있어 덜 효율적이지만 꽤 쓰이는 듯. https://tsyang.tistory.com/62 스트룸 정리 (Strum's theorem) 루트 격리 (root isolation) 위 다항식의 실수 근을 구하는 알고리즘을 짜려면 어떻게 해야할까? 뉴턴 방법이나 이분 매칭 등을 써서 그 값을 구할 수 있지만 위와 같이 실근이 2개 이상인 경..

수학/이론 2021.08.29

스트룸 체인(Strum Chain) 구현

2021.08.13 - [수학] - 스트룸 정리 (Strum's theorem) 스트룸 정리 (Strum's theorem) 루트 격리 (root isolation) 위 다항식의 실수 근을 구하는 알고리즘을 짜려면 어떻게 해야할까? 뉴턴 방법이나 이분 매칭 등을 써서 그 값을 구할 수 있지만 위와 같이 실근이 2개 이상인 경우 모든 tsyang.tistory.com 목표 : 스트룸 정리를 이용하여 다항식의 해 찾기. 다항식 클래스 우선 다항식을 표현할 방법이 필요하여 Polynomial 클래스를 만들었다. Polynomial 클래스는 $a_0x^0 + a_1x^1+a_2x^2+ ... + a_nx^n$ 으로 표현되는 다항식의 각 계수 $(a_0, a_1, ... , a_n)$를 저장한다. 스트룸 정리에 ..

수학/구현 2021.08.22

스트룸 정리 (Strum's theorem)

루트 격리 (root isolation) 위 다항식의 실수 근을 구하는 알고리즘을 짜려면 어떻게 해야할까? 뉴턴 방법이나 이분 매칭 등을 써서 그 값을 구할 수 있지만 위와 같이 실근이 2개 이상인 경우 모든 실근을 구하는 방법은 꽤 고민이 된다. 그런데 이때, 만약 위 방정식의 실근이 구간 [-1.5, -1.0] , [-0.5, 0], [1.0, 1.5] 에 하나씩 있다는 정보가 주어진다면? 각 구간에 이분 매칭 혹은 뉴턴 방법을 사용한다면 매우 쉽게 모든 실근을 구할 수 있을 것이다. 이렇게 루트가 하나만 있는 구간을 구하는 것을 루트 격리(root isolation)라고 한다. 루트 격리는 여러 방법이 있는데 그 중 하나가 스트룸 정리이다. 스트룸 정리(Strum's theorem) 스트룸 정리 (..

수학/이론 2021.08.13

Game AI - Steering Behaviors (2)

2021.06.19 - [Game AI] - Game AI - Steering Behaviors (1) Align Align은 타겟과 방향을 맞추는 동작이다. 타겟의 속도나 위치와는 관계가 없다. Align을 구현할 때 주의할 점은 회전 방향을 정하는 것인데 이것은 타겟과의 방향 차이를 (-180, +180)도로 매핑하면 된다. protected override SteeringOutput GetSteer() { var result = new SteeringOutput(); var rotation = _target.Orientation - Character.Orientation; rotation = MapToRange(rotation); //회전각도를 [-180,180] 사이로 매핑 var rotation..

Game AI 2021.08.07

Cpp 함수 (C++11 lambda, std::function)

C++11에 추가된 람다와 function wrapper는 Cpp에서도 함수형 프로그래밍이 어느정도 가능하게 해줬다. (그럼에도 Cpp는 기본적으로 객체지향 프로그래밍 + performance에 최적화 되어있다고 보아야 한다. + DOP를 더한 정도?) 아무튼 함수를 object/variable 처럼 다루기 편해짐. Function Object 함수형 프로그래밍의 시작은 함수를 변수처럼 다룰 수 있어야 한다는 것이다. 기존(C++11이전의) Cpp에서는 함수 오브젝트를 사용했는데 대충 다음과 같다. #include using namespace std; class Plus { public: explicit Plus(int val) : local_val_{val} {} int operator() (int x..

언어/C++ 2021.07.31

Cpp - 상속#2

2021.07.18 - [언어/C++] - Cpp - 상속#1 Cpp - 상속#1 기본적인 내용은 안 씀. 상속 상속은 왜 쓸까? 클래스 간의 관계 : 동물 -> 고양이 사람.. 코드 재사용 : 동물은 잠을 자.. 그럼 고양이 사람도 다 잠을 자 일관적인 클래스 인터페이스 (class interface tsyang.tistory.com Object Slicing 오브젝트 슬라이싱은 Cpp 상속에서 발생하는 문제이다. using namespace std; class Animal { public : void virtual Speak() { cout

언어/C++ 2021.07.22