8/12

 

#2020.08.12


*오늘 할 일


1. C로 Cellular Automata 구현해보기

2. Unity Scene에서 카메라가 어떤 역할을 하는 친구인지, 걔가 Magic leap의 카메라와 어떻게 연동되는 건지 알아보기

3. 버튼을 누를 때 마다 구가 하나씩 떨어지게 수정해보기

4. Magic leap에서 시점 설정? 하는거 공부하기



*오늘 한 일


1. C로 Cellular Automata 구현해보기

- 코드 < 개발환경: VS 2019>


#define _CRT_SECURE_NO_WARNINGS
#define rep 5000

#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
#include <conio.h>

void get_board_size(int* range);
int** create_board(int range);
void print_board(int range, int** pBoard, int cur_row, int cur_col);
void initiate_board(int** pBoard, int* cur_row, int* cur_col, int range);
void check_limit(int cur_row, int cur_col, int range);
void calc_board(int** pBoard, int** pBoardchange, int range);
void calc_nbhd(int** pBoard, int** pBoardchange, int col, int row, int range);
void move_board(int** pBoard, int** pBoardchange, int range);

int main()
{
int range = 0;
int** pBoard;
int** pBoardchange;
int cur_row = 0, cur_col = 0;

// 보드의 사이즈를 입력받는다. 
get_board_size(&range);

// 동적할당으로 배열을 만든다.
pBoard = create_board(range);
pBoardchange = create_board(range);
//printf("여기까진 성공!1");
print_board(range, pBoard, cur_row, cur_col);
//printf("여기까진 성공!2");
// 보드의 시작값을 입력해준다. 
initiate_board(pBoard, &cur_row, &cur_col, range);
//printf("여기까진 성공!3");
for(int i = 1; i<rep+1; i++)
{
print_board(range, pBoard, -1, -1);
//printf("여기까진 성공!4");
calc_board(pBoard, pBoardchange, range);
printf("\n\n<<%d 회차>>\n", i);
move_board(pBoard, pBoardchange, range);
}

return 0;
}

// 보드의 사이즈를 입력받아 포인터로 넘겨주는 함수
void get_board_size(int *range)
{
int check_input = 0;
do{
printf("size of board: ");
check_input = scanf("%d", range);

if (check_input == 0)
printf("입력에 실패했습니다.");
else if (*range < 10 || *range > 40)
printf(" 10 이상 40 이하의 숫자만 입력해주세요. \n");
else
break;
} while (1);

return;
}

//입력받은 사이즈의 보드를 만들어주는 함수
int** create_board(int range)
{
int** pBoard = malloc(sizeof(int*) * range);
if (pBoard == NULL)
{
printf("동적할당 실패\n");
return NULL;
}

for (int i = 0; i < range; i++)
{
pBoard[i] = malloc(sizeof(int) * range);
for (int j = 0; j < range; j++)
{
pBoard[i][j] = -1;
}
}
return pBoard;
}

//보드를 출력하는 함수
void print_board(int range, int** pBoard, int cur_row, int cur_col)
{
system("cls");
printf("\n");
for (int i = 0; i < range; i++)
{
for (int j = 0; j < range; j++)
{
//해당 위치에 커서가 있다면 색을 바꿔서 출력
if (cur_row == i && cur_col == j)
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 11);

if (pBoard[i][j] == -1)
printf("□");
else if (pBoard[i][j] == 1)
printf("■");
else
printf("보드에 -1과 1 이외의 숫자가 들어가 있다\n");

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7);
}
printf("\n");
}
}

//보드를 초기화하는 함수
void initiate_board(int** pBoard, int* cur_row, int* cur_col, int range)
{
char key_input;

do{

print_board(range, pBoard, *cur_row, *cur_col);
printf("\n<<초기 세포 선택하기>>\n\ni: Up j: Left k: Down l: Right | 스페이스 바 : 세포 선택 | E 또는 e : 선택 종료\n\n");

key_input = _getch();

if (key_input == 106)// j-left 입력
*cur_col -= 1;
else if (key_input == 105)// i-up 입력
*cur_row -= 1;
else if (key_input == 108)// l-right 입력
*cur_col += 1;
else if (key_input == 107)// k-down 입력
*cur_row += 1;
else if (key_input == 32)// 스페이스바 입력
{
pBoard[*cur_row][*cur_col] *= -1;
}
else if (key_input == 69 || key_input == 101)// E 또는 e 입력
{
printf("E를 입력받았습니다.\n");
break;
}
else
printf("잘못된 입력\n");

check_limit(cur_row, cur_col, range);
} while (1);
}

