본문 바로가기

반응형

전체 글

(427)
삼각형의 외접원 구하기 들어가며삼각형의 외접원을 구하는 방법을 인터넷에 검색해 보면 많은  절차적 생성 던전(Procedural dungeon generation)을 만들면서 ...v1 = new Vector3(1.0f, 4.0f, 0.0f); v2 = new Vector3(0.0f, 1.0f, 0.0f); v3 = new Vector3(4.0f, 0.0f, 0.0f);대충 위와 같은 삼각형이 있다고 하고 이 삼각형의 외접원을 구해보도록 한다.삼각형의 외접원의 정의는 삼각형의 각 꼭지점들이 원에 닿아 있다. 먼저 직선 ab의 기울기를 구하자.일단 직선을 이루기 위해서는 두 점이 필요 하다. 이 두 점을 p1, p2라고 하자기울기 m은 x축의 증가 값 분에 y축의 증가 값이라고 정의 된다. 증가 값은 현재 값에서 이전 값을 빼주..
벡터(vector)의 연산 벡터는 두 점들 사이의 차이 또는 변위(displacement)를 나타낸다. 기하학에서의 벡터기하학에서의 벡터(일반적으로 'v' 라고 표현)는 크기(또는 길이)와 방향을 가지는 요소이고 끝이 화살표인 선분으로 표현된다. 길이(or 크기)가 1인 벡터는 '단위' 또는 '정규화된' 벡터라고 한다.'제로 벡터'는 길이가 0이고 방향을 가지지 않는다.벡터는 위치를 가지지 않는다. 위치와 상관 없이 동일한 크기와 방향을 가지는 벡터는 같다.기하학에서 벡터는 '방향'과 '변화', 이 두가지 의미로 사용 될 수 있다. 벡터의 덧셈 뺄셈실수와 마찬가지로 벡터도 산술 연산이 가능하다. 벡터의 덧셈은 두 벡터를 결합하여 새로운 벡터를 만든다. 벡터의 덧셈의 대수학적 법칙은 실수의 덧셈과 유사하다.v + w = w + v ..
단위 벡터(Unit Vector) 단위 벡터(Unit Vector)란?단위 벡터는 크기(길이)가 1인 벡터를 의미한다. 주로 벡터의 방향을 나타내는데 사용되며, 벡터의 정규화(normalization)를 통해 얻을 수 있다.단위 벡터는 원래의 벡터 방향을 유지하면서 길이를 1로 조정한 벡터단위 벡터의 특징크기(길이) : 단위 벡터의 크기는 항상 1이다.방향 : 단위 벡터는 원래 벡터와 같은 방향을 가지며, 벡터의 방향만을 나타낸다.표기법 : 일반적으로 단위 벡터는 아래 처럼 모자(^)를 씌워 표현하거나 ei형태로 나타낸다.단위 벡터의 예2차원 : i = (1, 0), j = (0, 1)3차원 : i = (1, 0, 0), j = (0, 1, 0), k = (0, 0, 1)단위 벡터를 구하는 방법(정규화)일반 벡터에서 단위 벡터를 구하는 ..
A* 길찾기 알고리즘 들어가며로그라이크의 근본은 누가 뭐래도 작은 타일들로 이루어진 복잡한 미로 속에서 몬스터와 싸워나가며 결국엔 던전을 클리어하고 보물을 얻는것이라 생각한다. 그런데 던전에서 캐릭터와 몬스터들이 이동하는 것을 보니 한 가지 궁금한것이 생긴다. 복잡한 미로 속에서 캐릭터는 어떻게 유저가 이동하라는 곳으로 자연스럽게 이동하는 것일까? 몬스터는 어떻게 장애물들을 피해 플레이어를 공격해 올 수 있는 것일까?이번 포스트 이런 물음에 답을 주기 위해 게임을 만드는데 필수 요소 중의 하나인 길 찾기(path finding) 알고리즘에 대해 살펴 보도록 하겠다.다익스트라 vs A*알고리즘을 조금이라도 공부해본 사람이라면 길 찾기 알고리즘이라고 하면 가장 먼저 다익스트라 알고리즘을 떠올릴 것이다. 다익스트라 알고리즘은 '한..
[C++] 스레드 동기화 - lock_guard 들어가며 이전 포스트 '스레드 동기화 - mutex'에서는 C++ 표준 라이브러리에서 제공하는 std::mutex 객체의 lock, unlock 함수를 직접 호출하여 크리티컬 섹션에 진입할 수 있는 스레드를 직접 컨트롤 했었다. 하지만 이런 방법은 앞으로 살펴 볼 '실수'를 유발할 수 있고, 이 실수들은 데드락을 발생 시켜 프로그램을 영원히 블록 시킬수 있다. 이번 포스트에서는 std::mutex의 멤버 함수를 직접 호출할 때 야기할 수 있는 '실수'들을 살펴 보고, std::lock_guard를 사용했을 때의 이점에 대해 살펴 보도록 하겠다. std::mutex의 문제 위에서 std::mutex의 lock과 unlock 멤버 함수를 직접 호출하는 경우 프로그래머의 '실수'로 인해 프로그램이 데드락 상태..
[C++] 스레드 동기화 - mutex 들어가며 이번 포스트는 C++에서 스레드간 동기화를 위해 제공하는 std::mutex에 대해 자세히 알아 보도록 하겠다. 본 포스트에서는 mutex가 무엇인지 크리티컬 섹션이 무엇인지 같은 교과서적인 기본 내용을 다루기 보다는 C++에서 제공하는 std::mutex 의 특징과 사용법에 대해 집중하도록 한다. 스레드 동기화에 대한 원론적인 개념에 대해 궁금하신 분들은 Operating System Concepts 같은 전통적인 컴퓨터 공학 전공 서적을 살펴 보시거나 간단 하게는 나무위키의 뮤텍스 항목을 살펴 보는 것도 도움이 될 것이다. C++ 표준이 제공하는 mutex 종류 C++ 표준 라이브러리에서는 아래와 같이 총 6가지의 뮤텍스를 제공하고 있다. std::mutex(C++11) std::timed_..
[Rust] Hello World 들어가며 이번 포스트에서는 전통적인 프로그래밍의 시작점인 'Hello World'를 출력하는 프로그램을 러스트로 작성해 보며 러스트의 기본 요소들을 살펴 보도록 하겠다. hello.rs 러스트 소스 파일의 확장자는 .rs 다. 에디터를 열어 아래와 같이 'hello.rs' 소스 파일을 작성해 보자. 소스 코드를 작성하기 위해서는 간단한 메모장 프로그램을 이용해도 상관 없지만 필자의 경우는 여러 에디팅 기능이 지원되는 Visual Studio Code를 즐겨 이용한다. Visual Studio Code와 러스트의 연동 방법은 [여기]를 참고하자. // hello.rs fn main() { println!("Hello World"); } 위와 같이 작성이 끝난후 컴파일과 실행을 해보기 위해서는 [Rust] ..
FoV - 쉐도우 캐스팅(Shadow Casting) 들어가며 로그라이크 게임의 핵심 요소 중에는 FoV라는 것이 있다. FoV란, 'Field of View' 또는 'Field of Vision'의 약자로써, 아래 이미지 처럼 플레이가 던전과 같은 필드의 특정 위치에서 볼 수 있는 오브젝트와 가려지는 오브젝트를 구분하여 디스플레이하는 기능을 말한다. FoV를 구현하기 위해 간단하게 사용되는 방법으로는 '라이트 트레이싱(Light tracing)'이 있다. 라이트 트레이싱이란 시작점 - 일반적으로 플레이어 캐릭터 - 에서 바깥 쪽으로 가상의 빛을 쏘아 장애물에 의해 막히는 맵 셀을 탐지하는 방법이다. 라이트 트레이싱은 간단히 구현할 수 있다는 장점이 있는 반면, 아래 이미지 처럼 같은 셀에 대해 여러번 같은 연산을 수행하게 되어 CPU의 낭비가 발생한다는 ..

반응형