프로토타입 --------------------------------------------------------------------------------------------------

프로토타입 패턴은 하나의 원형객체를 두고 그 객체를 복사해서 새로운 객체를 생성하는 패턴을 말한다.

요약하자면 

CPlayer* ProtoMonster = new Obj;

CPlayer* CreateMonster = ProtoMonster;

이런식으로 새롭게 생길 객체에 또하나의 객체를 대입하게 된다.

하지만 이렇게 할경우 주소값만 복사된 꼴이 되기 때문에 CreateMonster가 새로운 몬스터라고 할수는 없을 것이다.

새로운 방법이 필요하니 그에 대한 방법과 코드에 대한 방법을 보자.

아래의 코드와 패턴을 보면서 알아보도록 하자.


패턴 적용 스토리 -----------------------------------------------------------------------------------------------

당신은 몬스터를 생성하는 구조를 짜게 되었다. 하지만 몬스터가 등장하는 패턴을 보니 같은 몬스터가 여러개 등장하게 되어있다.

이제 플레이어를 만들어 보도록 하자.






1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
#pragma once
 
#include "stdafx.h"
#include "include.h"
 
enum MONSTER_TYPE
{
    MONSTER_TYPE_0,
    MONSTER_TYPE_1,
    MONSTER_TYPE_2,
    MONSTER_TYPE_LAST
};
 
typedef struct tagMonster
{
    int    At;
    int    Dp;
    int Hp;
    int TextureIndex;
 
 
    void Setting(int iLevel)
    {
        At = (iLevel+1) * 10;
        Dp = (iLevel+1) * 10;
        Hp = (iLevel+1) * 10;
        TextureIndex = iLevel;
    }
 
    tagMonster(void)
    {
        At = 0;
        Dp = 0;
        Hp = 0;
        TextureIndex = 0;
    };
 
}MONSTERINFO, *PMONSTERINFO;
 
class CMonster
{
private:
    MONSTERINFO            tMonsterInfo;
 
public:
    void SetMonsterInfo(MONSTERINFO& rInfo)
    {
        tMonsterInfo = rInfo;
    }
 
public:
    CMonster* Clone(void)
    {
        switch(tMonsterInfo.TextureIndex)
        {
        case MONSTER_TYPE_0:
            cout << "CREATE MONSTER_TYPE_0" << endl;
            break;
        case MONSTER_TYPE_1:
            cout << "CREATE MONSTER_TYPE_1" << endl;
            break;
        case MONSTER_TYPE_2:
            cout << "CREATE MONSTER_TYPE_2" << endl;
            break;
        }
 
        return new CMonster(*this);
    }
 
public:
    CMonster(void) {}
    ~CMonster(void) {}
};
 
class CMonsterCreator
{
private:
    map<MONSTER_TYPE, CMonster*>        m_MonsterProtoMap;
 
public:
    void CreateProtoMonster(void)
    {
        for(int i = 0 ; i < MONSTER_TYPE_LAST ; ++i)
        { 
            CMonster* pMonster= new CMonster;
            MONSTERINFO MonsterInfo;
            MonsterInfo.Setting(i);
            pMonster->SetMonsterInfo(MonsterInfo);
            m_MonsterProtoMap.insert(map<MONSTER_TYPE, CMonster*>::value_type((MONSTER_TYPE)i, pMonster));
        }
    }
 
public:
    CMonster* CreateFieldMonster(MONSTER_TYPE eMonsterType)
    {
        map<MONSTER_TYPE, CMonster*>::iterator FindIter = m_MonsterProtoMap.find(eMonsterType);
 
        if(FindIter == m_MonsterProtoMap.end())
            return NULL;
 
        CMonster* pMonster = FindIter->second->Clone();
 
        return pMonster;
    }
 
public:
    CMonsterCreator(void) {}
    ~CMonsterCreator(void) {}
};
 
