【Perl】 行列の計算練習2 【画像処理】
引き続き行列の計算をお楽しみください。
少しずつ行列の仕組みがわかってきたので
少し応用を利かせてみる。
とりあえず、PerlとOpenGLで練習。
use strict;■結果
use PDL;
use PDL::Matrix;
use OpenGL ':all';
my $vec1 = vpdl [0.2, 0.3, 1.0];
my $vec2 = vpdl [0.5, 0.0, 1.0];
my $vec3 = vpdl [-0.1, 0.0, 1.0];
sub calc {
# ここで変換かける
}
sub display_func {
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_TRIANGLES);
glColor3f(1, 0, 0);
glVertex2f($vec1->at(0, 0), $vec1->at(1, 0));
glColor3f(0, 1, 0);
glVertex2f($vec2->at(0, 0), $vec2->at(1, 0));
glColor3f(0, 0, 1);
glVertex2f($vec3->at(0, 0), $vec3->at(1, 0));
glEnd();
glutSwapBuffers();
}
calc();
glutInit();
glutInitWindowSize(400, 400);
glutInitDisplayMode(GLUT_DOUBLE);
glutCreateWindow($0);
glutDisplayFunc(\&display_func);
glutIdleFunc(sub{glutPostRedisplay();});
glutMainLoop();
で、以下に変換内容。
こいつを平行移動させる場合
3*3の行列を用意する
mpdl [1, 0, mx], [0, 1, my], [0, 0, 1]
mxとmyには移動させたい数値を入れる
sub calc {■結果
my $mpdl = mpdl [1, 0, -0.5], [0, 1, -0.5], [0, 0, 1];
$vec1 = $mpdl x $vec1;
$vec2 = $mpdl x $vec2;
$vec3 = $mpdl x $vec3;
}
拡大縮小の場合
mpdl [sx, 0, 0], [0, sy, 0], [0, 0, 1]
sx,syには倍率を入れる
sub calc {■結果
my $mpdl = mpdl [2, 0, 0], [0, 2, 0], [0, 0, 1];
$vec1 = $mpdl x $vec1;
$vec2 = $mpdl x $vec2;
$vec3 = $mpdl x $vec3;
}
回転の場合
mpdl [cos(r), -sin(r), 0], [sin(r), cos(r), 0], [0, 0, 1]
rに回転させたい角度を入れる。
sub calc {■結果
use Math::Trig qw/deg2rad/;
my $r = deg2rad(45);
my $mpdl = mpdl [cos($r), -sin($r), 0], [sin($r), cos($r), 0], [0, 0, 1];
$vec1 = $mpdl x $vec1;
$vec2 = $mpdl x $vec2;
$vec3 = $mpdl x $vec3;
}
合成
0点へ移動、回転、もとある位置に戻すと
三角形の中間位置を0点として回転してくれる。
演算方法はそのまま掛け合わせてくだけ。
sub calc {■結果
use Math::Trig qw/deg2rad/;
my $r = deg2rad(45);
my $mpdl = mpdl [cos($r), -sin($r), 0], [sin($r), cos($r), 0], [0, 0, 1];
my $vec_m1 = mpdl [1, 0, -0.2],[0, 1, -0.3 / 2],[0, 0, 1];
my $vec_m2 = mpdl [1, 0, 0.2],[0, 1, 0.3 / 2],[0, 0, 1];
$vec1 = $vec_m2 x $mpdl x $vec_m1 x $vec1;
$vec2 = $vec_m2 x $mpdl x $vec_m1 x $vec2;
$vec3 = $vec_m2 x $mpdl x $vec_m1 x $vec3;
}
とりあえず、コードには落としてみたが
理解は怪しいorz