2015년 6월 8일 월요일

[인도베다수학] 곱셈


[인도베다수학] 곱셈 수학
2014.05.01. 11:37 수정 삭제
전용뷰어 보기
일의 자리가 5인 수의 제곱
곱셈을 암산할 때는 머리속으로 사각형을 그려보면 쉽게 할수 있습니다. 곱셈은 주로 사각형의 면적을 구할때 쓰이니까요.
25 x 25를 계산해봅시다. 먼저 머리속으로 25 x 25의 사각형을 생각하세요. 이제 사각형을 계산하기 쉽게 나눕니다. (20 + 5) x (20 + 5) 로 하면 쉽겠죠? 이렇게 하면 20 x 20, 5 x 20, 5 x 20, 5 x 5 4개의 사각형이 만들어 집니다. 정리하면 20 x (20 + 5 + 5) + 5 x 5 = 20 x 30 + 5 x 5  = 625가 됩니다.
사각형 생각하기 복잡하시면 그냥 이렇게 생각하시면 됩니다.
(십의 자리의 수 x (십의 자리의 수 + 10)) + 25 = (20 x 30) + 25 = 625
85 x 85를 계산해보면 (80 x 90) + 25 = 7225 쉽죠?

25를 곱하는 곱셈
어떤 수에 25를 곱하려고 하면 머릿속이 복잡해집니다. 하지만 100을 곱한다면 쉽죠. 25는 100을 4로 나누면 되죠? 따라서 100을 곱한후 4로 나누면 원래 구하려는 값을 구할수 있습니다.
32 x 25 = 32 x 100 / 4 = 3200 / 4 = 800

십의 자리가 수가 같은 수의 곱셈
이것도 사각형을 그려놓고 생각하면 쉽게 할수 있습니다. (라고 하더라구요 -_-) 근데 저는 사각형 생각하는데 왠지 복잡해서 이렇게 암산합니다.
십의 자리의 수 x (십의 자리의 수 + 일의 자리의 수의 합) + 일의 자리의 수의 곱
33 x 34를 계산해 보면 30 x (30 + (3 + 4)) + (3 x 4) = 1110 + 12 = 1122

십의 자리의 합이 10이고 일의 자리의 수가 같은 곱셉
(첫번째 십의 자리의 수 x 두번째 십의 자리의 수) + (일의 자리의 수 x (첫번째 십의 자리의 수 + 두번째 십의 자리의 수)) + (일의 자리의 수의 제곱)
83 x 23를 계산해 보면 (80 x 20) + (3 x (80 + 20)) + (3 x 3) = 1600 + 300 + 9 = 1909

100에 가까운 두 자릿수의 곱셈
100 x (100 - (100에서 첫번째 수를 뺀 값 + 100에서 두번째 수를 뺀 값)) + (100에서 첫번째 수를 뺀 값 x 100에서 두번째 수를 뺀 값)
96 x 97을 계산해보면 100 x (100 - (4 + 3)) + (4 x 3) = 100 x 93 + 12 = 9312

[Cocos2d-x] 메뉴

메뉴를 사용하려면 메뉴 아이템을 먼저 생성하고 메뉴에 추가해야 합니다. 메뉴 아이템을 생성할 수 있는 클래스는 여러가지가 있습니다. 필요에 맞게 골라서 사용하시면 됩니다.

  • MenuItemLabel
  • MenuItemAtlasFont
  • MenuItemFont
  • MenuItemSprite
  • MenuItemImage
  • MenuItemToggle
이중에서 MenuItemImage를 생성하려면 다음과 같이 하면 됩니다.

auto menuItem = MenuItemImage::create("normal.png", "pressed.png", 
CC_CALLBACK_1(HelloWorld::doClick, this)); // 평소 이미지, 눌렸을때 이미지, 눌렸을때 호출될 함수와 넘겨줄 인자 입니다.



doClick 함수는 없는 함수이므로 HelloWorldScene.h에 선언하고 HelloWorldScene.cpp에 구현해줘야 합니다.

// HelloWorldScene.h
class ...
{
...
void doClick(cocos2d::Object *sender);
}



// HelloWorldScene.cpp
...
void HelloWorld::doClick(Object *sender)
{
log("Menu is clicked"); // 메뉴를 누르면 디버그 창에 로그가 출력됩니다.
}


위와 같이 메뉴 아이템을 생성했으면 메뉴를 생성할수 있습니다.
auto menu = Menu::create(menuItem, NULL); // 여러개를 넣을수 있고 마지막은 NULL이어야 합니다.


아이템을 만들었으면 정렬을 하고 장면에 추가합니다.
menu->alignItemsVertically();
this->addChild(menu);

실행하면 가운데 메뉴 이미지가 보이고 클릭하면 디버그창에 로그가 출력될 것입니다.

위와 같은 방법으로 할때 메뉴가 여러개 있으면 콜백 함수를 메뉴마다 연결해야 하므로 함수를 메뉴 개수만큼 만들어야 합니다. 하지만 태그를 이용하면 모든 메뉴를 클릭했을때 한 하나의 콜백 함수로 처리할 수 있습니다.
bool HelloWorld::init()
{
...
auto menuItem1 = ...;
auto menuItem2 = ...;

menuItem1->setTag(1); // 메뉴 아이템에 태그를 지정합니다.
menuItem2->setTag(2);
...
}

void HelloWorld::doClick(Object *sender)
{
auto item = (MenuItem*)sender;
int i = item->getTag(); // 태그를 읽어와서 어떤 메뉴가 클릭되었는지 확인합니다.
log("%d th menu pressed", i);
}

[Cocos2d-x] 스프라이트

스프라이트를 이용해 화면에 이미지을 보여주려면 먼저 프로젝트에 이미지를 추가해야 합나다. 먼저 Resources 폴더 및에 images 폴더를 만들고 보여주려는 이미지를 넣습니다. 그리고 레이블에서 했던것처럼 images 폴더를 Xcode의 Resources밑으로 드래고 해서 놓으면 프로젝트에 추가가 됩니다.

스프라이트를 사용하려면 Sprite::create() 함수를 이용해서 인스턴스를 생성하면 됩니다.
auto man = Sprite::create("images/man.png");


스프라이트도 마찬가지로 위치, 색상, 투명도 등을 조절할수 있습니다.
man->setPosition(Point(100, 100)); // man.png를 (100, 100)에 보여줍니다.
man->setTextureRect(Rect(0, 0, 100, 100)); // 이미지중 가로로 0~100, 세로로 0~100 픽셀만 보여줍니다.
man->setColor(Color3B(0, 0, 255)); // 색상을 파란색으로 설정합니다.


생 성된 스프라이트를 장면에 넣으려면 레이블 처럼 addChild() 함수를 사용하면 됩니다. 모든 구성 요소는 Node 클래스를 상속받기 때문에 속성이 같고 사용할수 있는 함수도 거의 같습니다. 따라서 앞으로 자세히 언급하지 않겠습니다.
this->addChild(man);

간 혹 하나의 이미지가 아니라 두개 이상의 이미지가 같이 움직여야 할때가 있습니다. 예를 들면 주인공 머리 위에 떠다니는 에너지바 같은 거죠. 이럴때는 부모 스프라이트를 만들어 장면에 추가한 후 자식 스프라이트를 만들어 부모 스프라이트에 추가하면 됩니다.
auto parent = Sprite::create("images/parent.png");
this->addChild(parent); // 부모 스프라이트를 장면에 추가
auto child = Sprite::create("images/child.png");
parent->addChild(child); // 자식 스프라이트를 부모에 추가

[Cocos2d-x] 레이블


[Cocos2d-x] 레이블 Cocos2d-x / Programming
2014.05.01. 00:39 수정 삭제
전용뷰어 보기


내장된 트루 타입 폰트(이하 TTF) 사용하기
레이블은 LabelTTF 클래스를 이용해 사용할수 있습니다. HelloWorldScene.cpp의 init() 함수에 넣으면 됩니다.
// 출력할 문자열, 폰트 이름, 폰트 크기를 넣고 LabelTTF 클래스의 인스턴스를 생성합니다.
auto lable = LabelTTF::create("Hello World", "Arial", 32);