#include "stdafx.h"
#include "include.h"
#include "Prototype.h"
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    CMonsterCreator MonsterCreate;
 
    MonsterCreate.CreateProtoMonster();
 
    CMonster* pMonster;
 
    for(int i = 0; i < 10 ; ++i)
    {
        srand((unsigned)time(NULL));
        int j = rand() % 3;
        Sleep(1000);
        pMonster = MonsterCreate.CreateFieldMonster( ( MONSTER_TYPE )( j ) );
    }
 
    return 0;
}
 
 
 



보면 알겠지만 CreateProtoMonster()함수를 통해서 초반에 몬스터를 생성 해놓고 

그 이후에 생성되는 것은 CreateFieldMonster()함수를 통해서 내부에 저장되어있는 몬스터의 값을 복제해서 새로운 객체를 생성한다. 

하지만 이미 포인터로 만들어져 있기 때문에 단순 대입으로는 주소값대 주소값의 복사가 되어버리므로 리턴 형식을 자기자신의 새로운 형으로해서 자기 자신의 값을 채워넣어 복사하는

Clone함수를 사용해서 값을 새롭게 생성하여 복사해주면 된다.

'게임개발공부 > 디자인패턴' 카테고리의 다른 글

메인프레임 작업 01  (0) 2013.12.21
생성패턴 <싱글톤 패턴>  (0) 2013.12.18
쓰레드 환경에서 싱글톤?  (0) 2013.12.16
생성패턴 <팩토리 메서드>  (0) 2013.12.15
생성패턴 <빌더>  (0) 2013.11.24
Posted by JJOREG
String ---------------------------------------------------------------------------------------------------------------------------------------

문자열은 항상 골치다. 하지만 잘쓰면 문자란 일반적인 C++언더보다 현실세계에 근접하므로 직관적인 표현이 가능하다.


string s = ""; <-문자열 형임을 나타내는 부호


방식으로 초기화가 가능하며 문자열(string)은 프로그램에서 가장 많이 쓰이는 데이타 타입중이 하나이다. C#의 키워드 string은 .NET의 System.String 클래스와 동일하며, String클래스의 모든 메서드, 프로퍼티를 사용한다. 예를 들어 일정 문자열 부분만 뽑아내는 .Substring()메서드, 문자열 길이를 구하는 .Length 프로퍼티 등등을 사용할 수 있다.


System.String     클래스의 인스턴스 메서드

Clone                클래스 참조 반환

CompareTo        특정 객체와 비교

CopyTo         객체 복사

EndsWith         특정 문자열로 끝나는지를 확인

Equals         비교 연산

GetEnumerator IEnumerator 인터페이스 반환

GetHashCode 해쉬 코드 반환

GetType         형식 정보 반환

GetTypeCode TypeCode 반환

IndexOf         문자열 검색

IndexOfAny         유니코드 문자열에서 먼저 나오는 문자 반환

Insert                 문자열 삽입

LastIndexOf IndexOf를 뒤에서부터 수행

LastIndexOfAny IndexOfAny를 뒤에서부터 수행

PadLeft         문자열에서 남아있는 왼쪽을 빈 공백으로 채움

PadRight         문자열에서 남아있는 오른쪽을 빈 공백으로 채움

Remove         지정 개수의 문자 제거

Replace         문자열 치환

Split                 문자열 분리하여 배열로 반환

StartsWith         특정 문자로 시작하는지를 확인

Substring         문자열 추출

ToCharArray 문자 배열로 변환

ToLower         소문자로 변환

ToString         객체를 나타내는 문자열 반환

ToUpper         대문자로 변환

Trim                 양쪽 공백 없앰

TrimEnd         문자열 끝 부분의 공백 없앰

TrimStart         문자열 시작 부분의 공백 없앰



