Professional Documents
Culture Documents
Autor:
V. J. M. J. / A. M. M. J.
Rotar y trasladar funciones 2D y 3D con vectores de traqueo
Versión Mejorada
Índice general
INTRODUCCIÓN
1.- DESARROLLO
3.- GRAFICAR EN 2D
5.- GRAFICAR EN 3D
INTRODUCCIÓN
La cinemática es la ciencia del movimiento que trata el tema sin considerar las fuerzas que lo ocasionan. Dentro de esa ciencia se estudian la
posición, la velocidad, la aceleración y todas las demás derivadas de alto orden de las variables de posición. En consecuencia, el estudio de la
cinemática de manipuladores se refiere a todas las propiedades geométricas y basadas en el tiempo del movimiento.
La manipulación de robots implica el movimiento de piezas y diferentes herramientas en el espacio. Para hacer la representación de estas piezas
es necesario definir sistemas de coordenadas.
Para que un robot pueda manipular ciertos objetos, es necesario saber la posición y orientación de la pieza respecto al robot. Para poder hacer
esto, existen métodos para la representación de posición y orientación espacial de un objeto.
Utilizar la matriz de transformación homogénea es uno de ellos. También se pueden desarrollar por cuaterniones, el cual es un método
computacional que se utiliza por algunos robots comerciales para la representación de la orientación.
Es necesario tener conocimientos sobre Ángulos de Euler igualmente. Los ángulos de Euler constituyen un conjunto de tres coordenadas
angulares que sirven para especificar la orientación de un sistema de referencia de ejes ortogonales, normalmente móvil, respecto a otro sistema
de referencia de ejes ortogonales normalmente fijos.
Fueron introducidos por Leonhard Euler en mecánica del sólido rígido para describir la orientación de un sistema de referencia solidario con un
sólido rígido en movimiento.
1.- DESARROLLO
Para este desarrollo es importante recordar las matrices de rotación, tanto aquellas que rotan en el mismo sentido al de las agujas del reloj
(Generadas por un ángulo trigonométrico negativo), como las que rotan en sentido inverso (Generadas por un ángulo trigonométrico positivo).
Matrices de giro con ángulos de Euler en el mismo sentido de las agujas del reloj
Y la matriz de transformación general para la rotación en el mismo sentido al de las agujas del reloj (Generadas por un ángulo trigonométrico
negativo):
Matrices de giro con ángulos de Euler en el sentido opuesto de las agujas del reloj
Interface del programa de una función que permite graficar el desplazamiento de funciones 2D o 3D en tiempo real
Sirve para rotar funciones con respecto a cualquiera de los ejes X, Y o Z, aplicando matrices de transformación básicas, y la matriz de transformación
general. Se puede seleccionar una cuarta opción referente a rotar la función, que es empleando la matriz de “Eje arbitrario” estudiada en cinemática
de robots manipuladores.
Interface del programa de una función f(x) = x^4 operando en tiempo real con un angulo positivo de 90 grados
La interfaz cuenta con una parte donde se grafica la función que el usuario ingrese, ya sea f(x) o en su defecto f(x,y), además de seis cajas de texto,
dos para ingresar las respectivas funciones, una tercera para el ángulo que se rotará, y las últimas tres son para ingresar cada uno de los tres
componentes del vector arbitrario con respecto al cual rotará (Si así se elige) la función, cuenta también con dos ‘popupmenu’ en los cuales se elige
una de las tres trayectorias, y en el otro uno de los cuatro diferentes ejes con respecto a los cuales rotar. Finalmente, la interfaz tiene un ‘slider’ que
sirve para aumentar la velocidad de la animación hasta veinte veces y un botón que sirve para iniciar la animación como se puede visualizar en la
siguiente figura:
Si desea ejecutar el programa con una función f(x). Deberá seguir en la zona del panel de mandos los siguientes pasos:
1.- Tipear una función en la celda denominada "f(x)=", por ejemplo: sin(x)
2.- En la celda denominada "Angulo de rotación" tipear el valor del ángulo que se desea rotar negativo o positivo (Puede ser de más de una vuelta)
3.- En el selector denominado "Rotar con respecto a" hacer clik para elegir un eje de giro determinado
4.- En el selector denominado "Elija una de tres trayectorias" hacer clik para elegir una determinada
5.- Si en el paso anterior selecciono Rotar con respecto a EJE ARBITRARIO debe ingresar un valor numérico en cada celda de "Componentes
del eje arbitrario". Por el contrario, si solo selecciono EJE X - EJE Y o EJE Z, entonces puede dejar en blanco estas celdas
6.- En el selector HScroll denominado "Velocidad (0 - 20)" debe deslizarlo para seleccionar el valor de la velocidad de rotación
7.- Listo ahora puede ejecutar la tecla denominada "INICIAR SIMULACION" y podrá apreciar como su función f(x) sigue una trayectoria
determinada, seguida por dos vectores de traqueo (Vector verde de traqueo horizontal y Vector rojo de traqueo vertical). Además de tener un vector
de referencia color azul, el que indicara la posición inicial de la trayectoria que se sigue.
Interface del programa de una función f(x) = sin(x) operando en tiempo real con un angulo positivo de 90 grados
Interface del programa de una función f(x,y) = x^3*y^3 operando en tiempo real con un angulo positivo de 360 grados
Si desea ejecutar el programa con una función f(x,y). Seguir los siguientes pasos:
1.- Tipear una función en la celda denominada "f(x,y)=", por ejemplo: sin(x)*cos(x)
2.- En la celda denominada "Angulo de rotación" tipear el valor del ángulo que se desea rotar negativo o positivo (Puede ser de más de una vuelta)
3.- En el selector denominado "Rotar con respecto a" hacer clik para elegir un eje de giro determinado
4.- En el selector denominado "Elija una de tres trayectorias" hacer clik para elegir una determinada
5.- Si en el paso anterior selecciono Rotar con respecto a EJE ARBITRARIO debe ingresar un valor numérico en cada celda de "Componentes
del eje arbitrario". Por el contrario, si solo selecciono EJE X - EJE Y o EJE Z, entonces puede dejar en blanco estas celdas
6.- En el selector HScroll denominado "Velocidad (0 - 20)" debe deslizarlo para seleccionar el valor de la velocidad de rotación
7.- Listo ahora puede ejecutar la tecla denominada "INICIAR SIMULACION" y podrá apreciar como su función f(x) sigue una trayectoria
determinada, seguida igualmente por dos vectores de traqueo. Además de tener un vector de referencia color azul que indicara la posición inicial
de la trayectoria que se sigue.
Interface del programa de una función f(x,y) = sin(x)*cos(y) operando en tiempo real con un angulo positivo de 360 grados
NOTA.- En este proyecto se deben considerar las matrices que generan una rotación en el mismo sentido al de las agujas del reloj tanto para
movimientos en el mismo sentido de las agujas como para movimientos en sentido opuesto. La explicación es la siguiente:
Al momento de ingresar el ángulo este debe ser ingresado con signo de forma tal que el programa automáticamente reemplaza este valor en el
ángulo de la matriz generando automáticamente el tipo de rotación señalada por el usuario.
Interface del programa de una función f(x) = x^2+2*x operando en tiempo real con un angulo negativo de 360 grados
3.- GRAFICAR EN 2D
Primero se obtiene la función en la variable ‘S’ pero en forma de cadena de carácter, utiliza la función ‘vectorize(inline(s))’ para evaluar dichos
caracteres y si el programa lo reconoce, lo convierte a una función. Los arreglos ‘salidaxx’, ‘salidayy’, y ‘salidazz’, son los vectores que se utilizarán
para guardar todo el conjunto de datos de la función, que después se multiplicarán por la matriz de rotación.
Parte de las líneas del programa de la interface
En el ciclo se observa cómo se crea un vector ‘b’ que contiene todos los datos de pares ordenados de la función.
Y también se observa cómo se rellena ‘salidaxx’ y ‘salidayy’ con los datos de la función, nótese que dichos vectores primero se declaran con un
tamaño necesario, pero rellenos de ceros.
Como se puede observar en la figura anterior, el caso mostrado es para cuando se requiera girar con respecto a X. ‘co’ es un vector de 3x1 que
tiene los valores de la función f(x) en las tres coordenadas.
Nótese que la trayectoria uno que es la que se muestra es una circunferencia parametrizada. ‘Rx’ es la matriz de rotación básica con respecto al
eje ‘X’. Se aprecia que ‘co_R’ es el resultado de multiplicar la matriz de rotación con respecto a ‘X’ de 3x3, por el vector de 3x1 que contiene todos
los elementos de la función a rotar, por ello ‘co_R’ es de dimensiones de 3x1. Y dicho vector contiene todas las coordenadas de la función ya rotada.
Por ello se nota un efecto de rotación. Para trasladar dicha función por la circunferencia parametrizada (que representa la trayectoria número 1),
simplemente se le suman a cada uno de los elementos del vector que contiene los elementos de la función ya rotada, los elementos en ‘X’, ‘Y’ y ‘Z’
de la circunferencia para que se vea el efecto de que no sólo está rotando la función, sino que también se mueve a lo largo de dicha circunferencia.
5.- GRAFICAR EN 3D
Cuando se teclea en el cuadro de texto correspondiente a la función f(x,y), automáticamente el valor de la variable llamada ‘variables’ cambia a 2.
Pero para poder graficar en 3 dimensiones es necesario crear un mallado en MATLAB con la función ‘meshgrid’, pero antes de ello es imperativo
declarar los valores del dominio, tanto de la variable independiente ‘x’ como los de la variable ‘y’, por ello se declara con la función ‘linspace’ un
vector de veinticinco valores que irán de ‘-2*pi’ hasta ‘2*pi’.
Parte de las líneas del programa de la interface
Después se utiliza la función ‘vectorize’ de la misma forma que ya se había comentado anteriormente, pero ahora, con el fin de reconocer una
función de dos variables independientes f(x,y) con el fin de graficar en tres dimensiones. Como se puede observar en la línea 100, directamente
después de teclear la función, la misma se gráfica. esto con la ayuda de la función ‘surfc’.
Asimismo, si la trayectoria es la numero uno, entonces se utiliza la misma circunferencia parametrizada como trayectoria uno. Es necesario tener
en un vector los elementos de ‘X’, ‘Y’ y ‘Z’ de la función de tres dimensiones, para eso, se utilizan dos iteraciones, que estarán llenando el número
de filas y columnas de cada uno de los elementos de la función, y a la vez, guardando dichos elementos como partes de un vector de 3x1, el cual
es el ‘vector_z’, dicho vector se multiplicará por la matriz de rotación de ‘X’ y así se obtendrán en el vector ‘Rot_x’ los valores de los componentes
de ‘X’, ‘Y’ y ‘Z’ de la función pero ya rotada con respecto a ‘X’.
Pero para trasladar la función a lo largo de la circunferencia que representa la trayectoria uno, se empleó la misma técnica que se utilizó en dos
dimensiones, simplemente se le suman a cada uno de los elementos del vector que contiene los elementos de la función ya rotada, los elementos
en ‘X’, ‘Y’ y ‘Z’ de la circunferencia para que se vea el efecto de que no sólo está rotando la función, sino que también se mueve a lo largo de dicha
trayectoria, esto se ve en la línea de código donde aparece la función surf(X+x1,Y+y1,Z+z1).
Y de esa forma, básicamente es como se realizó esta interfaz. Lo demás son una serie de sentencias y condiciones necesarias para que se pudiera
realizar como se esperaba.
7. LÍNEAS DEL ALGORITMO DEL PROGRAMA GRAFICAR.m
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Programa de una funcion que permite graficar el desplazamiento de funciones 2D o 3D en tiempo real
%
% Si desea ejecutar el programa con una funcion f(x). Seguir los siguientes pasos:
% 1.- Tipear una funcion en la celda denominada "f(x)=", por ejemplo: sin(x)
% 2.- En la celda denominada "Angulo de rotacion" tipear el valor del angulo que se desea rotar (Puede ser de mas de una vuelta) negativo o positivo
% 3.- En el selector denominado "Elija una de tres trayectorias" hacer clik para elegir una determinada
% 4.- En el selector denominado "Rotar con respecto a" hacer clik para elegir un eje de giro determinado
% 5.- Si en el paso anterior selecciono Rotar con respecto a EJE ARBITRARIO debe ingresar un valor numerico en cada celda de "Componentes del eje arbitrario"
% Por el contrario si solo selecciono EJE X - EJE Y o EJE Z. Entonces puede dejar en blanco estas celdas
% 6.- En el selector HScroll denominado "VELOCIDAD (0-20)" debe deslizarlo para seleccionar el valor de la velocidad de rotacion
% 7.- Listo ahora puede ejecutar la tecla denomida "INICIAR SIMULACION" y podra apreciar como su funcion f(x) sigue una trayectoria determinada
%
% Si desea ejecutar el programa con una funcion f(x,y). Seguir los siguientes pasos:
% 1.- Tipear una funcion en la celda denominada "f(x,y)=", por ejemplo: sin(x)*cos(x)
% 2.- En la celda denominada "Angulo de rotacion" tipear el valor del angulo que se desea rotar (Puede ser de mas de una vuelta) negativo o positivo
% 3.- En el selector denominado "Elija una de tres trayectorias" hacer clik para elegir una determinada
% 4.- En el selector denominado "Rotar con respecto a" hacer clik para elegir un eje de giro determinado
% 5.- Si en el paso anterior selecciono Rotar con respecto a EJE ARBITRARIO debe ingresar un valor numerico en cada celda de "Componentes del eje arbitrario"
% Por el contrario si solo selecciono EJE X - EJE Y o EJE Z. Entonces puede dejar en blanco estas celdas
% 6.- En el selector HScroll denominado "VELOCIDAD (0-20)" debe deslizarlo para seleccionar el valor de la velocidad de rotacion
% 7.- Listo ahora puede ejecutar la tecla denomida "INICIAR SIMULACION" y podra apreciar como su funcion f(x,y) sigue una trayectoria determinada
%
%
% Tambien se debe recordar las siguientes matrices de rotacion 3D para cada Eje y para cada tipo de angulo (Positivo o Negativo). Para estas matrices el angulo debe ser considerado en
radianes
%
% Matrices que generan una rotacion en el sentido opuesto a las agujas del reloj. Por tanto generan un angulo trigonometrico positivo
% Rx = [1 0 0;0 cos(th) sin(th);0 -sin(th) cos(th)] Es la matriz de rotacion en el eje X en el sentido opuesto a las agujas del reloj del espacio 3D
% Ry = [cos(th) 0 -sin(th);0 1 0;sin(th) 0 cos(th)] Es la matriz de rotacion en el eje Y en el sentido opuesto a las agujas del reloj del espacio 3D
% Rz = [cos(th) sin(th) 0;-sin(th) cos(th) 0;0 0 1] Es la matriz de rotacion en el eje Z en el sentido opuesto a las agujas del reloj del espacio 3D
%
%
% Matrices que generan una rotacion en el mismo sentido a las agujas del reloj. Por tanto generan un angulo trigonometrico negativo
% Rx = [1 0 0;0 cos(th) -sin(th);0 sin(th) cos(th)] Es la matriz de rotacion en el eje X en el mismo sentido a las agujas del reloj del espacio 3D
% Ry = [cos(th) 0 sin(th);0 1 0;-sin(th) 0 cos(th)] Es la matriz de rotacion en el eje Y en el mismo sentido a las agujas del reloj del espacio 3D
% Rz = [cos(th) -sin(th) 0;sin(th) cos(th) 0;0 0 1] Es la matriz de rotacion en el eje Z en el mismo sentido a las agujas del reloj del espacio 3D
%
%
% NOTA.- En este proyecto se deben considerar las matrices que generan una rotacion en el mismo sentido al de las agujas del reloj tanto para
% movimientos en el mismo sentido de las agujas como para movientos en sentido opuesto. La explicacion es la siguiente:
% Al momento de ingresar el angulo este debe ser ingresado con signo de forma tal que el programa automaticamente reemplaza este valor en el
% angulo de la matriz generando automaticamente el tipo de rotacion señalada por el usuario.
%
% Para un mejor entendimiento, las lineas se encuentran comentadas
%
% INGENIERO ELECTRONICO MONTEZA ZEVALLOS FIDEL TOMAS
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Estas lineas de programacion se encargan de ejecutar la funcion directamente desde la ventana Editor (Diferente a cuando una funcion debe
% ejecutarse desde la ventana del Command Window). Confirmar que al momento de iniciar la simulacion el nombre del archivo aparece como una funcion
% ejecutada en la ventana del Command Window tambien. Y llama al mismo tiempo al archivo graficar.fig
function varargout = graficar(varargin)
% GRAFICAR MATLAB lineas de codigo para el archivo graficar.fig
% GRAFICAR, by itself, creates a new GRAFICAR or raises the existing singleton*.
%
% H = GRAFICAR returns the handle to a new GRAFICAR or the handle to the existing singleton*.
%
% GRAFICAR('CALLBACK',hObject,eventData,handles,...) calls the local function named CALLBACK in graficar.m with the given input arguments.
%
% GRAFICAR('Property','Value',...) creates a new GRAFICAR or raises the existing singleton*. Starting from the left, property value pairs are
% applied to the GUI before graficar_OpeningFcn gets called. An unrecognized property name or invalid value makes property application stop.
% All inputs are passed to graficar_OpeningFcn via varargin.
%
% *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one instance to run (singleton)".
%
% See also: GUIDE, GUIDATA, GUIHANDLES
gui_Singleton = 1;
gui_State = struct('gui_Name',mfilename,'gui_Singleton',gui_Singleton,'gui_OpeningFcn',@graficar_OpeningFcn,'gui_OutputFcn',@graficar_OutputFcn,'gui_LayoutFcn',[],'gui_Callback',[]);
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
% Executes just before graficar is made visible. hObject, eventdata, handles, varargin son parametros de entrada.
function graficar_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% varargin command line arguments to graficar (see VARARGIN)
% edit1 es la ventana en la interface de GUI donde se ingresa la funcion del tipo f(x,y) para graficos 3D
function edit1_Callback(hObject, eventdata, handles) % Funcion en 3D
global variables; % Esta variable se utiliza para determinar el tipo de grafico. Si es Uno 2D y si es Dos 3D
global x;
global y;
global z;
s = get(handles.edit1,'string');
f = vectorize(inline(s));
[x,y] = meshgrid(x,y);
z = f(x,y);
% edit1 es la ventana en la interface de GUI donde se ingresa la funcion del tipo f(x,y) para graficos 3D
function edit1_CreateFcn(hObject, eventdata, handles)
% hObject handle to edit1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called
% edit2 es la ventana en la interface de GUI donde se ingresa el valor del angulo por el cual se rotara la funcion para graficos 2D y 3D
function edit2_Callback(hObject, eventdata, handles)
global angulo1; % Declaramos la variable angulo1 del tipo global
angulo = get(handles.edit2,'string'); % La variable angulo captura el valor ingresado en la Caja edit2 en tipo cadena
angulo1 = str2num(angulo); % Se realiza la conversion del valor tipo cadena de la variable angulo al tipo numerico
% edit2 es la ventana en la interface de GUI donde se ingresa el valor del angulo por el cual se rotara la funcion para graficos 2D y 3D
function edit2_CreateFcn(hObject, eventdata, handles)
% hObject handle to edit2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called
% edit3 es la ventana en la interface de GUI donde se ingresa la funcion del tipo f(x) para graficos 2D
function edit3_Callback(hObject, eventdata, handles) % Funcion en 2D
global variables; % Esta variable se utiliza para determinar el tipo de grafico. Si es Uno 2D y si es Dos 3D
global x;
global y; % Esta variable y no tiene uso en esta parte del programa. Se reserva para posterior uso
global z; % Esta variable z no tiene uso en esta parte del programa. Se reserva para posterior uso
global rotar; % Esta variable rotar no tiene uso en esta parte del programa. Se reserva para posterior uso
global salidaxx; % Esta variable se utilizara para guardar los conjuntos de datos de la función y después se multiplicara por la matriz
de rotación
global salidayy; % Esta variable se utilizara para guardar los conjuntos de datos de la función y después se multiplicara por la matriz
de rotación
global salidazz; % Esta variable se utilizara para guardar los conjuntos de datos de la función y después se multiplicara por la matriz
de rotación
s = get(handles.edit3,'string');
f = vectorize(inline(s));
x = -10:0.5:10; % La variable x va desde -10 hasta 10 en particiones de 0.5 (Se originan 41 valores)
u = f(x);
t = 90;
% Vectores del tamaño de la variable x que se rellenan con CEROS para inicializarlos y despues utilizarlos.
salidaxx = zeros(size(x));
salidayy = zeros(size(x));
salidazz = zeros(size(x));
plot(x,u)
% edit3 es la ventana en la interface de GUI donde se ingresa la funcion del tipo f(x) para graficos 2D
function edit3_CreateFcn(hObject, eventdata, handles)
% hObject handle to edit3 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called
% pushbutton4 es la tecla de Ejecucion en la interface de GUI donde se inicia la simulacion de las funciones del tipo f(x) para graficos 2D o o f(x,y)para graficos 3D
function pushbutton4_Callback(hObject, eventdata, handles) % Boton de ejecucion denominado pushbutton4 con la etiqueta INICIAR
global angulo1; % Variable angulo1 para representar el Angulo de rotacion
global variables; % Esta variable se utiliza para determinar el tipo de grafico. Si es Uno 2D y si es Dos 3D
global rotar; % Variable principal que dara inicio a cada Case (Son cuatro Case)
global x;
global y;
global z;
global salidaxx; % Esta variable se utilizara para guardar los conjuntos de datos de la función y después se multiplicara por la matriz
de rotación
global salidayy; % Esta variable se utilizara para guardar los conjuntos de datos de la función y después se multiplicara por la matriz
de rotación
global salidazz; % Esta variable se utilizara para guardar los conjuntos de datos de la función y después se multiplicara por la matriz
de rotación
global tray1; % Variable tray1 para representar el tipo de la Trayectoria (Uno, Dos o Tres)
global res1; % Variable res1 es la velocidad de animacion. Positivo se rota en sentido a las agujas del reloj. Negativo en sentido
contrario
global eje_a; % Variable eje_a para representar el vector unitario con dirección del vector arbitrario
global xk1; % Variable xk1 es la componente X del vector arbitrario
global yk1; % Variable yk1 es la componente Y del vector arbitrario
global zk1; % Variable zk1 es la componente Z del vector arbitrario
global m; % Variable m para obtener de la magnitud del vector arbitrario
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Se presenta la estructura basica de programacion:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% switch rotar Rotar con respecto a X, Y o Z
%
% Case1 Todo el case 1 es rotar con respecto a X (2D o 3D)
% variables = 1 2D respecto a X
% angulo1 > 0 Angulo de rotacion positivo
% tray1 = 1 Se elige trayectoria 1 considerando el angulo positivo
% tray1 = 2 Se elige trayectoria 2 considerando el angulo positivo
% tray1 = 3 Se elige trayectoria 3 considerando el angulo positivo
% angulo1 < 0 Angulo de rotacion negativo
% tray1 = 1 Se elige trayectoria 1 considerando el angulo negativo
% tray1 = 2 Se elige trayectoria 2 considerando el angulo negativo
% tray1 = 3 Se elige trayectoria 3 considerando el angulo negativo
% variables = 2 3D respecto a X
% angulo1 > 0 Angulo de rotacion positivo
% tray1 = 1 Se elige trayectoria 1 considerando el angulo positivo
% tray1 = 2 Se elige trayectoria 2 considerando el angulo positivo
% tray1 = 3 Se elige trayectoria 3 considerando el angulo positivo
% angulo1 < 0 Angulo de rotacion negativo
% tray1 = 1 Se elige trayectoria 1 considerando el angulo negativo
% tray1 = 2 Se elige trayectoria 2 considerando el angulo negativo
% tray1 = 3 Se elige trayectoria 3 considerando el angulo negativo
%
% Case2 Todo el case 2 es rotar con respecto a Y (2D o 3D)
% variables = 1 2D respecto a Y
% angulo1 > 0 Angulo de rotacion positivo
% tray1 = 1 Se elige trayectoria 1 considerando el angulo positivo
% tray1 = 2 Se elige trayectoria 2 considerando el angulo positivo
% tray1 = 3 Se elige trayectoria 3 considerando el angulo positivo
% angulo1 < 0 Angulo de rotacion negativo
% tray1 = 1 Se elige trayectoria 1 considerando el angulo negativo
% tray1 = 2 Se elige trayectoria 2 considerando el angulo negativo
% tray1 = 3 Se elige trayectoria 3 considerando el angulo negativo
% variables = 2 3D respecto a Y
% angulo1 > 0 Angulo de rotacion positivo
% tray1 = 1 Se elige trayectoria 1 considerando el angulo positivo
% tray1 = 2 Se elige trayectoria 2 considerando el angulo positivo
% tray1 = 3 Se elige trayectoria 3 considerando el angulo positivo
% angulo1 < 0 Angulo de rotacion negativo
% tray1 = 1 Se elige trayectoria 1 considerando el angulo negativo
% tray1 = 2 Se elige trayectoria 2 considerando el angulo negativo
% tray1 = 3 Se elige trayectoria 3 considerando el angulo negativo
%
% Case3 Todo el case 3 es rotar con respecto a Z (2D o 3D)
% variables = 1 2D respecto a Z
% angulo1 > 0 Angulo de rotacion positivo
% tray1 = 1 Se elige trayectoria 1 considerando el angulo positivo
% tray1 = 2 Se elige trayectoria 2 considerando el angulo positivo
% tray1 = 3 Se elige trayectoria 3 considerando el angulo positivo
% angulo1 < 0 Angulo de rotacion negativo
% tray1 = 1 Se elige trayectoria 1 considerando el angulo negativo
% tray1 = 2 Se elige trayectoria 2 considerando el angulo negativo
% tray1 = 3 Se elige trayectoria 3 considerando el angulo negativo
% variables = 2 3D respecto a Z
% angulo1 > 0 Angulo de rotacion positivo
% tray1 = 1 Se elige trayectoria 1 considerando el angulo positivo
% tray1 = 2 Se elige trayectoria 2 considerando el angulo positivo
% tray1 = 3 Se elige trayectoria 3 considerando el angulo positivo
% angulo1 < 0 Angulo de rotacion negativo
% tray1 = 1 Se elige trayectoria 1 considerando el angulo negativo
% tray1 = 2 Se elige trayectoria 2 considerando el angulo negativo
% tray1 = 3 Se elige trayectoria 3 considerando el angulo negativo
%
% Case4 Todo el case 4 es rotar con respecto un Eje arbitrario (2D 0 3D)
% variables = 1 2D respecto a un Eje arbitrario
% angulo1 > 0 Angulo de rotacion positivo
% tray1 = 1 Se elige trayectoria 1 considerando el angulo positivo
% tray1 = 2 Se elige trayectoria 2 considerando el angulo positivo
% tray1 = 3 Se elige trayectoria 3 considerando el angulo positivo
% angulo1 < 0 Angulo de rotacion negativo
% tray1 = 1 Se elige trayectoria 1 considerando el angulo negativo
% tray1 = 2 Se elige trayectoria 2 considerando el angulo negativo
% tray1 = 3 Se elige trayectoria 3 considerando el angulo negativo
% variables = 2 3D respecto a un Eje arbitrario
% angulo1 > 0 Angulo de rotacion positivo
% tray1 = 1 Se elige trayectoria 1 considerando el angulo positivo
% tray1 = 2 Se elige trayectoria 2 considerando el angulo positivo
% tray1 = 3 Se elige trayectoria 3 considerando el angulo positivo
% angulo1 < 0 Angulo de rotacion negativo
% tray1 = 1 Se elige trayectoria 1 considerando el angulo negativo
% tray1 = 2 Se elige trayectoria 2 considerando el angulo negativo
% tray1 = 3 Se elige trayectoria 3 considerando el angulo negativo
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%co_R = (rotx(th_rad))*co; % Ecuacion con la funcion rotx considerando valores de su angulo en radianes semejante a la matriz Rx
Rx = [1 0 0;0 cosd(th) -sind(th);0 sind(th) cosd(th)]; % Matriz rotacion eje X en mismo sentido agujas del reloj y medida del angulo en sexagesimales
co_R = Rx*co; % Rotacion del vector co en el eje X originando el vector co_R
%co_R = (rotx(th_rad))*co; % Ecuacion con la funcion rotx considerando valores de su angulo en radianes semejante a la matriz Rx
Rx = [1 0 0;0 cosd(th) -sind(th);0 sind(th) cosd(th)]; % Matriz de rotacion en el eje 'X' en el mismo sentido a las agujas del reloj
co_R = Rx*co; % Rotacion del vector co en el eje X originando el vector co_R
salidaxx = co_R(1,:);
salidayy = co_R(2,:);
salidazz = co_R(3,:);
end
%co_R = (roty(th_rad))*co; % Ecuacion con la funcion rotx considerando valores de su angulo en radianes semejante a la matriz Rx
Ry = [cosd(th) 0 sind(th);0 1 0;-sind(th) 0 cosd(th)]; % Matriz de rotacion en el eje 'Y' en el mismo sentido a las agujas del reloj
co_R = Ry*co; % Rotacion del vector co en el eje Y originando el vector co_R
%co_R = (roty(th_rad))*co; % Ecuacion con la funcion rotx considerando valores de su angulo en radianes semejante a la matriz Rx
Ry = [cosd(th) 0 sind(th);0 1 0;-sind(th) 0 cosd(th)]; % Matriz de rotacion en el eje 'Y' en el mismo sentido a las agujas del reloj
co_R = Ry*co; % Rotacion del vector co en el eje Y originando el vector co_R
salidaxx = co_R(1,:);
salidayy = co_R(2,:);
salidazz = co_R(3,:);
end
%co_R = (rotz(th_rad))*co; % Ecuacion con la funcion rotx considerando valores de su angulo en radianes semejante a la matriz Rx
Rz = [cosd(th) -sind(th) 0; sind(th) cosd(th) 0; 0 0 1]; % Matriz de rotacion en el eje 'Z' en el mismo sentido a las agujas del reloj
co_R = Rz*co; % Rotacion del vector co en el eje Z originando el vector co_R
%co_R = (rotz(th_rad))*co; % Ecuacion con la funcion rotx considerando valores de su angulo en radianes semejante a la matriz Rx
Rz = [cosd(th) -sind(th) 0; sind(th) cosd(th) 0; 0 0 1]; % Matriz de rotacion en el eje 'Z' en el mismo sentido a las agujas del reloj
co_R = Rz*co; % Rotacion del vector co en el eje Z originando el vector co_R
salidaxx = co_R(1,:);
salidayy = co_R(2,:);
salidazz = co_R(3,:);
end
vo = 1-cosd(th);
R_eje_a = [(eje_a(1)^2)*vo+cosd(th), eje_a(1)*eje_a(2)*vo-eje_a(3)*sind(th), eje_a(1)*eje_a(3)*vo+eje_a(2)*sind(th); eje_a(1)*eje_a(2)*vo+eje_a(3)*sind(th),
(eje_a(2)^2)*vo+cosd(th), eje_a(2)*eje_a(3)*vo-eje_a(1)*sind(th); eje_a(1)*eje_a(3)*vo-eje_a(2)*sind(th), eje_a(2)*eje_a(3)*vo+eje_a(1)*sind(th), (eje_a(3)^2)*vo+cosd(th)];
co_R = R_eje_a*co;
vo = 1-cosd(th);
R_eje_a = [(eje_a(1)^2)*vo+cosd(th), eje_a(1)*eje_a(2)*vo-eje_a(3)*sind(th), eje_a(1)*eje_a(3)*vo+eje_a(2)*sind(th); eje_a(1)*eje_a(2)*vo+eje_a(3)*sind(th),
(eje_a(2)^2)*vo+cosd(th), eje_a(2)*eje_a(3)*vo-eje_a(1)*sind(th); eje_a(1)*eje_a(3)*vo-eje_a(2)*sind(th), eje_a(2)*eje_a(3)*vo+eje_a(1)*sind(th), (eje_a(3)^2)*vo+cosd(th)];
co_R = R_eje_a*co;
vo = 1-cosd(th);
R_eje_a = [(eje_a(1)^2)*vo+cosd(th), eje_a(1)*eje_a(2)*vo-eje_a(3)*sind(th), eje_a(1)*eje_a(3)*vo+eje_a(2)*sind(th); eje_a(1)*eje_a(2)*vo+eje_a(3)*sind(th),
(eje_a(2)^2)*vo+cosd(th), eje_a(2)*eje_a(3)*vo-eje_a(1)*sind(th); eje_a(1)*eje_a(3)*vo-eje_a(2)*sind(th), eje_a(2)*eje_a(3)*vo+eje_a(1)*sind(th), (eje_a(3)^2)*vo+cosd(th)];
co_R = R_eje_a*co;
vo = 1-cosd(th);
R_eje_a = [(eje_a(1)^2)*vo+cosd(th), eje_a(1)*eje_a(2)*vo-eje_a(3)*sind(th), eje_a(1)*eje_a(3)*vo+eje_a(2)*sind(th); eje_a(1)*eje_a(2)*vo+eje_a(3)*sind(th),
(eje_a(2)^2)*vo+cosd(th), eje_a(2)*eje_a(3)*vo-eje_a(1)*sind(th); eje_a(1)*eje_a(3)*vo-eje_a(2)*sind(th), eje_a(2)*eje_a(3)*vo+eje_a(1)*sind(th), (eje_a(3)^2)*vo+cosd(th)];
co_R = R_eje_a*co;
vo = 1-cosd(th);
R_eje_a = [(eje_a(1)^2)*vo+cosd(th), eje_a(1)*eje_a(2)*vo-eje_a(3)*sind(th), eje_a(1)*eje_a(3)*vo+eje_a(2)*sind(th); eje_a(1)*eje_a(2)*vo+eje_a(3)*sind(th),
(eje_a(2)^2)*vo+cosd(th), eje_a(2)*eje_a(3)*vo-eje_a(1)*sind(th); eje_a(1)*eje_a(3)*vo-eje_a(2)*sind(th), eje_a(2)*eje_a(3)*vo+eje_a(1)*sind(th), (eje_a(3)^2)*vo+cosd(th)];
co_R = R_eje_a*co;
vo = 1-cosd(th);
R_eje_a = [(eje_a(1)^2)*vo+cosd(th), eje_a(1)*eje_a(2)*vo-eje_a(3)*sind(th), eje_a(1)*eje_a(3)*vo+eje_a(2)*sind(th); eje_a(1)*eje_a(2)*vo+eje_a(3)*sind(th),
(eje_a(2)^2)*vo+cosd(th), eje_a(2)*eje_a(3)*vo-eje_a(1)*sind(th); eje_a(1)*eje_a(3)*vo-eje_a(2)*sind(th), eje_a(2)*eje_a(3)*vo+eje_a(1)*sind(th), (eje_a(3)^2)*vo+cosd(th)];
co_R = R_eje_a*co;
salidaxx = co_R(1,:);
salidayy = co_R(2,:);
salidazz = co_R(3,:);
end
if variables == 2 % Rotar con respecto al Eje arbitrario, en 3D
if angulo1 >= 0 % Se elige angulo positivo
if tray1 == 1 % Se elige trayectoria 1 (Teniendo en cuenta el angulo positivo)
t = 0:360; % Se dibuja primero la trayectoria que seguira la funcion
r = 3; % Este sera el radio de la Trayectoria de la circunferencia
xc = r*cosd(t); % Primera parte ecuacion de trayectoria que se grafica. El comando cosd (angulo en sexagesimales)
yc = r*sind(t); % Segunda parte ecuacion de trayectoria que se grafica. El comando sind (angulo en sexagesimales)
zc = ones(1, length(xc))*5; % Tercera parte ecuacion de trayectoria que se grafica
for th = 0:res1:angulo1 % La variable res1 es la velocidad de animacion y para rotar en el mismo sentido agujas del reloj debe ser positivo
y1 = r*sind(th); % Primera parte de la ecuacion de la trayectoria que se seguira hasta donde llegue th
x1 = r*cosd(th); % Segunda parte de la ecuacion de la trayectoria que se seguira hasta donde llegue th
z1 = 5; % Esta es la altura en donde se dibujara la trayectoria
for c = 1:25
for f = 1:25
vo = 1-cosd(th);
R_eje_a = [(eje_a(1)^2)*vo+cosd(th), eje_a(1)*eje_a(2)*vo-eje_a(3)*sind(th), eje_a(1)*eje_a(3)*vo+eje_a(2)*sind(th);
eje_a(1)*eje_a(2)*vo+eje_a(3)*sind(th), (eje_a(2)^2)*vo+cosd(th), eje_a(2)*eje_a(3)*vo-eje_a(1)*sind(th); eje_a(1)*eje_a(3)*vo-eje_a(2)*sind(th), eje_a(2)*eje_a(3)*vo+eje_a(1)*sind(th),
(eje_a(3)^2)*vo+cosd(th)];
vector_z = [x(f,c);y(f,c);z(f,c)];
Rot_eje_a1 = R_eje_a*vector_z;
X(f,c) = Rot_eje_a1(1);
Y(f,c) = Rot_eje_a1(2);
Z(f,c) = Rot_eje_a1(3);
end
end
surf(X+x1,Y+y1,Z+z1) % Se grafica la superficie 3D con el comando surf
xlabel('EJE X','Color','r') % Dar nombre al eje X
ylabel('EJE Y','Color','g') % Dar nombre al eje Y
zlabel('EJE Z','Color','b') % Dar nombre al eje Z
title(['Rotacion 3D en un Eje Arbitrario en la Trayectoria 1',' ','Angulo giro positivo = ' num2str(th)]); % Declaramos un titulo con resultados de angulos
grid on % Activamos las rejillas
axis([-20 20 -20 20 -20 20]); % Establecemos un sistema de ejes fijo X, Y y Z como minimos y maximos
pause(0.1);
end
end
function edit4_CreateFcn(hObject, eventdata, handles) % NOTA.- Buscar la aplicacion de edit4 (No aparece en el GUIDE)
% hObject handle to edit4 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called
function edit5_Callback(hObject, eventdata, handles) % NOTA.- Buscar la aplicacion de edit5 (No aparece en el GUIDE)
% hObject handle to edit6 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
function edit5_CreateFcn(hObject, eventdata, handles) % NOTA.- Buscar la aplicacion de edit5 (No aparece en el GUIDE)
% hObject handle to edit6 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called
% slider1 es la ventana en la interface de GUI donde se ingresa el valor de la velocidad de rotacion de la funcion para graficos 2D y 3D
function slider1_Callback(hObject, eventdata, handles)
% hObject handle to slider1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% text11 es la ventana en la interface de GUI donde se visualiza el valor de la velocidad de rotacion de la funcion para graficos 2D y 3D
function text11_CreateFcn(hObject, eventdata, handles)
% hObject handle to text11 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called
% popupmenu1 es la ventana en la interface de GUI de donde se selecciona el tipo de trayectoria que la funcion seguira para graficos 2D y 3D
function popupmenu1_Callback(hObject, eventdata, handles)
% hObject handle to popupmenu1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% popupmenu1 es la ventana en la interface de GUI de donde se selecciona el tipo de trayectoria que la funcion seguira para graficos 2D y 3D
function popupmenu1_CreateFcn(hObject, eventdata, handles)
% hObject handle to popupmenu1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called
% popupmenu2 es la ventana en la interface de GUI de donde se selecciona el Eje con respecto al que la funcion rotara para graficos 2D y 3D
function popupmenu2_Callback(hObject, eventdata, handles)
% hObject handle to popupmenu2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
global rotar; % Variable rotar para representar con respecto a que Eje se rotara (X - Y - Z)
global xk1; % Esta variable xk1 no tiene uso en esta parte del programa. Se reserva para posterior uso
global yk1; % Esta variable yk1 no tiene uso en esta parte del programa. Se reserva para posterior uso
global zk1; % Esta variable zk1 no tiene uso en esta parte del programa. Se reserva para posterior uso
global m % Esta variable m no tiene uso en esta parte del programa. Se reserva para posterior uso
global eje_a % Esta variable eje_a no tiene uso en esta parte del programa. Se reserva para posterior uso
% popupmenu2 es la ventana en la interface de GUI de donde se selecciona el Eje con respecto al que la funcion rotara para graficos 2D y 3D
function popupmenu2_CreateFcn(hObject, eventdata, handles)
% hObject handle to popupmenu2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called
% edit6 es la ventana en la interface de GUI donde se ingresa el valor de la coordenada X del Eje Arbitrario para graficos 2D y 3D
function edit6_Callback(hObject, eventdata, handles)
% hObject handle to edit6 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% edit6 es la ventana en la interface de GUI donde se ingresa el valor de la coordenada X del Eje Arbitrario para graficos 2D y 3D
function edit6_CreateFcn(hObject, eventdata, handles)
% hObject handle to edit6 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called
% edit7 es la ventana en la interface de GUI donde se ingresa el valor de la coordenada Y del Eje Arbitrario para graficos 2D y 3D
function edit7_Callback(hObject, eventdata, handles)
% hObject handle to edit7 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% edit7 es la ventana en la interface de GUI donde se ingresa el valor de la coordenada Y del Eje Arbitrario para graficos 2D y 3D
function edit7_CreateFcn(hObject, eventdata, handles)
% hObject handle to edit7 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called
% edit8 es la ventana en la interface de GUI donde se ingresa el valor de la coordenada Z del Eje Arbitrario para graficos 2D y 3D
function edit8_Callback(hObject, eventdata, handles)
% hObject handle to edit8 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% edit8 es la ventana en la interface de GUI donde se ingresa el valor de la coordenada Z del Eje Arbitrario para graficos 2D y 3D
function edit8_CreateFcn(hObject, eventdata, handles)
% hObject handle to edit8 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles empty - handles not created until after all CreateFcns called