Coordenadas de uma seta tridimensional

O programador pretende criar um m-file que seja invocado com os dados de entrada r1 e r2, que definem as coordenadas de dois pontos no espaço tridimensional, e devolva como dado de saída as coordenadas de uma seta que liga os dois pontos entre si. Para gerar esta função o programador decide seguir a seguinte estratégia:
  1. Cria uma seta no plano $XZ$, com as coordenadas indicadas na Fig.1.
  2. Determina o vector $\mbox{$\mathbf{d}$}= \mbox{$\mathbf{r}$}_2-\mbox{$\mathbf{r}$}_1$.
  3. Determina as coordenadas esféricas de $\mbox{$\mathbf{d}$}$.
  4. Multiplica as coordenadas da seta unitária por $\left\vert \mbox{$\mathbf{d}$} \right\vert $.
  5. Orienta o vector resultante segundo $\mbox{$\mathbf{d}$}$.
  6. Desloca o vector resultante para $\mbox{$\mathbf{r}$}_1$.
Figura 1: Coordenadas da seta unitária usada no m-file seta.m.
O programador deve evitar a invocação da função com vectores que não sejam tridimensionais.

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:

  1. Crie uma animação ilustrando a soma de dois vectores com módulos iguais. No decorrer da animação o primeiro vector deve permanecer fixo, sempre orientado segundo a mesma direcção e sentido, enquanto que o segundo vector deve ir rodando progressivamente até concluir uma revolução completa.
  2. Crie uma animação mostrando a trajectória de um projéctil, assim como o correspondente vector posição, vector velocidade e vector aceleração.
  3. Modifique o m-file para que permita um maior controlo do aspecto da seta, como por exemplo o tamanho e o ângulo da cabeça, a sua altura, etc..

Orlando Camargo Rodríguez 2009-04-15