String은 변경이 불가능하다 ----------------------------------------------------------------------------------------------------------------------

 C# 문자열은 Immutable 즉 한번 문자열이 설정되면, 다시 변경할 수 없다. 예를 들어, s="C#" 이라고 한 후 다시 s="F#"이라고 실행하면, .NET 시스템은 기존의 문자열 클래스에서 새로운 객체를 생성하여 "F#"이라는 데이타로 초기화 한 후 이를 변수명 s1에 할당한다. 즉, 내부적으로는 전혀 다른 메모리를 갖는 객체를 가리키는 것이다. 


즉 빈번한 문자열의 변경은 실제로 우리가 생각하는 변경이 아니로 새로운 문자열 객체를 선언하고 할당하는 것과 같다. 큰 연산을 소비한다고 볼 수 있으니 자제해야 할듯 하다.

(나중에 보니 문자열 빌더를 통하는 방법이 있다고 한다 한번 봐둬야지.)


StringBuilder --------------------------------------------------------------------------------------------------------------------------------


StringBuilder 는 내부적으로 문자열의 추가삭제를 위해서 동착하는 작업들이 준비되어있는 클래스라고 보면 된다. string처럼 문자열을 곧바로 재할당하거나 하지 않고 내부적으로 가지고 있는 capacity값을 증가시켜 마치 vector자료구조처럼 동착하는 것으로 보인다.(내부적인 동작에 대해서는 명확하게 파악하지 못했다.)

할때마다 새로운 메모리를 할당하는 것과 달리. 충반한 메모리를 할당하고 거기에 덧붙이는 식으로 문자열을 추가하므로 일반적인 string대입보다 문자열 수정에 있어서는 빠르게 사용이 가능하다.

하지만 마치 변수처럼 사용하는 string 클래스보다는 클래스와 비슷하게 초기화등이 가능하기 때문에 사용법은 조금더 까다로와 보인다.


StringBuilder sb = new StringBuilder("abcdef"); -> 마치 클래스와 같은 초기화 방식이다.



'게임개발공부 > C#공부' 카테고리의 다른 글

배열과 배열메소드  (0) 2013.12.19
C#공부에 대해서...  (0) 2013.12.18
@의 의미가 대체 뭐지? C#에서 레퍼런스와 포인터란? 막긁어와!  (0) 2013.12.16
객체형????  (0) 2013.12.16
C#의 리터럴  (0) 2013.12.16
Posted by JJOREG
C#에서 Reference와 Pointer는 전혀 다르고 '비슷한 것'도 아닙니다. 
C/C++ 프로그래머를 위해 스마트 포인터 정도로 표현하기도 합니다만, 
전혀 다릅니다. 

localText는 지역 변수로 할당한 TextBox를 사용하기 위한 이름입니다. 
내부적으로 생각하신 참조는 일어나지 않습니다. 생성자 함수 전체적으로 
보면, 폼 컨트롤 컬렉터에 참조된 객체이므로, localText는 대리자 
성격이 강하며 그러므로 개비지 컬럭터는 호출될 필요도 없습니다. 

개비지 컬렉터는 폼 컨트롤 컬렉터(myForm.Controls)가 소멸할 때 
만들어진 TextBox에 대해 호출됩니다. 

임시 지역 변수의 개비지 컬렉터 호출은 함수 내에서 할당해서 함수 
내에서 사용하다가 소멸할 때 불려집니다. 

결국엔 지역 변수와 클래스 변수의 차이점입니다. 
http://msdn2.micros...csharp/aa336809.aspx
 에 가셔서 
C# 언어 사양 문서를 받아서 읽어보시면 좋겠네요.


C# 언어 참조


C# 키워드 

키워드는 컴파일러에 대해 특별한 의미를 갖는, 미리 정의되어 있는 예약된 식별자입니다. 키워드는 프로그램에서 식별자로 사용되려면 접두어로 @을 포함해야 합니다. 예를 들어 '@if'는 올바른 식별자이지만 if는 키워드이므로 올바른 식별자가 아닙니다.

C# 연산자 

