루빅스 큐브 만들기3

Posted by 백창
2014. 12. 24. 11:48 개발/Open GL
반응형


 개요

 

 큐브의 회전동작을 구현해보자



 코드

 

 Cube Class 구성


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
 
void Cube::setAngle(int new_angleX, int new_angleY, int new_angleZ){
    GLfloat temp[6][3];
    int cubeRet[3];
    for (int i = 0; i<6; i++){
        for (int j = 0; j<3; j++){
            temp[i][j] = colors[i][j];
        }
    }
    if (new_angleX > 0){
    
        for (int i = 0; i < 4; i++){
            for (int j = 0; j<3; j++){
                colors[rotate[0][i]][j] = temp[rotate[0][(i + 1) % 4]][j];
            }
            
        }
    }
    else if (new_angleY > 0){
        for (int i = 0; i < 4; i++){
            for (int j = 0; j<3; j++){
                colors[rotate[2][i]][j] = temp[rotate[2][(i + 1) % 4]][j];
            }
        }
        
    }
    else{
        for (int i = 0; i < 4; i++){
            for (int j = 0; j<3; j++){
                colors[rotate[1][i]][j] = temp[rotate[1][(i + 1) % 4]][j];
            }
        }
    }
}
cs


동작

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
 
void turnFuc(int xyz, int val, int dir){
    int cubeRet[3], a=0;
    GLfloat temp[6][3];
    GLfloat col[9][6][3];
 
 
    for (int i = 0; i < 3; i++){
        for (int j = 0; j < 9; j++){
            cube[i][j].getLocation(cubeRet);
            if (cubeRet[xyz] == val){
 
 
                cube[i][j].getColor(temp);
                for (int l = 0; l < 6; l++){
                    for (int k = 0; k < 3; k++)
                        col[a][l][k] = temp[l][k];
                }
                a++;
                
            }
        }
    }
    
    a = 0;
    for (int i = 0; i < 3; i++){
        for (int j = 0; j < 9; j++){
            cube[i][j].getLocation(cubeRet);
            if (cubeRet[xyz] == val){
                cube[i][j].setColor(col[rot[a++]]);
 
            }
        }
    }
 
    for (int i = 0; i < 3; i++){
        for (int j = 0; j < 9; j++){
            cube[i][j].getLocation(cubeRet);
            if (cubeRet[xyz] == val){
 
 
                if (xyz == 0){
                cube[i][j].setAngle(0900);
                }
                else if (xyz == 1){
                cube[i][j].setAngle(9000);
                }
                else if (xyz == 2)
                cube[i][j].setAngle(0090);
                
 
            }
        }
    }
}
 
void MyKeyboard(unsigned char key, int x, int y){
 
    switch (key){
 
    case 'a':
        turnFuc(01,0);
        break;
    case 's':
        turnFuc(02,0);
        break
    case 'd':
        turnFuc(03,4);
        break;
 
    case 'z':
        turnFuc(111);
        break;
    case 'x':
        turnFuc(120);
        break;
    case 'c':
        turnFuc(133);
        break;
 
    case 'q':
        turnFuc(212);
        break;
    case 'w':
        turnFuc(222);
        break;
    case 'e':
        turnFuc(232);
        break;
    }
 
    glutDisplayFunc(MyDisplay);
 
    glutPostRedisplay();
}
 
cs



 결과

 





반응형

'개발 > Open GL' 카테고리의 다른 글

루빅스 큐브 만들기2  (0) 2014.12.08
루빅스 큐브 만들기1  (0) 2014.11.22
이미지 불러오기  (0) 2014.11.21
정육면체 그리기  (0) 2014.11.21
도형 그리기 및 이동  (0) 2014.11.03

루빅스 큐브 만들기2

Posted by 백창
2014. 12. 8. 20:42 개발/Open GL
반응형


 개요

 

 cube 객체를 생성하고 27개의 작은 정육면체로 큰 정육면체를 만들기



 간단한 설명

 

클래스를 작성하여 반복문으로 각 위치를 설정해주고 정육면체를 그린다.


생각나는데로 만들어서 노가다성 코드가 많음.







 좌표설정 및 칼라 설정

 

