# rotate a hyperbola in Matlab - code provided

http://www.experts-exchange.com/Programming/Languages/MatLab/Q_24269123.html

following on from the above;

I understand the concept better now thanks to the link provided

the function xfm1 rotates a point on the locus of the hyperbola about 60 degrees from P(x',y') to P(x",y") around (xo,yo).

but I am stuck on how xfm1 below is incorporated into create_hyperbola as in the code box below;

``````% Program to plot the hyperbola
% y^2/a^2 - x^2/b^2 = 1
% The hyperbolae are open up/down, so that x is the independent variable
% for plotting. (Using the form x^2/a^2 - y^2/b^2 = 1 requires that y be
% the independent variable, which is awkward programming-wise.)
clear % all variables
figure(1), hold off % start a new figure
xmax = 30; ymax = 20;
x = linspace(-xmax,xmax,1001); % array of x values for plot : This function generates vector with 1001 points equally distributed between -xmax and xmax.
%1001 is probably to have 500 points on one side (>0), 500 on another side (<0) and to include 0 itself. So you will have
%more natural numbers.

a = 5; b = 3;
y=sqrt(((x.^2)./(b^2)+1).*a^2); % corresponding y values
plot(x,y)
hold on % add to current plot
plot(x,-y) % Plot other half of hyperbola

% plot the elipse
% y^2/a^2 - x^2/b^2 = 1

y=sqrt(((-x.^2)./(b^2)+1).*a^2); % corresponding y values
plot(x,y)
plot(x,-y) % Plot other half of elipse

axis([-xmax xmax -ymax ymax]) % specify axis limits
xlabel('x')
ylabel('y')
title(['Hyperbola and elipse \$y^2/a^2 - x^2/b^2 = 1\$;\$y^2/a^2 + x^2/b^2 = 1\$; \$a\$ = ', num2str(a), ...
', \$b\$ = ', num2str(b),';'],'Interpreter','latex')
plot([0 0],[-ymax ymax],'k') % y axis (black line - k)
plot([-xmax xmax],[0 0],'k') % x axis

f1=sqrt(a.^2+b.^2);
f2=-(sqrt(a.^2+b.^2));
plot([0 0],[f1 f2],'.')
text(0,f1,'\leftarrow +d','VerticalAlignment','middle','HorizontalAlignment','left')
text(0,f2,'\leftarrow -d','VerticalAlignment','middle','HorizontalAlignment','left')

f3=sqrt(a.^2-b.^2);
f4=-(sqrt(a.^2-b.^2));
plot([0 0],[f3 f4],'.')
text(0,f3,'\leftarrow +c','VerticalAlignment','middle','HorizontalAlignment','left')
text(0,f4,'\leftarrow -c','VerticalAlignment','middle','HorizontalAlignment','left')

text(0,a, '\leftarrow +a')
text(0,-a, '\leftarrow -a')

function [xout,yout] = xfm1(xin,yin,theta,x_offset,y_offset)
% Program to rotate and translate x,y values from x",y" to x,y space.
% Written to plot hyperbolas for time of arrival code.
% theta value assumed to be in radians.

%  rotation matrix
xfm = [cos(theta) sin(theta); ...
-sin(theta) cos(theta)];
% make x,y values into a column vector
r_in = [xin; yin];
% rotate
r_out = xfm*r_in;
x = r_out(1,:); y = r_out(2,:);
xout = x + x_offset;
yout = y + y_offset;
``````
LVL 1
###### Who is Participating?

Commented:
Of course, you didn't put the parameters you need.
Theta=60 deg, Xo=10, Yo=5.
Basically now before drawing anything you need to transform x and y coordinates with your function. Then plot new coordinates.
I didn't put focus points on the figure. Hope you can do it.
``````clear % all variables
figure(1), hold off % start a new figure
xmax = 30; ymax = 20;
x = linspace(-xmax,xmax,1001);

a = 5; b = 3;
xoff=10;
yoff=5;
y=sqrt(((x.^2)./(b^2)+1).*a^2); % corresponding y values
[xout,yout] = xfm1(x,y,theta,xoff,yoff); % rotation and shift

plot(xout,yout)
hold on % add to current plot
[xout,yout] = xfm1(x,-y,theta,xoff,yoff); % rotation and shift of negative part
plot(xout,yout) % Plot other half of hyperbola

axis([-xmax xmax -ymax ymax]) % specify axis limits
xlabel('x')
ylabel('y')

plot([0 0],[-ymax ymax],'k') % y axis
plot([-xmax xmax],[0 0],'k') % x axis

``````
0