위치는 setPosition(), 색상은 setColor(),  투명도는 setOpacity() 함수로 설정할수 있습니다. 이 함수들은 레이블 뿐만 아니라 화면에 보여주는 모든 구성 요소에 적용할수 있습니다.
label->setPosition(Point(100, 100)); // (100, 100)의 위치에 문자열을 출력합니다.
label->setColor(Color3B(255, 0, 0); // 문자열의 색상을 빨간색으로 합니다.
label->setOpacity(100.0f); // 불투명하게 설정합니다.

위의 함수들은 여러가지 인자 형식을 가질수 있습니다.  Xcode의 경우 label->을 입력하면 사용할수 있는 함수 목록이 뜨기 때문에 어떤 인자 형식을 가지는 함수를 사용할지 쉽게 선택할수 있습니다.

이제 레이블에 대한 설정이 다 끝났으면 화면에 보여줘야 합니다.
this->addChild(label); // 장면에 레이블을 추가합니다.


추가한 TTF 사용하기
TTF 파일을 추가하려면 프로젝트의 Resources 폴더에 fonts 폴더를 만들고 TTF 파일을 넣어주세요. 그리고 fonts 폴더를 드래그 해서 Xcode의 Resouces 폴더 밑으로 내려놓으면 창이 하나 뜨는데 Folders 에서 두번째를 선택하고 Add to targets는 iOS를 선택하세요. 이렇게 하면 Xcode에서 Resources 밑에 fonts 폴더가 추가되었다고 인식합니다.

TTF를 추가했다고 해서 방법이 다른건 아니고 내장된 TTF를 사용할때랑 방법은 같습니다. 다른점은 폰트 이름입니다.
auto label = LabelTTF::create("Hello World", "fonts/Verdana.ttf", 32);

생성된 레이블은 위치, 색상, 투명도 등을 설정하여 장면에 넣을수 있습니다.

[C++11] tuple


[C++11] tuple C++11 / Programming
2014.04.30. 17:33 수정 삭제
전용뷰어 보기
함수를 만들때 간혹 2개 이상의 값을 한번에 리턴해야 할 경우가 있습니다. 이럴때 기존에는 구조체를 정의하고 구조체 변수를 하나 선언한 후 값을 넣고 리턴해야 했습니다. 단지 리턴값을 여러개 받고 싶을 뿐인데 구조체를 정의해야 한다는 것이 좀 부담이었죠.

C++11에서는 이런 불편함을 없애기 위해 tuple을 도입했습니다. tuple을 사용하면 2개 이상의 변수를 한번에 묶어서 리턴할 수 있습니다. tuple을 사용하기 위해서는 #include <tuple>을 추가해야 합니다. tuple은 다음과 같이 생성하고 사용할 수 있습니다.

// int, int, string 타입으로 tuple 생성
std::tuple<int, int, std::string> items = std::make_tuple(1, 2, "test");
// std::tuple<int, int, std::string> items(1, 2, "test"); // 이렇게 해도 가능합니다

std::cout << std::get<0>(items) << std::endl; // 첫번째 값을 출력합니다. 값은 1입니다.
std::cout << std::get<1>(items) << std::endl; // 두번째 값을 출력합니다. 값은 2입니다.
std::cout << std::get<2>(items) << std::endl; // 세번째 값을 출력합니다. 값은 test입니다.

std::get<0>(items) = 5; // 첫번째 값을 5로 변경합니다.
빈 값으로 tuple을 생성하고 나중에 값을 저장할 수도 있습니다.

tuple의 데이터 개수는 tuple_size 함수를 이용해 알아낼수 있습니다. 위와 같이 tuple을 만들었다면 count가 3이 될것입니다.
auto count = std::tuple_size<decltype(items)>::value;


tie 함수를 이용하면 tuple에 데이터를 하나씩 넣지 않고 여러개를 한번에 넣거나 읽어올수도 있습니다.
std::tuple<int, int, std::string> items(1, 2, "test");

int a, b;
std::string str;
std::tie(a, b, str) = items; // a는1, b는 2, str은 test가 들어갑니다.


모두 넣지 않고 일부만 넣을수도 있습니다.
std::tie(a, std::ignore, str) = items; // a는1, str은 test가 들어갑니다.


tuple을 합치려면 tuple_cat 함수를 사용하면 됩니다.
std::tuple<int, int, std::string> items1(1, 2, "test1");
std::tuple<int, int, std::string> items2(3, 4, "test2");

auto tupleSet = std::tuple_cat(items1, items2); // tupleSet은 1, 2, test1, 3, 4, test2 가 됩니다.

[C++11] 퍼펙트 포워딩

함수의 인자로 받은 값을 변경했을때 함수의 외부로 적용되게 하려면 참조 또는 포인터로 받아야 합니다. 여기서는 참조로만 받는다고 가정합니다.
void increment(int &i)
{
i++;
}

int main()
{
int a = 1;
increment(a);
// increment(1); // 에러가 발생합니다.

return 0;
}
increment(1)을 성공하게 하려면 함수 오버로딩을 사용하면 됩니다. 하지만 귀찮죠?

C++11의 R-Value 레퍼런스를 사용하면 함수 오버로딩을 사용하지 않아도 해결할수 있습니다.
void increment(int &&i)
{
i++;
}

하지만 컴파일해보면 이번엔 increment(a)에서 에러가 발생합니다. R-Value 레퍼런스를 사용하여 인자를 넘기려면 메모리를 이동해야 하는데 이를 위해 std::move() 함수를 사용하면 됩니다.
 increment(std::move(a)); // 에러가 발생하지 않습니다

[Cocos2d-x] 화면에 구성 요소 추가

프로젝트를 생성하면 여러 파일들이 있는 것을 볼수 있습니다. 저는 한 장면에 여러 구성 요소들을 넣으면서 공부할 생각이라 화면을 관장하는 HelloWorldScene.h와 HelloWorldScene.cpp를 주로 수정할 것입니다.
멤버 변수는 HelloWorldScene.h에 넣고 구성 요소의 생성 및 등록은 HelloWorldScene.cpp의 init() 함수에서 하면 됩니다.

Cocos2d-x의 구성 요소는 모두 ClassName::create() 함수로 생성할수 있습니다. 반환값은 아시다시피 생성한 클래스의 인스턴스입니다. 나중에 소멸은 자동으로 되니 신경쓰지 않아도 됩니다.
이 제 생성을 했으니 등록을 해야겠죠? 등록은 addChild 함수를 이용하면 됩니다. 어디에다 하냐면 장면에다 해야겠죠. HelloWorldScene 클래스가 장면이니 this->addChild(instance)를 호출하면 됩니다. 이렇게 하면 장면에 추가한 구성 요소가 보입니다.