가장 간단한 노가다로 처리


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
static GLfloat vertices[3][9][8][3] = {
    //Front
    {
        //Top
        {
            { -0.5, 0.5, 0.2 }, { -0.5, 0.5, 0.5 }, { -0.2, 0.5, 0.5 }, { -0.2, 0.5, 0.2 }, { -0.5, 0.2, 0.2 }, { -0.5, 0.2, 0.5 }, { -0.2, 0.2, 0.5 }, { -0.2, 0.2, 0.2 }
        },
        {
            { -0.15, 0.5, 0.2 }, { -0.15, 0.5, 0.5 }, { 0.15, 0.5, 0.5 }, { 0.15, 0.5, 0.2 }, { -0.15, 0.2, 0.2 }, { -0.15, 0.2, 0.5 }, { 0.15, 0.2, 0.5 }, { 0.15, 0.2, 0.2 }
        },
        {
            { 0.2, 0.5, 0.2 }, { 0.2, 0.5, 0.5 }, { 0.5, 0.5, 0.5 }, { 0.5, 0.5, 0.2 }, { 0.2, 0.2, 0.2 }, { 0.2, 0.2, 0.5 }, { 0.5, 0.2, 0.5 }, { 0.5, 0.2, 0.2 }
        },
            //Mid
        {
            { -0.5, 0.5, -0.15 }, { -0.5, 0.5, 0.15 }, { -0.2, 0.5, 0.15 }, { -0.2, 0.5, -0.15 }, { -0.5, 0.2, -0.15 }, { -0.5, 0.2, 0.15 }, { -0.2, 0.2, 0.15 }, { -0.2, 0.2, -0.15 }
        },
        {
            { -0.15, 0.5, -0.15 }, { -0.15, 0.5, 0.15 }, { 0.15, 0.5, 0.15 }, { 0.15, 0.5, -0.15 }, { -0.15, 0.2, -0.15 }, { -0.15, 0.2, 0.15 }, { 0.15, 0.2, 0.15 }, { 0.15, 0.2, -0.15 }
        },
        {
            { 0.2, 0.5, -0.15 }, { 0.2, 0.5, 0.15 }, { 0.5, 0.5, 0.15 }, { 0.5, 0.5, -0.15 }, { 0.2, 0.2, -0.15 }, { 0.2, 0.2, 0.15 }, { 0.5, 0.2, 0.15 }, { 0.5, 0.2, -0.15 }
        },
            //Bot
        {
            { -0.5, 0.5, -0.5 }, { -0.5, 0.5, -0.2 }, { -0.2, 0.5, -0.2 }, { -0.2, 0.5, -0.5 }, { -0.5, 0.2, -0.5 }, { -0.5, 0.2, -0.2 }, { -0.2, 0.2, -0.2 }, { -0.2, 0.2, -0.5 }
            
        },
        {
            { -0.15, 0.5, -0.5 }, { -0.15, 0.5, -0.2 }, { 0.15, 0.5, -0.2 }, { 0.15, 0.5, -0.5 }, { -0.15, 0.2, -0.5 }, { -0.15, 0.2, -0.2 }, { 0.15, 0.2, -0.2 }, { 0.15, 0.2, -0.5 }
        },
        {
            { 0.2, 0.5, -0.5 }, { 0.2, 0.5, -0.2 }, { 0.5, 0.5, -0.2 }, { 0.5, 0.5, -0.5 }, { 0.2, 0.2, -0.5 }, { 0.2, 0.2, -0.2 }, { 0.5, 0.2, -0.2 }, { 0.5, 0.2, -0.5 }
        }
    },
        //Middle
    {
        //Top
        {
            { -0.5, 0.15, 0.2 }, { -0.5, 0.15, 0.5 }, { -0.2, 0.15, 0.5 }, { -0.2, 0.15, 0.2 }, { -0.5, -0.15, 0.2 }, { -0.5, -0.15, 0.5 }, { -0.2, -0.15, 0.5 }, { -0.2, -0.15, 0.2 }
        },
        {
            { -0.15, 0.15, 0.2 }, { -0.15, 0.15, 0.5 }, { 0.15, 0.15, 0.5 }, { 0.15, 0.15, 0.2 }, { -0.15, -0.15, 0.2 }, { -0.15, -0.15, 0.5 }, { 0.15, -0.15, 0.5 }, { 0.15, -0.15, 0.2 }
        },
        {
            { 0.2, 0.15, 0.2 }, { 0.2, 0.15, 0.5 }, { 0.5, 0.15, 0.5 }, { 0.5, 0.15, 0.2 }, { 0.2, -0.15, 0.2 }, { 0.2, -0.15, 0.5 }, { 0.5, -0.15, 0.5 }, { 0.5, -0.15, 0.2 }
        },
            //Mid
        {
            { -0.5, 0.15, -0.15 }, { -0.5, 0.15, 0.15 }, { -0.2, 0.15, 0.15 }, { -0.2, 0.15, -0.15 }, { -0.5, -0.15, -0.15 }, { -0.5, -0.15, 0.15 }, { -0.2, -0.15, 0.15 }, { -0.2, -0.15, -0.15 }
        },
        { //Black One - Center Cube
            { -0.35, 0.35, -0.35 }, { -0.35, 0.35, 0.35 }, { 0.35, 0.35, 0.35 }, { 0.35, 0.35, -0.35 }, { -0.35, -0.35, -0.35 }, { -0.35, -0.35, 0.35 }, { 0.35, -0.35, 0.35 }, { 0.35, -0.35, -0.35 }
        },
        {
            { 0.2, 0.15, -0.15 }, { 0.2, 0.15, 0.15 }, { 0.5, 0.15, 0.15 }, { 0.5, 0.15, -0.15 }, { 0.2, -0.15, -0.15 }, { 0.2, -0.15, 0.15 }, { 0.5, -0.15, 0.15 }, { 0.5, -0.15, -0.15 }
        },
            //Bot
        {
            { -0.5, 0.15, -0.5 }, { -0.5, 0.15, -0.2 }, { -0.2, 0.15, -0.2 }, { -0.2, 0.15, -0.5 }, { -0.5, -0.15, -0.5 }, { -0.5, -0.15, -0.2 }, { -0.2, -0.15, -0.2 }, { -0.2, -0.15, -0.5 }
        },
        {
            { -0.15, 0.15, -0.5 }, { -0.15, 0.15, -0.2 }, { 0.15, 0.15, -0.2 }, { 0.15, 0.15, -0.5 }, { -0.15, -0.15, -0.5 }, { -0.15, -0.15, -0.2 }, { 0.15, -0.15, -0.2 }, { 0.15, -0.15, -0.5 }
        },
        {
            { 0.2, 0.15, -0.5 }, { 0.2, 0.15, -0.2 }, { 0.5, 0.15, -0.2 }, { 0.5, 0.15, -0.5 }, { 0.2, -0.15, -0.5 }, { 0.2, -0.15, -0.2 }, { 0.5, -0.15, -0.2 }, { 0.5, -0.15, -0.5 }
            
        }
    },
        //Back
    {
        //Top
        {
            { -0.5, -0.2, 0.2 }, { -0.5, -0.2, 0.5 }, { -0.2, -0.2, 0.5 }, { -0.2, -0.2, 0.2 }, { -0.5, -0.5, 0.2 }, { -0.5, -0.5, 0.5 }, { -0.2, -0.5, 0.5 }, { -0.2, -0.5, 0.2 }
        },
        {
            { -0.15, -0.2, 0.2 }, { -0.15, -0.2, 0.5 }, { 0.15, -0.2, 0.5 }, { 0.15, -0.2, 0.2 }, { -0.15, -0.5, 0.2 }, { -0.15, -0.5, 0.5 }, { 0.15, -0.5, 0.5 }, { 0.15, -0.5, 0.2 }
        },
        {
            { 0.2, -0.2, 0.2 }, { 0.2, -0.2, 0.5 }, { 0.5, -0.2, 0.5 }, { 0.5, -0.2, 0.2 }, { 0.2, -0.5, 0.2 }, { 0.2, -0.5, 0.5 }, { 0.5, -0.5, 0.5 }, { 0.5, -0.5, 0.2 }
        },
            //Mid
        {
            { -0.5, -0.2, -0.15 }, { -0.5, -0.2, 0.15 }, { -0.2, -0.2, 0.15 }, { -0.2, -0.2, -0.15 }, { -0.5, -0.5, -0.15 }, { -0.5, -0.5, 0.15 }, { -0.2, -0.5, 0.15 }, { -0.2, -0.5, -0.15 }
        },
        {
            { -0.15, -0.2, -0.15 }, { -0.15, -0.2, 0.15 }, { 0.15, -0.2, 0.15 }, { 0.15, -0.2, -0.15 }, { -0.15, -0.5, -0.15 }, { -0.15, -0.5, 0.15 }, { 0.15, -0.5, 0.15 }, { 0.15, -0.5, -0.15 }
        },
        {
            { 0.2, -0.2, -0.15 }, { 0.2, -0.2, 0.15 }, { 0.5, -0.2, 0.15 }, { 0.5, -0.2, -0.15 }, { 0.2, -0.5, -0.15 }, { 0.2, -0.5, 0.15 }, { 0.5, -0.5, 0.15 }, { 0.5, -0.5, -0.15 }
        },
 
            //Bot
        {
            { -0.5, -0.2, -0.5 }, { -0.5, -0.2, -0.2 }, { -0.2, -0.2, -0.2 }, { -0.2, -0.2, -0.5 }, { -0.5, -0.5, -0.5 }, { -0.5, -0.5, -0.2 }, { -0.2, -0.5, -0.2 }, { -0.2, -0.5, -0.5 }
        },
        {
            { -0.15, -0.2, -0.5 }, { -0.15, -0.2, -0.2 }, { 0.15, -0.2, -0.2 }, { 0.15, -0.2, -0.5 }, { -0.15, -0.5, -0.5 }, { -0.15, -0.5, -0.2 }, { 0.15, -0.5, -0.2 }, { 0.15, -0.5, -0.5 }
        },
        {
            { 0.2, -0.2, -0.5 }, { 0.2, -0.2, -0.2 }, { 0.5, -0.2, -0.2 }, { 0.5, -0.2, -0.5 }, { 0.2, -0.5, -0.5 }, { 0.2, -0.5, -0.2 }, { 0.5, -0.5, -0.2 }, { 0.5, -0.5, -0.5 }
            
        }
    }
};
 
