From: <par...@us...> - 2011-11-03 17:21:23
|
Revision: 8955 http://octave.svn.sourceforge.net/octave/?rev=8955&view=rev Author: paramaniac Date: 2011-11-03 17:21:17 +0000 (Thu, 03 Nov 2011) Log Message: ----------- quaternion-oo: nicer display routine, add devel folder Modified Paths: -------------- trunk/octave-forge/extra/quaternion_oo/inst/@quaternion/display.m Added Paths: ----------- trunk/octave-forge/extra/quaternion_oo/devel/ trunk/octave-forge/extra/quaternion_oo/devel/demoml.m trunk/octave-forge/extra/quaternion_oo/devel/q2rot.m trunk/octave-forge/extra/quaternion_oo/devel/rot2q.m Added: trunk/octave-forge/extra/quaternion_oo/devel/demoml.m =================================================================== --- trunk/octave-forge/extra/quaternion_oo/devel/demoml.m (rev 0) +++ trunk/octave-forge/extra/quaternion_oo/devel/demoml.m 2011-11-03 17:21:17 UTC (rev 8955) @@ -0,0 +1,10 @@ +q = rot2q ([0, 0, 1], pi/4) + +% [vv, theta] = q2rot (q) + +x = quaternion (0, 1, 1, 0) % nicht normiert + % s x y z + +rx = q * x * conj (q) % q x q^-1 + +% [vv, theta] = q2rot (rx) Added: trunk/octave-forge/extra/quaternion_oo/devel/q2rot.m =================================================================== --- trunk/octave-forge/extra/quaternion_oo/devel/q2rot.m (rev 0) +++ trunk/octave-forge/extra/quaternion_oo/devel/q2rot.m 2011-11-03 17:21:17 UTC (rev 8955) @@ -0,0 +1,31 @@ +function [vv, theta] = q2rot (q) + + if (nargin ~= 1 || nargout ~= 2) + print_usage (); + end + + if (abs (norm (q) - 1) > 1e-12) + warning ('quaternion: ||q||=%e, setting=1 for vv, theta', norm (q)); + q = q / norm (q); + end + + s = q.s; + x = q.x; + y = q.y; + z = q.z; + + theta = acos (s) * 2; + + if (abs (theta) > pi) + theta = theta - sign (theta) * pi; + end + + sin_th_2 = norm ([x, y, z]); + + if (sin_th_2 ~= 0) + vv = [x, y, z] / sin_th_2; + else + vv = [x, y, z]; + end + +end \ No newline at end of file Added: trunk/octave-forge/extra/quaternion_oo/devel/rot2q.m =================================================================== --- trunk/octave-forge/extra/quaternion_oo/devel/rot2q.m (rev 0) +++ trunk/octave-forge/extra/quaternion_oo/devel/rot2q.m 2011-11-03 17:21:17 UTC (rev 8955) @@ -0,0 +1,33 @@ +function q = rot2q (vv, theta) + + if (nargin ~= 2 || nargout ~= 1) + print_usage (); + end + + if (~ isvector (vv) || length (vv) ~= 3) + error ('vv must be a length three vector'); + end + + if (~ isscalar (theta)) + error ('theta must be a scalar'); + end + + if (norm (vv) == 0) + error ('quaternion: vv is zero'); + end + + if (abs (norm (vv) - 1) > 1e-12) + warning ('quaternion: ||vv|| != 1, normalizing') + vv = vv / norm (vv); + end + + if (abs (theta) > 2*pi) + warning ('quaternion: |theta| > 2 pi, normalizing') + theta = rem (theta, 2*pi); + end + + vv = vv * sin (theta / 2); + d = cos (theta / 2); + q = quaternion (d, vv(1), vv(2), vv(3)); + +end \ No newline at end of file Modified: trunk/octave-forge/extra/quaternion_oo/inst/@quaternion/display.m =================================================================== --- trunk/octave-forge/extra/quaternion_oo/inst/@quaternion/display.m 2011-11-03 14:11:57 UTC (rev 8954) +++ trunk/octave-forge/extra/quaternion_oo/inst/@quaternion/display.m 2011-11-03 17:21:17 UTC (rev 8955) @@ -1,4 +1,4 @@ -## Copyright (C) 2010 Lukas F. Reichlin +## Copyright (C) 2010, 2011 Lukas F. Reichlin ## ## This program is free software: you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published by @@ -14,28 +14,52 @@ ## along with this program. If not, see <http://www.gnu.org/licenses/>. ## -*- texinfo -*- -## Display routine for quaternions. Used by Octave internally. +## Display routine for quaternions. Used by Octave internally. ## Author: Lukas Reichlin <luk...@gm...> ## Created: May 2010 -## Version: 0.1 +## Version: 0.2 function display (q) - inputname_str = inputname(1); + name = inputname(1); + s = size (q); + + if (ndims (s) == 2 && all (s == 1)) # scalar quaternion + w = num2str (q.w, 4); + x = __num2str__ (q.x); + y = __num2str__ (q.y); + z = __num2str__ (q.z); + disp (""); + disp ([name, " = ", w, x, "i" y, "j", z, "k"]); + disp (""); + else # non-scalar quaternion + disp ([name, ".w ="]); + disp (q.w); + disp (""); + disp ([name, ".x ="]); + disp (q.x); + disp (""); + disp ([name, ".y ="]); + disp (q.y); + disp (""); + disp ([name, ".z ="]); + disp (q.z); + disp (""); + endif - disp ([inputname_str, ".w ="]); - disp (q.w); - disp (""); - disp ([inputname_str, ".x ="]); - disp (q.x); - disp (""); - disp ([inputname_str, ".y ="]); - disp (q.y); - disp (""); - disp ([inputname_str, ".z ="]); - disp (q.z); - disp (""); +endfunction -endfunction \ No newline at end of file + +function str = __num2str__ (num) + + if (sign (num) == -1) + str = " - "; + else + str = " + "; + endif + + str = [str, num2str(abs (num), 4), " "]; + +endfunction This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |