Wednesday, July 15, 2020

Rotate matrix at arbitrarily angle

วันนี้มีปัญหาเกี่ยวกับการหมุน 2D เมทริกซ์ งมอยู่ซักพักก็คิดขึ้นมาได้ว่าทำยังไง

ก่อนอื่นต้องพูดว่า ถ้าอยากหมุนเมทริกซ์ 90 องศา มันมีคำสั่งง่าย คือ rot90(A) หรือง่ายกว่านั้นคือใช้คำสั่ง matrix transpose A.' แต่ถ้าอยากจะหมุน 45 องศาล่ะ ต้องทำยังไง 

สมมติ matrix ที่ต้องการหมุน, A, มีขนาด n x m

1. ก่อนอื่น สร้าง index array ขึ้นมาก่อน

x = linspace(-1,1,n);
y = linspace(-1,1,m);
[X,Y]=meshgrid(x,y);

2. กำหนดตัวแปร theta เพื่อบอกว่าจะหมุนกี่องศา และหมุน index array ตามสูตรนี้ (อ่านเพิ่มเติมเกี่ยวกับ rotation matrix ใน wikipedia ได้)

theta = pi/4;
Xq = X.*cos(theta) - Y.*sin(theta);
Yq = X.*sin(theta) + Y.*cos(theta);

3. หมุนmatrix A ด้วยคำสั่งinterp2

Vq = interp2(X,Y,A,Xq,Yq);

เท่านี้ก็เรียบร้อยแล้วค่ะ อยากจะหมุนกี่องศาก็เปลี่ยนตัวแปร theta เอา

หรือวิธีการหา Xq, Yq ที่สั้นกว่าแบบข้างบนคือ

[th, r] = cart2pol(X, Y);
[Xq, Yq] = pol2cart(th+pi/4, r);

No comments:

Post a Comment