GLfloat primary_colors[][3] = {
    { 1.0, 0.0, 0.0 },      // red  
    { 1.0, 1.0, 0.0 },      // yellow  
    { 0.0, 1.0, 0.0 },      // green  
    { 0.0, 0.0, 1.0 },      // blue  
    { 1.0, 1.0, 1.0 },      // gold
    { 1.0, 0.0, 1.0 }        // magenta  
};     




 클래스 생성

 

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
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
 
class Cube{
private:
    GLfloat vertices[8][3];
    GLfloat colors[6][3];
    int location[3];
    
 
public:
    void setPosition(GLfloat set[8][3]);
 
    void setLocation(int loc[3]);
    void getLocation(int *ptr);
 
    void setColor(GLfloat set[6][3]);
    void getColor(GLfloat get[6][3]);
 
    void setAngle(int new_angleX, int new_angleY, int new_angleZ);
 
    void drawCube();
    void drawBlackCube();
        
};
 
 
void Cube::setColor(GLfloat set[6][3]){
    for (int i = 0; i<6; i++){
        for (int j = 0; j<3; j++){
            colors[i][j] = set[i][j];
        }
    }
}
 
 
void Cube::getColor(GLfloat get[6][3]){
    for (int i = 0; i < 6; i++){
        for (int j = 0; j < 3; j++){
            get[i][j] = colors[i][j];
        }
    }
}
 
