본문 바로가기

Software/Processing

Processing에서 Papaya library를 이용해서 행렬(Matrix) 연산하기

언어라고 해야할지 그냥 자바를 이용한 좀 편리한 도구라고 해야할지 요즘 들어서 오히려 약간 혼돈을 느끼지만 여전히 취미생활처럼 Processing을 아~~주 쪼금씩 데리고 놀고 있습니다. 약간 뭔가 의도한데로 되는지 조차 혼란이 오는 요즘... 내가 현재 괜찮은 방향으로 잘 가고 있는지.. 뭐 이딴 이상한 생각 따위를 살짝 접고 평온한 마음으로 지내는 것으로는 확실히 요런 언어(혹은 도구)로 뭔가 새로운 것을 조금씩 공부해보는 것이 참 좋은것 같습니다. 뭐 아무튼 그렇게 처음 Processing이라는 아이를 제 블로그에서 소개[바로가기]한 이 후 (근데 그것도 2013년 9월이니 아무리 취미처럼하는 공부라도 참 진도가 느립니다.ㅠㅠ) 그래프를 그리는 이야기만 했었는데요. 이번에는 라이브러리 하나 소개할려고 합니다.



이름은 좀 귀엽지만 여하튼 Papaya라는 라이브러리입니다.[바로가기] 설치는 원체 Processing이 잘 설명되어 있으니 패스하구요. 요 아이로 사실 뭐 많은 것을 할 수 있겠지만... 제가 주목했던건 행렬 연산 때문입니다.



위에 보이는 것처럼 Papaya의 많은 기능 중에 행렬 연산만 놓고 보면, 행렬 덧셈, 곱셈 등등



또 콘술창에 행렬을 바로 프린트하는 것, 행렬 요소끼리 곱하는 것, 디터미넌트, 역행렬 등등 필요한 행렬 연산기능을 다가지고 있네요. 딱 원하던 것입니다.^^


import papaya.*;

float[][] y0 = {{1,0,0,0},{0,1,0,0},{0,0,1,0},{0,0,0,1}};

float theta = 30*3.14/180;
float a = 100;

void setup() {
	size(60,60);
	noLoop();
}

void draw() {
	float[][] T = Mat.multiply(RotZ(theta), TransX(a));

	float[][] yT = Mat.multiply(T, y0);

	println("Original Matrix == >");
	Mat.print(y0, 2);
	println("--------------------");
	println("transform Matrix == >");
	Mat.print(yT, 2);
}

float[][] RotZ(float theta) {
	return new float[][]{{cos(theta), -sin(theta), 0,0},{sin(theta), cos(theta), 0,0},{0,0,1,0},{0,0,0,1}};
}

float[][] TransX(float a) {
	return new float[][]{{1,0,0,a},{0,1,0,0},{0,0,1,0},{0,0,0,1}};
}


아주아주 간단한 예제 하나 보죠. 좀 더 좋은 예제는 어차피 기본으로 제공되니까요^^. 위에서 쓰인 RotZ는 흔히 기구학에서 많이 쓰는 Z축 중심의 회전행렬이구요. TransX는 x축 방향으로 병진 이동하는 행렬을 정의한 것입니다. 초기 y0라는 행렬을 정의하고, z축으로 30도만큼 회전한 후 x축 방향으로 100만큼 이동한 결과를 확인하는 것이지요. Papaya 라이브러리의 행렬 클래스에서 행렬 곱셈과 행렬 프린터 기능을 사용했습니다.



위 화면이 콘술에 나타난 결과입니다. 4열에 나온 결과가 보이네요. (0,0,0)이라는 점이 최종적으로는 (86.62, 49.98, 0)으로 이동했음을 알 수 있네요. 뭐 여하튼 오늘은 Papaya라는 귀여운 이름의 라이브러리 하나를 소개했습니다.^^ 아 그리고 GitHub에 위 에제를 올려 두었으니 뭐 허접하지만 예제의 다운로드를 문의하시는 분들을 위해 올린거니까 [바로가기]에서 받으시면 됩니다.^^


반응형