C#은 식에서 수행할 연산을 지정하는 기호인 연산자를 다양하게 제공합니다. C#에는 일반적인 산술 및 논리 연산자와 그외 다양한 종류의 연산자가 미리 정의되어 있습니다. 또한 사용자가 다양한 연산자를 오버로드하여 사용자 정의 형식에 적용할 때 해당 연산자의 의미를 변경할 수 있습니다.

C# 전처리기 지시문

C#의 조건부 컴파일 지시문에 대해 알아봅니다.

C# 언어 기능

배열, Main 메서드, 속성, 인덱서, 전달 매개 변수 및 기타 언어 기능에 대해 알아봅니다.

C# 언어 자습서

C# 자습서를 통해 언어의 기본 사항에 대한 개요를 살펴보고 중요한 언어 기능을 확인합니다. 각 자습서에는 하나 이상의 샘플 프로그램이 포함되어 있습니다. 자습서에는 샘플 코드에 대한 설명뿐만 아니라 추가적인 배경 정보도 제공됩니다. 또한 샘플 프로그램을 다운로드하고 실행할 수 있는 해당 샘플 항목에 대한 링크도 제공합니다.

'게임개발공부 > C#공부' 카테고리의 다른 글

C#공부에 대해서...  (0) 2013.12.18
C#에서 문자열형은?  (0) 2013.12.16
객체형????  (0) 2013.12.16
C#의 리터럴  (0) 2013.12.16
ToString("")  (0) 2013.12.15
Posted by JJOREG

객체형 ??? ----------------------------------------------------------------------------------------------------------------------------

C#에는 큰의미로 봐서 다음과 같은 항목들이 존재한다.


값형

참조형


참조형은 말그대로 참조하는 형태를 의미한다. C++에서 익히 들어왔던  Call by Value & Call By Reference 와 비슷하다고 보고 있다.(이해가 좀더 완벽해지면 바뀔 수도 있지만.)

이중 참조형은 다음과 같은 분류로 나뉜다.


클래스형

- 객체형 -> 요녀석이 뭐지?

- 문자열형 -> 문자열주소와 같은 개념으로 보고 있다.

배열형 -> 말그대로 배열

델리게이트형 -> 함수로의 포인터


int a = 0;

object b; -> 이녀석이 객체형이다. .net형으로는 system.object가 된다.

b = a;


이 형에는 말그대로 무엇이든 대입할수가 있다고 하며 이렇게 대입하여 객체형을 값형으로 (object형에 int를 대입함으로서) 변형시키는 것을 박스(boxing)라고 한다.

이게뭐지????? 라고 하니


object형은 메모리상 어디엔가 영역을 확보하고 있고(힙? 코드? 스택? 데이터?) 그 참조가 object에 저장된다.(힙에다가 저장한다고 합니다. 스마트포인터 같은 느낌인가?)


반대로


int a = 0;

object b; 

a = (int)b;  ->역시 형변환은 필요한가?


이와같이 참조형으로 부터 값형으로 변환시키는 것을 박스화 해제(unboxing)라고 한다.


이녀석 실수할 거리가 많아보인다. 예제로 나온경우에는


long l = 0;

object o; 

int i;


o = l;

i = (int)o;  -> 롱형을 먼저 대입하고 그걸 인트형에 대입하니 오류.


object o = 1;

int i ;

i = (int)o; -> 값형의 데이터를 object에 대입했지만 참조형의 데이터도 object형에 대입할 수 있다. 이 경우는, 박스화라고는 하지 않는다.








'게임개발공부 > C#공부' 카테고리의 다른 글

C#공부에 대해서...  (0) 2013.12.18
C#에서 문자열형은?  (0) 2013.12.16
@의 의미가 대체 뭐지? C#에서 레퍼런스와 포인터란? 막긁어와!  (0) 2013.12.16
C#의 리터럴  (0) 2013.12.16
ToString("")  (0) 2013.12.15
Posted by JJOREG

C# 리터럴 데이타 