/**
* Cube 위치 설정
*/
void Cube::setLocation(int loc[3]){
    for (int i = 0; i < 3; i++){
        location[i] = loc[i];
    }
}
 
/**
* Cube 위치 반환
*/
void Cube::getLocation(int *ptr){
    for (int i = 0; i < 3; i++){
        ptr[i] = location[i];
    }
 
}
 
/**
* Cube 위치 좌표 설정
*/
void Cube::setPosition(GLfloat set[8][3]){
    for (int i = 0; i < 8; i++){
        for (int j = 0; j < 3; j++){
            vertices[i][j] = set[i][j];
        }
    }
 
}
/**
* Cube 그리기
*/
void Cube::drawCube(){
    
    glBegin(GL_QUADS);
    
    glColor3fv(colors[0]);
    glNormal3f(0.0f, 1.0f, 0.0f);//top
    glVertex3fv(vertices[0]);
    glVertex3fv(vertices[3]);
    glVertex3fv(vertices[2]);
    glVertex3fv(vertices[1]);
    
    glColor3fv(colors[1]);
    glNormal3f(0.0f, 0.0f, 1.0f);//front
    glVertex3fv(vertices[1]);
    glVertex3fv(vertices[2]);
    glVertex3fv(vertices[6]);
    glVertex3fv(vertices[5]);
    
    glColor3fv(colors[2]);
    glNormal3f(1.0f, 0.0f, 0.0f);//right
    glVertex3fv(vertices[3]);
    glVertex3fv(vertices[7]);
    glVertex3fv(vertices[6]);
    glVertex3fv(vertices[2]);
    
    
    glColor3fv(colors[3]);
    glNormal3f(0.0f, 0.0f, -1.0f);//back
    glVertex3fv(vertices[0]);
    glVertex3fv(vertices[3]);
    glVertex3fv(vertices[7]);
    glVertex3fv(vertices[4]);
    
    glColor3fv(colors[4]);
    glNormal3f(0.0f, -1.0f, 0.0f);//buttom
    glVertex3fv(vertices[7]);
    glVertex3fv(vertices[4]);
    glVertex3fv(vertices[5]);
    glVertex3fv(vertices[6]);
    
    glColor3fv(colors[5]);
    glNormal3f(-1.0f, 0.0f, 0.0f);//left 
    glVertex3fv(vertices[4]);
    glVertex3fv(vertices[0]);
    glVertex3fv(vertices[1]);
    glVertex3fv(vertices[5]);
    
    glEnd();            // End Drawing The Cube
}
/**
* Center Cube 그리기
*/
void Cube::drawBlackCube(){
 
    glBegin(GL_QUADS);
    glColor3f(0.5f, 0.5f, 0.5f);
    glVertex3fv(vertices[0]);
    glVertex3fv(vertices[3]);
    glVertex3fv(vertices[2]);
    glVertex3fv(vertices[1]);
 
    glColor3f(0.5f, 0.5f, 0.5f);
    glVertex3fv(vertices[1]);
    glVertex3fv(vertices[2]);
    glVertex3fv(vertices[6]);
    glVertex3fv(vertices[5]);
 
    glColor3f(0.5f, 0.5f, 0.5f);
    glVertex3fv(vertices[3]);
    glVertex3fv(vertices[7]);
    glVertex3fv(vertices[6]);
    glVertex3fv(vertices[2]);
 
    glColor3f(0.5f, 0.5f, 0.5f);
    glVertex3fv(vertices[0]);
    glVertex3fv(vertices[3]);
    glVertex3fv(vertices[7]);
    glVertex3fv(vertices[4]);
 
    glColor3f(0.5f, 0.5f, 0.5f);
    glVertex3fv(vertices[7]);
    glVertex3fv(vertices[4]);
    glVertex3fv(vertices[5]);
    glVertex3fv(vertices[6]);
 
    glColor3f(0.5f, 0.5f, 0.5f);
    glVertex3fv(vertices[4]);
    glVertex3fv(vertices[0]);
    glVertex3fv(vertices[1]);
    glVertex3fv(vertices[5]);
 
    glEnd();            // End Drawing The Cube
}




 Display Func

 

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
 
