728x90
반응형

소프트웨어 공부 75

회전 행렬 유도

회전행렬(Rotation matrix)은 좌표의 회전이 필요할 때 자주 사용된다. 한 번 유도를 해보면 시계 방향 회전이나 반시계 방향 회전에 대해 이해하는 것도 어렵지 않다. 그래서 그냥 무심코 사용하는 것보다 원리를 이해는 것이 중요하다. (x', y')는 중심 c를 기준으로 r만큼 떨어진(x, y)를 θ만큼 회전시킨 좌표다. 각 좌표는 삼각함수를 이용하여 표현할 수 있다. 같은 방법으로 (x', y')를 나타내면, 가 된다. 이를 삼각함수 합 법칙을 적용하면 가 된다. 여기에 (x, y)를 대입하면 다음과 같다. 이 식을 행렬로 바꾸면 다음과 같이 표현할 수 있다. 반시계 방향으로 회전하려면 각을 빼면 된다.

중심 정렬, 2point alignment

기판의 치수 변형으로 인해 발생하는 정렬 오차를 최소화하기 위해 이를 고려한 정렬 방법이 필요하다. 중심 정렬(center alignment)은 가장 널리 사용되는 알고리즘 중 하나다. 2 point alignment 두 마크를 잇는 직선의 중심을 각각 p, q라고 하면 다음과 같이 정의할 수 있다. 정의된 중심점이 일치되도록 정렬해야 한다. p, q를 중심으로 회전할 수 있다면 간단히 계산할 수 있지만 회전은 회전 중심으로 회전하기 때문에 회전 후에 위치 이송량 dx, dy를 구해야 한다. 물론 두 직선의 각도를 구한 후 차를 구해도 된다. 회전 행렬을 이용하여 사이 각 만큼 회전을 하면 다음과 같은 모양이 된다. q' 는 다음과 같이 계산할 수 있다. 회전된 중심 q'과 기준 중심 p의 차이를 이용하..

[NSIS] 환경변수 등록

NSIS로 라이브러리를 배포하게 될 경우에는 DLL의 경우 system32나 해당 응용프로그램과 같은 폴더에 존재해야 한다. 그렇지 않으면 직접 환경 변수를 설정해야 하는데, 이는 매우 귀찮은 일이 된다. nsis로 인스톨 프로그램을 제작하면 인스톨 시에 환경 변수를 등록할 수 있다. dll이 포함된 디렉터리를 환경 변수 path에 등록해 보자. Windows 버전에 따라 레지스터리 위치가 상이하지만 win 10 기준으로는 아래와 같다. SYSTEM\CurrentControlSet\Control\Session Manager\Environment 해당 레지스터에서 등록된 환경 변수 값을 읽어와 추가하고 싶은 디렉터리를 붙여서 다시 쓴다. Section -Post ReadRegStr $0 HKLM "SYST..

[NSIS] VSCode 에서 NSIS 설정하기

우선 VSCode와 NSIS를 설치해야 한다. 그리고 NSIS에 해당 확장팩을 설치한다. NSIS만 깔면 될 것 같지만 이래저래 깔아 두었다. 그리고 NSIS 파일인 *.nsi 파일을 열면 우상단에 컨트롤할 수 있는 버튼들이 생긴다. 두 번개 표시는 컴파일이며, 채우진 번개는 저장 후 컴파일이다. 이 기능을 사용하려면 makensisw.exe의 위치를 설정해줘야 한다. 설정하지 않으면 아래와 같이 나온다. 그런데 경로를 설정하다보면 폴더만 설정해도 되도록 되어 있어 문제가 발생한다. 이런 에러 메세지가 뜨면 우상단에 있는 톱니바퀴 마크를 클릭해 설정으로 이동한다. (에러 창의 톱니바퀴 아님) 이렇게 되어 있다면, 에러가 난다. 파일 경로까지 확실히 적어두자. 이제 컴파일을 실행하면, 아래와 같이 make..

[VSCode] 한글 깨짐

VSCode를 사용하다 보면 한글 파일이 깨져 나오는 경우가 있다. 이를 위해서 인코딩 설정을 변경해줘야 한다. 파일/기본 설정/설정으로 들어간 뒤, 텍스트 편집기의 'Auto Guess Encoding'을 체크하면 된다. 혹시 글꼴이 표현되지 않는다면, 한글 글꼴을 추가해 보는 것도 방법이다. 굴림체를 추가했다. 더 예쁜 폰트가 있으면 좋을 텐데, 마땅한 것이 맑은 고딕뿐이다. 한글이 잘 표현됨을 알 수 있다.

