O m-file seta.m constitui um exemplo da função pretendida.
function [xs,ys,zs] = seta( r1 , r2 )
% SETA: Coordenadas de uma seta tridimensional.
%
% SINTAXE: [x,y,z] = seta(r1,r2)
%
xs = [] ; ys = [] ; zs = [] ;
r1 = r1(:);
r2 = r2(:);
% Verificar que r1 e r2 sao vectores 3D:
l1 = length( r1 );
l2 = length( r2 );
if l1 ~= 3, disp('O primeiro vector deve ser um vector 3D!'), return, end
if l2 ~= 3, disp('O segundo vector deve ser um vector 3D!'), return, end
% Definir uma seta unitaria no plano XZ:
xs = [0 0 0.9 0.9 1 0.9 0.9 0 0];
zs = [0 -0.05 -0.05 -0.1 0 0.1 0.05 0.05 0];
ys = zeros( size( xs ) ) ;
% Determinar as coordenadas esfericas do vector diferenca:
deltar = r2 - r1;
[theta,phi,r] = cart2sph(deltar(1),deltar(2),deltar(3));
% Multiplicar o versor pelo modulo do vector diferenca:
xs = xs*r ;
ys = ys*r ;
zs = zs*r ;
% Orientar o vector resultante segundo o vector diferenca:
[thetas,phis,rs] = cart2sph(xs,ys,zs);
[xs,ys,zs] = sph2cart(thetas+theta,phis+phi,rs);
% Deslocar o vector resultante para as coordenadas do ponto inicial:
xs = xs + r1(1) ;
ys = ys + r1(2) ;
zs = zs + r1(3) ;
O funcionamento da função pode ser verificado construindo um sistema de eixos ortogonais:
>> o = [0 0 0]; ex = [1 0 0]; ey = [0 1 0]; ez = [0 0 1];
>> [xX,yX,zX] = seta(o, ex);
>> [xY,yY,zY] = seta(o, ey);
>> [xZ,yZ,zZ] = seta(o, ez);
>> fill3(xX,yX,zX,'y',xY,yY,zY,'b',xZ,yZ,zZ,'r'), axis('equal')
Sugestões:
Orlando Camargo Rodríguez 2009-04-15