void setAllCube(){
 
    /**************** 큐브 초기 좌표 설정 *****************/
    for (int i = 0; i < 3; i++){
        for (int j = 0; j < 9; j++){
            cube[i][j].setPosition(vertices[i][j]);
            cube[i][j].setLocation(primaryLocation[i][j]);
            cube[i][j].setColor(primary_colors);
        }
    }
}
 
void drawAllCube(){
 
    for (int a = 0; a < 3; a++){
        for (int b = 0; b < 9; b++){
 
            for (int i = 0; i < 3; i++){
                for (int j = 0; j < 9; j++){
 
                    int save[3];
                    int cnt = 0;
 
                    cube[i][j].getLocation(save);
                    
                    //위치에 맞는 큐브를 선택
                    for (int k = 0; k < 3; k++){
                        if (primaryLocation[a][b][k] == save[k]){
                            cnt++;
                        }
                    }
                    if (cnt == 3){
 
                        glPushMatrix();
                        if (i == 1 && j == 4)
                            cube[i][j].drawBlackCube();
                        else
                            cube[i][j].drawCube();
 
                        glPopMatrix();
                    }
                }
            }
        }
    }
 
    
}
 
 
void Init(){
 
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
    glutInitWindowSize(700, 700);
    glutInitWindowPosition(0, 0);
 
 
    glutCreateWindow("Rubik\'s Cube");
 
 
//    glClearColor(1.0, 1.0, 1.0, 0.0);
    glClearColor(0.0, 0.0, 0.0, 0.0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
 
    glEnable(GL_DEPTH_TEST);
 
    setAllCube();
}
 
 
void MyDisplay(){
    
    
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
 
    glPopMatrix();
    glRotatef(g_fSpinY, 1.0f, 0.0f, 0.0f);
    glRotatef(g_fSpinX, 0.0f, 0.0f, 1.0f);
 
    drawAllCube();
 
    glPopMatrix(); 
    glutSwapBuffers();
    glFlush();
    
}
 


반응형

'개발 > Open GL' 카테고리의 다른 글

루빅스 큐브 만들기3  (3) 2014.12.24
루빅스 큐브 만들기1  (0) 2014.11.22
이미지 불러오기  (0) 2014.11.21
정육면체 그리기  (0) 2014.11.21
도형 그리기 및 이동  (0) 2014.11.03

FTP - Client 만들기

Posted by 백창
2014. 11. 28. 15:52 개발/Java
반응형


 개요


 JAVA로 간단한 FTP 클라이언트를 만들어보자



 소스


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
import java.io.BufferedInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.Socket;
 
public class Client {
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String IP = "127.0.0.1";
        Socket socket = null;
        
        try{
            socket = new Socket(IP, 8521);
            System.out.println("서버와 연결");
            
            FileSender fs = new FileSender(socket);
            fs.start();
            
        }catch(IOException e){
            e.printStackTrace();
        }
    }
 
}
 
class FileSender extends Thread{
    Socket socket;
    DataOutputStream dos;
    FileInputStream fis;
    BufferedInputStream bis;
        