C#에서 리터럴(Literal) 데이타를 사용할 때, 별도의 표시가 없는 경우 C# 컴파일러는 int, double, char, string, bool 데이타 타입을 기본 데이타 타입으로 사용한다. 따라서, 특정 데이타 타입을 지정하고 싶으면, 리터럴 데이타뒤에 1~2자의 타입 지정 문자(Suffix)를 추가해야 한다. Suffix는 대소문자 구분이 없다. 즉 decimal을 나타내는 M은 1024M 이나 1024m처럼 사용가능하다. 아래는 디폴트 리터럴 타입과 각 데이타 타입별 Suffix에 대한 예제이다. 

디폴트 리터럴 타입

123    // int 리터럴
12.3   // double 리터럴
"A"    // string 리터럴
'a'    // char 리터럴
true   // bool 리터럴



C# 리터럴 데이타 타입Suffix (대소문자 모두 가능)예제
longL1024L
uintU1024U
ulongUL1024UL
floatF10.24F
doubleD10.24D 또는 10.24
decimalM10.24M


와 이런식으로 표현이 가능하다니 C++만 하다보니 신기하기는 하다.

'게임개발공부 > C#공부' 카테고리의 다른 글

C#공부에 대해서...  (0) 2013.12.18
C#에서 문자열형은?  (0) 2013.12.16
@의 의미가 대체 뭐지? C#에서 레퍼런스와 포인터란? 막긁어와!  (0) 2013.12.16
객체형????  (0) 2013.12.16
ToString("")  (0) 2013.12.15
Posted by JJOREG

2개의 쓰레드에서 동시에 하나의 싱글톤을 참조하게 되면?


싱글톤은 단 1개의 객체를 생성하는것이 장점인 패턴이다.


그런데 1개로 생성한 객체 내부에 있는 데이터를 2개의 쓰레드에서 동시에 접근한다면 어떤 일이 벌어질까?


... 애초에 그렇게 쓰면 안돼겠지만 그 데이터(전역이나 마찬가지 이므로)에 동기화를 걸어놓는게 좋을거 같다.


쌤한테 물어보자.

'게임개발공부 > 디자인패턴' 카테고리의 다른 글

생성패턴 <싱글톤 패턴>  (0) 2013.12.18
생성패턴 <프로토 타입>  (0) 2013.12.17
생성패턴 <팩토리 메서드>  (0) 2013.12.15
생성패턴 <빌더>  (0) 2013.11.24
생성패턴 <추상팩토리>  (0) 2013.11.20
Posted by JJOREG

뭐야이게! INT형을 별 어려움 없이 그냥 STRING으로 변경하네! ----------------------------------------------------------------------------------------


int 형 변수를 문자로 바로 변경할수 있다는 것은 C++만 해오던 나한테 듣도보도 못한 개념이고 거기에 형식까지 지정이 가능하다는건 컬처쇼크나 다름없다.

복잡 다난한 변환과정을 거치거나 다시 변경하는 경우도 꽤 많기 때문이다. 그런데 그냥 된다. C#에서는


int a


a.ToString()만 해주면 문자열 값을 반환해준다.


옵션으로는 다음과 같은 값들이 있다.


ToString("C") 통화표시(돈표시)

ToString("D")  정수의 10진수 표시

ToString("E")  부동 소숫점의 지수 표시

ToString("F")  표준의 부동 소숫점 표시

ToString("G")  E또는 F의 단축 표시

ToString("N")  자리로 구분된 붇종 소숫점 표시

ToString("P")  퍼센트 표시

ToString("X")  정수 16진수 표시


이런식으로도 쓸수 있다.


int a = 1;

Console.WriteLine(a.ToString("x5"));


//result

//00001



int a = 1;

Console.WriteLine(a.ToString("0000"));


//result

//0001



float a = 1.51321548f;

Console.WriteLine(a.ToString("0000.00"));


이렇게도 쓸수 있다.

"c" : 해당 컴퓨터에서 사용하는 통화 단위로 변환

