【Perl】 行列の計算練習2 【画像処理】


引き続き行列の計算をお楽しみください。

 少しずつ行列の仕組みがわかってきたので
 少し応用を利かせてみる。
とりあえず、PerlOpenGLで練習。
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();
■結果
1















で、以下に変換内容。

こいつを平行移動させる場合
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;
}
■結果
2













拡大縮小の場合
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;
}
■結果
3













回転の場合
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;
}
■結果
4













合成
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;
}
■結果
5













とりあえず、コードには落としてみたが
理解は怪しいorz