    public FileSender(Socket socket){
        this.socket = socket;
        try{
            //데이터 전송용 스트림 생성
            dos = new DataOutputStream(socket.getOutputStream());
        }catch(IOException e){
            e.printStackTrace();
        }
        
        
    }
    @Override
    public void run(){
        try{
            //String fileName = "test.txt";
            String fileName = "test.png";
 
            
            dos.writeUTF(fileName);
            
            File f =new File(fileName);
            fis = new FileInputStream(f);
            bis = new BufferedInputStream(fis);
            
            int len;
            int size = 4096;
            byte[] data = new byte[size];
            while((len = bis.read(data))!=-1){
                
                dos.write(data,0,len);
            }
            
            dos.flush();
            dos.close();
            bis.close();
            fis.close();
            
        }catch(IOException e){
            e.printStackTrace();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}


반응형

'개발 > Java' 카테고리의 다른 글

FTP - server 만들기  (0) 2014.11.28
csv파일 읽기  (0) 2014.09.27
JDOM을 이용한 XML 생성  (0) 2014.09.14
JDOM을 이용한 XML 파싱  (0) 2014.09.14
현재 시간 구하기  (0) 2014.09.14

FTP - server 만들기

Posted by 백창
2014. 11. 28. 15:49 개발/Java
반응형


 개요


 JAVA로 간단한 FTP 서버를 만들어보자.


 소스


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
import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
 
 
public class Server {
 
    public static void main(String[] args) {
        ServerSocket serverSocket = null;
        Socket socket = null;
        
        try{
            //리스너 소켓 생성 후 대기
            serverSocket = new ServerSocket(8521);
            System.out.println("#####    서버실행    #####");
            
            //클라이언트와 연결 완료
            socket = serverSocket.accept();
            System.out.println("#####    연결완료    #####");
            
            //수신시작
            FileReceiver fr = new FileReceiver(socket);
            fr.start();
            
        }catch(IOException e){
            e.printStackTrace();
        }
 
    }
 
}
 
class FileReceiver extends Thread{
    Socket socket;
    DataInputStream dis;
    FileOutputStream fos;
    BufferedOutputStream bos;
        
    String filePath = "D:\\ForSecurity\\data\\";
    
    public FileReceiver(Socket socket){
        this.socket = socket;
    }
    
    @Override
    public void run(){
        try{
            System.out.println("#####    수신시작    #####");
            dis = new DataInputStream(socket.getInputStream());
            
            //파일명 수신
            String fName = dis.readUTF();
            System.out.println("#    파일명 : "+fName);
            
            //파일 생성
            File f = new File(filePath+fName);
            fos = new FileOutputStream(f);
            bos = new BufferedOutputStream(fos);
            System.out.println("#    "+fName+" 파일을 생성");
            
            //파일 쓰기
            int len;
            int size=4096;
            byte[] data = new byte[size];
            while((len = dis.read(data))!=-1){
                bos.write(data,0,len);
            }
            
            
            bos.flush();
            bos.close();
            fos.close();
            dis.close();
            
            System.out.println("#    전송완료 사이즈 : "+f.length());
            
        }catch(IOException e){
            e.printStackTrace();
        }
    }
}
 










반응형

'개발 > Java' 카테고리의 다른 글

FTP - Client 만들기  (0) 2014.11.28
csv파일 읽기  (0) 2014.09.27
JDOM을 이용한 XML 생성  (0) 2014.09.14
JDOM을 이용한 XML 파싱  (0) 2014.09.14
현재 시간 구하기  (0) 2014.09.14

루빅스 큐브 만들기1

Posted by 백창
2014. 11. 22. 15:03 개발/Open GL
반응형


 개요

 

 Open GL을 사용하여 어릴때 가지고 놀던 장난감, 루빅스 큐브를 만들어 보도록 하자.




 설계

 

 각각의 정육면체를 Class로 생성, 각각의 객체에 3차원 좌표와 각 면의 색깔을 지정해준다.


 그리고 회전하고자 하는 면의 좌표를 선택하여 아래와 같은 규칙을 따라 회전 시킨다. 


(나는 좌표 값을 사용하지 않고 각 객체가 위치한 좌표를 식별하기 편하게 1 , 2 , 3 으로 주었다.)


(반대 방향으로 회전하고자 하는 경우 규칙을 반대로 적용하면 된다.)




단면을 봤을 때 위와 같은 규칙으로 회전하고 전체적인 그림을 봤을때 색깔의 변경은 아래와 같다.



반응형

'개발 > Open GL' 카테고리의 다른 글

루빅스 큐브 만들기3  (3) 2014.12.24
루빅스 큐브 만들기2  (0) 2014.12.08
이미지 불러오기  (0) 2014.11.21
정육면체 그리기  (0) 2014.11.21
도형 그리기 및 이동  (0) 2014.11.03

이미지 불러오기

Posted by 백창
2014. 11. 21. 14:48 개발/Open GL
반응형


 개요

 

 이미지를 불러오기 위해 하는 프로젝트 설정



 설정

 


다음과 같이 포인터에 저장 후 사용


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void loadTexture(void) {
    AUX_RGBImageRec *pTextureImage = auxDIBImageLoad("flower.bmp");
 
    if (pTextureImage != NULL) {
        glGenTextures(1, &g_textureID);
 
        glBindTexture(GL_TEXTURE_2D, g_textureID);
 
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
 
        glTexImage2D(GL_TEXTURE_2D, 0, 3, pTextureImage->sizeX, pTextureImage->sizeY, 0,
            GL_RGB, GL_UNSIGNED_BYTE, pTextureImage->data);
    }
 
    if (pTextureImage) {
        if (pTextureImage->data)
            free(pTextureImage->data);
 
        free(pTextureImage);
    }
}


반응형

'개발 > Open GL' 카테고리의 다른 글

루빅스 큐브 만들기2  (0) 2014.12.08
루빅스 큐브 만들기1  (0) 2014.11.22
정육면체 그리기  (0) 2014.11.21
도형 그리기 및 이동  (0) 2014.11.03
[빌드 오류] failure during conversion to COFF: file invalid or corrupt  (0) 2014.10.17

정육면체 그리기

Posted by 백창
2014. 11. 21. 10:56 개발/Open GL
반응형


 개요

 

 사각형을 이용해 정육면체 즉, 큐브를 그려보자



 코드

 

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
#include <gl/glut.h>
 
GLfloat vertices[][3] = {
    { -0.5, 0.5, -0.5 }, 
    { -0.5, 0.5, 0.5 }, 
    { 0.5, 0.5, 0.5 }, 
    { 0.5, 0.5, -0.5 }, 
    { -0.5, -0.5, -0.5 }, 
    { -0.5, -0.5, 0.5 }, 
    { 0.5, -0.5, 0.5 }, 
    { 0.5, -0.5, -0.5 }
};
 
GLfloat colors[][3] = {
    { 1.0, 0.0, 0.0 },      // red  
    { 1.0, 1.0, 0.0 },      // yellow  
    { 0.0, 1.0, 0.0 },      // green  
    { 0.0, 0.0, 1.0 },      // blue  
    { 0.5, 0.5, 0.0 },      // gold
    { 1.0, 0.0, 1.0 }        // magenta  
};
 
 
void display(){
 
 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 
    glTranslatef(0.0f, 0.0f, 0.0f);
    glRotatef(30, 1.0f, 0.0f, 0.0f);
    glRotatef(30, 0.0f, 0.0f, 1.0f);
 
    glBegin(GL_QUADS);
 
    glColor3fv(colors[0]);
    glVertex3fv(vertices[0]);
    glVertex3fv(vertices[3]);
    glVertex3fv(vertices[2]);
    glVertex3fv(vertices[1]);
 
    glColor3fv(colors[1]);
    glVertex3fv(vertices[1]);
    glVertex3fv(vertices[2]);
    glVertex3fv(vertices[6]);
    glVertex3fv(vertices[5]);
 
    glColor3fv(colors[2]);
    glVertex3fv(vertices[3]);
    glVertex3fv(vertices[7]);
    glVertex3fv(vertices[6]);
    glVertex3fv(vertices[2]);
 
    glColor3fv(colors[3]);
    glVertex3fv(vertices[0]);
    glVertex3fv(vertices[3]);
    glVertex3fv(vertices[7]);
    glVertex3fv(vertices[4]);
 
    glColor3fv(colors[4]);
    glVertex3fv(vertices[7]);
    glVertex3fv(vertices[4]);
    glVertex3fv(vertices[5]);
    glVertex3fv(vertices[6]);
 
    glColor3fv(colors[5]);
    glVertex3fv(vertices[4]);
    glVertex3fv(vertices[0]);
    glVertex3fv(vertices[1]);
    glVertex3fv(vertices[5]);
 
    glEnd();            // End Drawing The Cube
 
    glutSwapBuffers();
}
 
 
void Init(){
 
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
    glutInitWindowSize(700, 700);
    glutInitWindowPosition(0, 0);
 
    glutCreateWindow("Cube");
 
    glClearColor(1.0, 1.0, 1.0, 1.0);
 
    glEnable(GL_DEPTH_TEST);
 
}
 
int main(int argc, char **argv){
    glutInit(&argc, argv);
 
    Init();
 
    glutDisplayFunc(display);
    glutMainLoop();
 
    return 0;
}



 결과

 




 참고

 

 glEnable(GL_DEPTH_TEST) 를 사용하지 않으면 어떤 도형이 화면과 가까운지 체크할 수 없어 앞면과 뒷면이 구분되지 않는 문제가 발생한다.

반응형

'개발 > Open GL' 카테고리의 다른 글

루빅스 큐브 만들기1  (0) 2014.11.22
이미지 불러오기  (0) 2014.11.21
도형 그리기 및 이동  (0) 2014.11.03
[빌드 오류] failure during conversion to COFF: file invalid or corrupt  (0) 2014.10.17
Menu & SubMenu 생성  (11) 2014.10.09

도형 그리기 및 이동

Posted by 백창
2014. 11. 3. 10:19 개발/Open GL
반응형


 개요

 

마우스 드래그로 도형을 그리고 키보드 방향키를 눌렀을 때 그려진 도형이 이동


 소스

 

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
#include <gl/glut.h>
#include <stdio.h>
 
/**
* 도형이동크기
*/
#define Move 0.05
 
/**
* Mouse 좌표 계산
*/
GLint TopLeftX, TopLeftY, BottomRightX, BottomRightY;
/**
* 현재 도형 좌표
*/
GLdouble X1, X2, Y1, Y2;
 
/**
* My Display
*/
void MyDisplay(){
    glViewport(0, 0, 500, 500);
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(0.5, 0.5, 0.5);
 
    glBegin(GL_POLYGON);
 
    glVertex3f(X1, Y1, 0.0);
    glVertex3f(X1, Y2, 0.0);
    glVertex3f(X2, Y2, 0.0);
    glVertex3f(X2, Y1, 0.0);
 
    glEnd();
    glFlush();
}
 
/**
* Start Mouse
*/
void MyMouseClick(GLint Button, GLint State, GLint X, GLint Y){
    if (Button == GLUT_LEFT_BUTTON && State == GLUT_DOWN){
        TopLeftX = X;
        TopLeftY = Y;
    }
}
 
void MyMouseMove(GLint X, GLint Y){
    BottomRightX = X;
    BottomRightY = Y;
 
    //마우스로 인해 그려지는 도형의 좌표 값
    X1 = TopLeftX / 500.0;
    X2 = BottomRightX / 500.0;
    Y1 = (500 - TopLeftY) / 500.0;
    Y2 = (500 - BottomRightY) / 500.0;
 
    glutPostRedisplay();
}
/**
* End Mouse
*/
 
void MySpecial(int key, int x, int y){
    //키보드 방향에 따른 위치이동
    switch (key){
    case GLUT_KEY_LEFT:
        X1 -= Move;
        X2 -= Move;
        printf("[Debug] : left %f,%f\n", X1, X2);
        break;
    case GLUT_KEY_RIGHT:
        X1 += Move;
        X2 += Move;
        break;
    case GLUT_KEY_UP:
        Y1 += Move;
        Y2 += Move;
        break;
    case GLUT_KEY_DOWN:
        Y1 -= Move;
        Y2 -= Move;
        break;
    }
 
    glutPostRedisplay();
}
 
void MyInit(){
    glClearColor(1.0, 1.0, 1.0, 1.0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
 
    glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0);
}
 
int main(int argc, char **argv){
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB);
    glutInitWindowSize(500, 500);
    glutInitWindowPosition(0, 0);
    glutCreateWindow("Second");
    MyInit();
    glutDisplayFunc(MyDisplay);
    glutMouseFunc(MyMouseClick);
    glutMotionFunc(MyMouseMove);
    glutSpecialFunc(MySpecial);
 
    glutMainLoop();
    return 0;
}