"f3" : 소수점 아래로 세 자리까지 표시

"0" : 정수 현태로 변환

"0%" : 정수 퍼센트 단위로 변환

"n" : 천 단위마다 쉼표를 집어넣음


'게임개발공부 > C#공부' 카테고리의 다른 글

C#공부에 대해서...  (0) 2013.12.18
C#에서 문자열형은?  (0) 2013.12.16
@의 의미가 대체 뭐지? C#에서 레퍼런스와 포인터란? 막긁어와!  (0) 2013.12.16
객체형????  (0) 2013.12.16
C#의 리터럴  (0) 2013.12.16
Posted by JJOREG

팩토리메서드 --------------------------------------------------------------------------------------------------

팩토리 메서드는 객체를 생성하기 위한 인터페이스를 정의하지만, 어떤 클래스의 인스턴스를 생성할 지에 대한 결정은 서브클래스가 내리도록 하는 패턴입니다.

상속과 다형성을 이용하는 방법입니다.


패턴 적용 스토리 -----------------------------------------------------------------------------------------------

게임내에서 아이템드랍방식을 생각해보면 몬스터가 죽였을때 아이템이 생성되어야 합니다.

아이템의 종류는 무기, 방패, 갑옷의 세종류가 있으며 타입마다 다른 아이템을 사용하여 리턴합니다.

팩토리 메서드패턴은 생성 클래스 자체를 추상화하여 각 아이템별 생성클래스를 생성하거나 혹은 생성 클래스 내부에서 인자값을 받아 그에 맞는 아이템클래스를 생성할수 있습니다.

이번에는 인자값을 받아서 그에 맞는 아이템 클래스를 생성하는 패턴으로 가보겠습니다.





1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#pragma once
 
#include "stdafx.h"
 
enum ITEM_TYPE
{
    ITEM_TYPE_WEAPON,
    ITEM_TYPE_SHIELD,
    ITEM_TYPE_ARMOR,
    ITEM_TYPE_COUNT
};
 
class CItem
{
public:
    CItem(void) {}
    ~CItem(void) {}
};
 
class CWeapon
    : public CItem
{
public:
    CWeapon(void) {}
    ~CWeapon(void) {}
};
 
class CShield
    : public CItem
{
public:
    CShield(void) {}
    ~CShield(void) {}
};
 
class CArmor
    : public CItem
{
public:
    CArmor(void) {}
    ~CArmor(void) {}
};
 
class CItemCreator
{
public:
    CItem* CreateItem(ITEM_TYPE eItemType)
    {
        CItem* pItem = NULL;
        switch(eItemType)
        {
        case ITEM_TYPE_WEAPON:
            pItem = new CWeapon;
            cout << "무기가 드랍됨" << endl;
            break;
        case ITEM_TYPE_SHIELD:
            pItem = new CShield;
            cout << "방패가 드랍됨" << endl;
            break;
        case ITEM_TYPE_ARMOR:
            pItem = new CArmor;
            cout << "갑옷이 드랍됨" << endl;
            break;
        default:
            cout << "꽝 아이템 없음 ㅋㅋㅋ" << endl;
            break;
        }
 
        return pItem;
    }
 
public:
    CItemCreator(void) {}
    ~CItemCreator(void) {}
};
 
int _tmain(int argc, _TCHAR* argv[])
{
    srand((unsigned)time(NULL));
    CItemCreator ItemCreate;
 
    for(int i = 0; i < 10 ; ++i)
    {
        srand((unsigned)time(NULL));
        int j = rand() % 5;
        Sleep(500);
        ItemCreate.CreateItem( (ITEM_TYPE)(j) );
    }
 
    return 0;
}
 



Posted by JJOREG

D3DXMATRIX? ------------------------------------------------------------------------------------------------------------------