Commented:
You cannot put function and script into one m-file. Function should be in a separate m-file with the same name as function name. So create xfm1.m file and paste your function code there. Keep this file in the same  directory with your script.
http://www.mathworks.com/access/helpdesk/help/techdoc/matlab_prog/f7-38085.html

I should add, that function can be in the same m-file with another function, is it's nested function. If you are interested in this, see here:
http://www.mathworks.com/access/helpdesk/help/techdoc/matlab_prog/f4-39683.html
0

Author Commented:
thanks, ok so I just invoke the function as long as it is in the same folder.

but how do i import the rotated values?
do I use x = linspace(-xmax,xmax,1001); and y=sqrt(((x.^2)./(b^2)+1).*a^2);

how do I use the function xfm1(xin,yin,theta,x_offset,y_offset) with relation to the create_hyperbola function.

thats where I am getting confused
0

Commented:
Add something like this to your code. x and y are coordinates for original hyperbola, you need to apply the function to every part of your figure.
When you call function in Matlab, input and output parameters names do not have to match those in function implementation.

BTW I think you made a wrong rotation matrix. No, it's correct, but rotate in not usual direction. It should be
xfm = [cos(theta) -sin(theta); ...
sin(theta) cos(theta)];

``````theta=1; % in radians, 1 radian = 180/pi degrees
xoff=0;
yoff=0;
[xout,yout] = xfm1(x,y,theta,xoff,yoff);
plot(xout,yout)
``````
0

Author Commented:
Ok, I added this at the end of code but the plot does not seem to be correct as per page 4 of the tutorial... am I doing this wrong?
``````% Program to plot the hyperbola
% y^2/a^2 - x^2/b^2 = 1
% The hyperbolae are open up/down, so that x is the independent variable
% for plotting. (Using the form x^2/a^2 - y^2/b^2 = 1 requires that y be
% the independent variable, which is awkward programming-wise.)
clear % all variables
figure(1), hold off % start a new figure
xmax = 30; ymax = 20;
x = linspace(-xmax,xmax,1001); % array of x values for plot : This function generates vector with 1001 points equally distributed between -xmax and xmax.
%1001 is probably to have 500 points on one side (>0), 500 on another side (<0) and to include 0 itself. So you will have
%more natural numbers.

a = 5; b = 3;
y=sqrt(((x.^2)./(b^2)+1).*a^2); % corresponding y values
plot(x,y)
hold on % add to current plot
plot(x,-y) % Plot other half of hyperbola

% plot the elipse
% y^2/a^2 - x^2/b^2 = 1

y=sqrt(((-x.^2)./(b^2)+1).*a^2); % corresponding y values
plot(x,y)
plot(x,-y) % Plot other half of elipse

axis([-xmax xmax -ymax ymax]) % specify axis limits
xlabel('x')
ylabel('y')
title(['Hyperbola and elipse \$y^2/a^2 - x^2/b^2 = 1\$;\$y^2/a^2 + x^2/b^2 = 1\$; \$a\$ = ', num2str(a), ...
', \$b\$ = ', num2str(b),';'],'Interpreter','latex')
plot([0 0],[-ymax ymax],'k') % y axis (black line - k)
plot([-xmax xmax],[0 0],'k') % x axis

f1=sqrt(a.^2+b.^2);
f2=-(sqrt(a.^2+b.^2));
plot([0 0],[f1 f2],'.')
text(0,f1,'\leftarrow +d','VerticalAlignment','middle','HorizontalAlignment','left')
text(0,f2,'\leftarrow -d','VerticalAlignment','middle','HorizontalAlignment','left')
x1=10;

y1=sqrt(((x1.^2)./(b^2)+1).*a^2);
line([0 x1], [f1 y1],'color','r')
line([0 x1], [f2 y1],'color','r')

f3=sqrt(a.^2-b.^2);
f4=-(sqrt(a.^2-b.^2));
plot([0 0],[f3 f4],'.')
text(0,f3,'\leftarrow +c','VerticalAlignment','middle','HorizontalAlignment','left')
text(0,f4,'\leftarrow -c','VerticalAlignment','middle','HorizontalAlignment','left')

text(0,a, '\leftarrow +a')
text(0,-a, '\leftarrow -a')

xoff=0;
yoff=0;
[xout,yout] = xfm1(x,y,theta,xoff,yoff);
plot(xout,yout)
``````
0

Author Commented:
tutorial
toa.pdf
0

Author Commented:
Brilliant... yes I understand you invoke it through the plot function after defining the variables above...
I know how to get the focus points as well
thanks a million :)
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.