 결과

 


반응형

'개발 > Open GL' 카테고리의 다른 글

이미지 불러오기  (0) 2014.11.21
정육면체 그리기  (0) 2014.11.21
[빌드 오류] failure during conversion to COFF: file invalid or corrupt  (0) 2014.10.17
Menu & SubMenu 생성  (11) 2014.10.09
freeglut API 설치  (0) 2014.09.29

[빌드 오류] failure during conversion to COFF: file invalid or corrupt

Posted by 백창
2014. 10. 17. 14:18 개발/Open GL
반응형


 개요

 

 Visual Studio 2010 에서 빌드를 할 때 다음과 같은 오류가 발생했을때의 해결방법.


failure during conversion to COFF: file invalid or corrupt



 해결

 

프로젝트 속성에서 Manifest Tool -> input and Output -> Embed Manifest 설정을 NO로 변경해준다.



반응형

'개발 > Open GL' 카테고리의 다른 글

정육면체 그리기  (0) 2014.11.21
도형 그리기 및 이동  (0) 2014.11.03
Menu & SubMenu 생성  (11) 2014.10.09
freeglut API 설치  (0) 2014.09.29
Open GL 설치  (0) 2014.09.12

Menu & SubMenu 생성

Posted by 백창
2014. 10. 9. 21:53 개발/Open GL
반응형