다이렉트X에서 하나의 객체를 표현하기 위해서 4X4의 행렬을 사용한다.
이 행렬이 대체 어떻게 하나의 객체의 위치와 회전을 가지게 되는지에 대해서는 아직 완벽히 파악하지 못하고 있다.
수학적으로 완벽한 이해가 선행되지 못하는 점이 아쉽지만 우선 그 사용법에 대해서는 차근차근 알아보자.

이동행렬 ------------------------------------------------------------------------------------------------------------------

4X4의 행렬에서 하단의 3개의 수치는 위치값을 나타낸다.

X Y Z의 세개의 축이 있으니 세개의 축의 위치를 표기하며 이는 일반적으로 벡터를 사용하여 표기한다.


회전행렬 ------------------------------------------------------------------------------------------------------------------



회전행렬은 일반적으로 X축 Y축 Z축의 회전으로 나누며 각 축에 맞춰서 시계방향으로 회전한 위치를 기준으로으로 각으로 본다.

세개의 회전행렬을 보면 알겠지만 하나의 축을 기준으로 회전하며 나머지 축에 대한 변화값을 주는 연산임이 보일것이다.

X축이란 말그대로 X축은 움직이지 않고 그 축을 중심으로 두고 회전함을 의미한다.


크기행렬 ------------------------------------------------------------------------------------------------------------------


대각 선 중앙의 값은 각 X축 Y축 Z축의 값을 의미한다.이 행렬의 값을 기준으로 -가 되면 축소되는 것이 아니라. 객체 자체가 뒤집히게 된다.

일반적인 축소연산은 1을 기준으로 0.9 0.8식으로 비율적으로 감소하게 되며 확대연산도 마찬가지로 적용된다.

Posted by JJOREG

행렬이란? -----------------------------------------------------------------------------------------------------------------------


 3차원의 물체를 나타낸다고 하면 다양한 고려사항이 필요하다.

 x y z의 축과 관련된, 회전, 위치, 크기등의 값이 존재할 것이다.

 거기에 이 파라미터들은 독립적인 파라미터가 아니라 서로가 서로에 영향을 미칠 수 있다.

 이러한 파라미터를 수학과 연계하여 좀더 압축적이고 보기 편하게 만든것을 행렬이라고 할수 있다.




행렬의 연산 ---------------------------------------------------------------------------------------------------------------------

상등 -> 행과 열이 같은 2개의 행렬이 있을때 같은 위치의 각 요소를 비교해 각 요소의 크기가 같다면 그 행렬은 상등한다고 한다.

스칼라 곱 -> 행렬에 하나의 수를 곱하는 것을 의미한다. 그 하나의 수를 행렬의 모든 요소에 곱해주면 된다.

행렬간 덧셈과 뺄셈 -> 행렬간 덧셈은 행렬과 행렬의 같은 행과 열을 가진 요소를 더하면 된다. 

* 만약 2개의 행렬간 차원에 차이가 있다면 덧셈과 뺄셈은 불가능하다.


행렬간 곱셈 -> 행렬간 곱셈은 한쪽 행렬의 열과, 한쪽 행렬의 행이 같은 차원을 가져야만 성립한다.

또한 일반적인 곱셈과 다르게 교환 법칙이 성립하지 않을수도 있다.(항상 성립하지 않는 것은 아니다.)

* 또한 곱셈은 행렬의 연산 중 가장 중요한 연산이다.


항등행렬 ---------------------------------------------------------------------------------------------------------------------


항등행렬이란 어떤 행렬에 곱해도 다시 같은 행렬이 나오는 행렬을 의미한다. 보는 바와 같이 행렬의 중앙 대각선을 1로 나머지는 0으로 채우면 된다.


역행렬 ---------------------------------------------------------------------------------------------------------------------

역행렬이란 행렬과 곱했을때 항등행렬이 되는 행렬을 말한다.



전치행렬 ---------------------------------------------------------------------------------------------------------------------

전치행렬이란 하나의 행렬의 행과 열을 바꾼 행렬이라고 생각하면 된다.


Posted by JJOREG