//이동이 가능한지 확인하는 함수. 커서가 범위를 벗어나면 가장가리로 데려오는 역할
void check_limit(int* cur_row, int* cur_col, int range)
{
if (*cur_row < 0)
*cur_row = 0;
else if (*cur_row > range-1)
*cur_row = range-1;
if (*cur_col < 0)
*cur_col = 0;
else if (*cur_col > range-1)
*cur_col = range-1;
}

//현재 보드의 정보를 가지고 다음 상황을 계산하는 함수
void calc_board(int** pBoard, int** pBoardchange, int range)
{
for (int i = 0; i < range; i++)
{
for (int j = 0; j < range; j++)
{
calc_nbhd(pBoard, pBoardchange, j, i, range);
}
}

//printf("\n\n확인");

//print_board(range, pBoard, -1, -1);
//print_board(range, pBoardchange, -1, -1);

}

//다음 상황을 계산해주는 함수
void calc_nbhd(int** pBoard, int** pBoardchange, int col, int row, int range)
{
int count = 0, count_col_min = col - 1, count_col_max = col + 1, count_row_min = row - 1, count_row_max = row + 1;
int i=0, j=0;

if (row <= 0)
count_row_min = 0;
else if (row >= range-1)
count_row_max = range-1;
if (col <= 0)
count_col_min = 0;
else if (col >= range-1)
count_col_max = range-1;


//printf("\n\nrow: %d, col: %d, count_row_min: %d, count_row_max: %d, count_col_min: %d, count_col_max: %d\n\n\n", row, col, count_row_min, count_row_max, count_col_min, count_col_max);


for (i = count_row_min; i <= count_row_max; i++)
{
for (j = count_col_min; j <= count_col_max; j++)
{
if (pBoard[i][j] == 1)
{
count++;
}
            }
}

if (pBoard[row][col] == -1)//기준 세포가 죽어있을 경우
{
if (count == 3)
pBoardchange[row][col] = pBoard[row][col] * (-1);
else
pBoardchange[row][col] = pBoard[row][col] * 1;
}
else if (pBoard[row][col] == 1)//기준 세포가 살아있을 경우
{
--count;
if (count == 2 || count == 3)
pBoardchange[row][col] = pBoard[row][col] * 1;
else
pBoardchange[row][col] = pBoard[row][col] * (-1);
}


//print_board(range, pBoard, -1, -1);
//print_board(range, pBoardchange, -1, -1);
//printf("%d, %d", i, j);
}

//pBoardchange의 내용을 pBoard로 옮겨주는 함수
void move_board(int** pBoard, int** pBoardchange, int range)
{
for (int i = 0; i < range; i++)
{
for (int j = 0; j < range; j++)
{
pBoard[i][j] = pBoardchange[i][j];
pBoardchange[i][j] = -1;
}
}
return;
}



- 임의로 찍으면 살리기 무척 어렵다.
- Life of Game을 유니티에서 구현해보자
- 강화학습



2. Unity Scene에서 카메라가 어떤 역할을 하는 친구인지, 걔가 Magic leap의 카메라와 어떻게 연동되는 건지 알아보기 + 4. Magic leap에서 시점 설정? 하는거 공부하기



- Unity 프로젝트를 실행시키면 실행 화면에 나타나는 장면이 카메라에 보이는 장면에서 비롯된다. 
- Unity에서 Magic Leap 프로젝트를 만들기 위해 해주어야 하는 사전 설정이 몇가지 있는데, 그 중 하나는 Magic Leap 라이브러리를 임포트해서 Scene의 카메라를 Magic Leap Assets 의 카메라로 바꾸어주는 것이다. 

Magic Leap Assets의 Main Camera 설정에는 다음과 같은 컴포넌트가 있다. 


이 설정을 바탕으로 Magic Leap 를 구현시키면 카메라가 머리를 따라 움직이도록 설계되어 있는 것 같다. 

그런데 어제 Magic Leap에서 실행시킨 유니티 프로젝트는 머리 방향을 따라 움직이지 않고 랜덤한 장소에 가만히 놓여있었다. 
=> 카메라 위치설정을 건드리지 말고 새로운 오브젝트를 카메라 방향에 맞도록 두어야겠다. 


3. 버튼을 누를 때 마다 구가 하나씩 떨어지도록 수정해보기




















댓글

이 블로그의 인기 게시물

0817 : Hand Tracking

0701_Using server in Unity