싱글턴 패턴(Singleton Pattern)

싱글턴 패턴은 해당 클래스의 인스턴스가 하나만 만들어지고, 어디서든지 그 인스턴스에 접근할 수 있도록 하기 위한 패턴이다. 싱글턴 패턴은 클래스에서 자신의 단 하나뿐인 인스턴스를 관리하도록 만들면 된다. 그리고 다른 어떤 클래스에서도 자신의 인스턴스를 추가로 만들지 못하도록 해야 한다. 인스턴스가 필요하면 반드시 클래스 자신을 거치하도록 해야 한다. 그리고 어디서든 그 인스턴스에 접근할 수 있도록 만들어야 한다. 다른 객체에서 이 인스턴스가 필요하면 언제든지 클래스한테 요청을 할 수 있게 만들고, 요청이 들어오면 그 하나뿐인 인스턴스를 건네주도록 만들어야 한다. class Singleton { public: Singleton() = default; virtual ~Singleton() {} static ..

팩토리 패턴(Factory Pattern)

간단한 팩토리(Simple Factory)는 디자인 패턴이라고 할 수는 없다. 프로그래밍을 하는 데 있어서 자주 쓰이는 관용구에 가깝다고 할 수 있다. 단지 워낙 자주 쓰이기 때문에 패턴이라고 표현하기도 한다. 모든 팩토리 패턴에서는 객체 생성을 캡슐화한다. 팩토리 메서드 패턴(Factory Method Pattern)에서는 서브클래스에서 어떤 클래스를 만들지를 결정하게 함으로써 객체 생성을 캡슐화한다. 팩토리 메서드 패턴에서는 객체를 생성하기 위한 인터페이스를 정의하는데, 어떤 클래스의 인스턴스를 만들지는 서브클래스에서 결정하게 만든다. 팩토리 메서드 패턴을 이용하면 클래스의 인스턴스를 만드는 일을 서브클래스에 맡기는 것이다. 위의 클래스 다이어그램을 보면, Creator 추상 클래스에서 객체를 만들기..

데코레이터 패턴(Decorator Pattern)

OCP(Open-Closed Principle) 기존 코드는 건드리지 않은 채로 확장을 통해서 새로운 행동을 간단하게 추가할 수 있도록 한다. 이것을 달성하면 새로운 기능을 추가하는 데 있어서 매우 유연해서 급변하는 주변 환경에 잘 적응할 수 있으면서도 강하고 튼튼한 디자인을 만들 수 있다. 코드에서 확장해야 할 부분을 선택할 때는 세심한 주의를 기울여야 한다. 무조건 OCP를 적용하는 것은 시간 낭비가 될 수도 있고, 괜히 쓸 데 없는 일을 하는 것일 수도 있다. 결과적으로 불필요하게 복잡하고 이해하기 힘든 코드만 만들게 되는 부작용이 있을 수도 있으니 주의해야 한다. 데코레이터 패턴(Decorator Pattern)에서는 객체에 추가적인 요건을 동적으로 첨가한다. 데코레이터는 서브클래스를 만드는 것을..

옵저버 패턴(Observer Pattern)

옵저버 패턴(Observer Pattern)에서는 한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체들한테 연락이 가고 자동으로 내용이 갱신되는 방식으로 일대다(one-to-many) 의존성을 정의한다. 일대다 관계는 주제와 옵저버에 의해 정의된다. 옵저버는 주제에 의존한다. 주제의 상태가 바뀌면 옵저버한테 연락이 간다. 연락 방법에 따라 옵저버에 있는 값이 새로운 값으로 갱신될 수도 있다. 옵저버 패턴을 구현하는 방법에는 여러 가지가 있지만, 대부분 주체(Subject) 인터페이스와 옵저버(Observer) 인터페이스가 들어있는 클래스 디자인을 바탕으로 한다. 느슨한 결합(Loose Coupling)의 위력 두 객체가 느슨하게 결합되어 있다는 것은, 그 둘이 상호작용을 하긴 하지만 서로에 대해 서로..

스트래티지 패턴(Strategy Pattern)

스트래티지 패턴(Starategy Pattern)에서는 알고리즘 군을 정의하고 각각을 캡슐화하여 교환해서 사용할 수 있도록 만든다. 스트래티지 패턴을 활용하면 알고리즘을 사용하는 클라이언트와는 독립적으로 알고리즘을 변경할 수 있다. 오리들은 모두 CDuck을 확장해서 만들고, 나는 행동은 모두 CFlyBehavior를, 꽥꽥 소리를 내는 행동은 CQuackBehavior를 구현해서 만든다. 오리의 행동들을 일련의 행동으로 생각하는 대신, 알고리즘 군으로 생각한다면 똑같은 테크닉으로 다른 방법을 구현할 수 있다. 각 다이어그램을 구현해 보자. ////////////////////////////////////////////////////////////////////////////////////////////..

[자료구조] 데이크스트라 알고리즘

최단 경로 문제를 푸는 알고리즘 중에 하나인 데이크스트라의 알고리즘은 에드거 데이크스트라가 만들었다. 데이크스트라 알고리즘 규칙은 다음과 같다. 시작 정점을 현재 정점으로 한다. 현재 정점에 인접한 모든 정점을 확인해서 시작 정점으로부터 알려진 모든 위치까지의 가중치를 계산하고 기록한다. 다음 현재 정점을 결정하려면 시작 정점으로부터 도달할 수 있는 방문하지 않은 가장 저렴한 알려진 정점을 찾는다. 그래프 내 모든 정점을 방문할 때까지 1~3단계를 반복한다. 애틀랜타부터 다른 도시까지의 가장 저렴한 경로를 찾아보자. 시작 정점은 아틀랜타가 된다. 다음으로 인접한 정점을 모두 확인해서 가중치를 기록한다. Atlanta Boston Chicago Denver El Paso $100 ? $160 ? 현재로서는..

[자료구조] 가중 그래프

가중 그래프는 일반적인 그래프와 비슷하지만 그래프 간선에 추가적인 정보를 포함한다. 위 그래프의 간선에는 간선이 연결하는 도시 간 항공료가 표시되어 있다. 그래프에 가중치를 추가하려면 배열 대신 해시 테이블을 사용해야 한다. 클래스로 간단하게 표현해 보자. #include #include #include #include using namespace std; class CCity { public: CCity(string _name) : name(_name) {} void add_route(CCity* city, int _price) { price.insert(pair(city, _price)); } int get_price(CCity* city) { auto p = price.find(city); retu..

[자료구조] 그래프

그래프는 데이터가 어떻게 연결되는지 쉽게 이해시키므로 관계에 특화된 자료구조다. 한 사람은 한 노드로, 사람 간 관계는 각 선으로 표현한다. 그래프 용어로 각 노드를 정점이라 부르고, 각 선은 간선이라 한다. 간선으로 연결된 정점들은 서로 인접한다고 말한다. 그래프를 구현하는 방법은 많지만 가장 간단한 방법 중 하나는 해시 테이블을 사용하는 것이다. 해시 테이블의 모든 키 값은 한 단계로 찾을 수 있으므로 그래프를 쓰면 앨리스의 친구를 O(1)에 찾을 수 있다. SNS의 팔로우를 본다면 관계가 상호적이지 않다. 앨리스는 밥을 팔로우할 수 있지만, 밥이 반드시 앨리스를 팔로우하지는 않는다. 화살표의 방향은 관계의 방향을 나타낸다. 위 둘 예제는 서로 비슷하지만 각각 관계의 본질이 다르다. 관계의 방향성을 ..

[자료구조] 이진 트리

단순 연결 리스트는 각 노드마다 그 노드와 다른 한 노드를 연결하는 링크를 포함한다. 트리 역시 노드 기반 자료 구조이지만 트리의 각 노드는 여러 노드로의 링크를 포함할 수 있다. 다음은 간단한 트리를 그림으로 표현한 것이다. 예제의 각 노드에는 다른 두 노드로 이어지는 링크가 있다. 실제 링크를 모두 표시하지 않고도 간결하게 트리를 그림으로 표현할 수 있다. 트리에는 세 가지 고유한 용어가 있다. 가장 상위 노드("j")를 root라고 부른다. 루트는 트리의 꼭대기다. "j"를 "m"과 "b"의 부모라고 하고, 반대로 "j"의 자식이라고 한다. 트리에는 레벨이 있다. 위 트리는 세 레벨이다. 트리 기반 자료 구조는 종류가 다양하지만 우선 이진트리는 다음의 규칙을 따른다. 각 노드의 자식은 0개나 1개,..

728x90
반응형