 개요

 

OpenGL에서 마우스 오른쪽 버튼을 누르면 나타나는 메뉴를 만들어보자.



 핵심코드

 

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
 
void MyMainMenu(int entryID) {
    if (entryID == 1)       exit(0);
 
    glutPostRedisplay();
}
 
/**
* Sphere Size Menu
*/
void SphereSizeMenu(int entryID) {
    if (entryID == 1){
        IsShape = 1;
        IsSmall = true;
    }
    else if (entryID == 2){
        IsShape = 1;
        IsSmall = false;
    }
    glutPostRedisplay();
}
 
 
void MyInit() {
    glClearColor(1.0, 1.0, 1.0, 1.0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
 
    glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0);
 
    /**
    * Sphere Size Menu
    */
    GLint SpereSizeID = glutCreateMenu(SphereSizeMenu);
    glutAddMenuEntry("Small Sphere", 1);
    glutAddMenuEntry("Large Sphere", 2);
 
 
    /**
    * Show the Menu
    */
    GLint MyMainMenuID = glutCreateMenu(MyMainMenu);
    glutAddSubMenu("Draw Sphere", SpereSizeID);
    glutAddSubMenu("Draw Torus", TorusSizeID);
    glutAddSubMenu("Draw Teapot", TeapotSizeID);
    glutAddSubMenu("Change Color", ChangeColorID);
}


위 코드와 같이 메뉴를 설정해주는 함수를 만들고 마지막 부분에 다시 출력해주는 glutPostRedisplay() 함수를 사용해준다.


 그리고 초기화 과정에서 방금 사용한 함수를 호출하고 메뉴 또는 서브메뉴를 추가해주면 된다.



 결과

 


마우스 오른쪽 버튼을 누르면 다음 메뉴들이 나오고 서브 메뉴도 나온다



변경된 화면

반응형

'개발 > Open GL' 카테고리의 다른 글

정육면체 그리기  (0) 2014.11.21
도형 그리기 및 이동  (0) 2014.11.03
[빌드 오류] failure during conversion to COFF: file invalid or corrupt  (0) 2014.10.17
freeglut API 설치  (0) 2014.09.29
Open GL 설치  (0) 2014.09.12