Advertisement
MrBlaise

Rodrigues - Grafika

May 5th, 2016
1,577
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MatLab 2.50 KB | None | 0 0
  1. syms wx wy wz real;
  2. syms theta;
  3. assume(theta >=0);
  4. assumeAlso(theta <=2*pi);
  5.  
  6. r = sym('r', [1,3]);
  7. w = sym('w', [1,3]);
  8. assume(r, 'real');
  9. assume(w, 'real');
  10.  
  11. sample_w = [1,0,0];
  12. sample_r = [2,1,2];
  13. sample_theta = pi/3;
  14.  
  15. % Mind a ketto ugyanyanazt fejezi ki, a masodik a matrix megalkotasahoz a
  16. % masodik a matrix megalkotasat segiti, mert kihasznalom, hogy
  17. % r - w*(dot(r,w)) = -cross(w,cross(w,r))
  18. r_rot = r*cos(theta) + w*dot(r,w)*(1-cos(theta)) + cross(w,r)*sin(theta);
  19. r_rot_simple = r + cross(w,cross(w,r))*(1-cos(theta)) + cross(w,r)*sin(theta);
  20.  
  21. % Behelyettesitem az ertekeket mind a ket egyenletbe
  22. r_rot_value = subs(r_rot, [w, r, theta], [sample_w, sample_r, sample_theta]);
  23. r_rot2_value = subs(r_rot_simple, [w, r, theta], [sample_w, sample_r, sample_theta]);
  24.  
  25. disp(r_rot_value);
  26. disp(r_rot2_value);
  27. % Megnezem, hogy valoban sikerulte az egyszerusites, tehat a ket megoldas
  28. % egyezik
  29. if (logical(r_rot_value == r_rot2_value))
  30.     fprintf('Helyes egyszerusites, a két érték megegyezik!\n\n');
  31. else
  32.     fprintf('Elrontottad az egyszerusitest\n\n');
  33. end
  34.  
  35. % Megjelenitem a megoldast a sajat egyenletemmel, es egy egyszeru kez
  36. % szamolassal (lasd kozos doksi)
  37. disp('Levezetett egyenletbe beirva:')
  38. disp(double(r_rot2_value));
  39. disp('Kezzel kiszamolva:')
  40. kezzel = [2,0,0] + [0,1,2]*cos(pi/3) + [0,-2,1]*sin(pi/3);
  41. disp(kezzel);
  42.  
  43. % Ha egyezik a ketto akkor minden fasza
  44. if (double(r_rot2_value) >= kezzel - 0.001 & double(r_rot2_value) <= kezzel + 0.001)
  45.     fprintf('A ket ertek megegyezik!\n\n');
  46. else
  47.     fprintf('Nem egyezik a ket ertek\n\n');
  48. end
  49.  
  50. % K matrix szamolasa amire igaz lesz, hogy cross(w,r) = K*r
  51. K = [0,-wz,wy;wz,0,-wx;-wy,wx,0];
  52.  
  53. % K^2 szamolasa - cross(w,cross(w,r)) = K^2*r
  54. K_squared = K^2;
  55. % Kihasznalom, hogy pl.: -wz^2 -wy^2 = wx^2 - 1 (sqrt(x^2+y^2+z^2) = 1 miatt)
  56. K_squared_simple = [wx^2 - 1,wx*wy,wx*wz;wx*wy,wy^2-1,wy*wz;wx*wz,wy*wz,wz^2-1];
  57. % R matrix (rodrigues) szamolasa, amire igaz hogy r_rot = R*rT
  58. R = eye(3) + (1-cos(theta))*K_squared_simple + sin(theta)*K;
  59. R = simplify(R);
  60.  
  61. fprintf('Szamolas matrixal:\nA matrix altalanosan\n');
  62. disp(R);
  63. fprintf('\nA matrix a megadott adatok alapjan\n');
  64. R_value = subs(R, [wx, wy, wz, theta], [sample_w(1),sample_w(2),sample_w(3),sample_theta]);
  65. disp(R_value);
  66.  
  67. fprintf('\nMegoldas (R*rT):\n');
  68. disp(double(transpose(R_value*transpose(sample_r))));
  69.  
  70. if (transpose(R_value*transpose(sample_r)) == r_rot2_value)
  71.     fprintf('A ket ertek megegyezik!\n\n');
  72. else
  73.     fprintf('Nem egyezik a ket ertek\n\n');
  74. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement