tilting an ellipse on a given angle

46 visualizzazioni (ultimi 30 giorni)
I am plotting ellipses as attached. My program is working fine but I need to tilt the ellipse on an angle (in degrees) entered by my user. The pivotal point is shown as black dot in attachment.
I am using following code to get each ellipse, few parameters e.g Q,R etc are received from another part of program.
xCenter = 2*Q;
yCenter = 2*R;
xRadius = Q;
yRadius = R;
theta = 0 : 0.01 : 2*pi;
x = xRadius * cos(theta) + xCenter;
y = yRadius * sin(theta) + yCenter;
e=plot(x, y, 'LineWidth', 1);
fill(x,y,'g')
axis square;
xlim([0 2*yCenter]);
ylim([0 2*yCenter]);

Risposta accettata

Image Analyst
Image Analyst il 21 Nov 2016
You need to introduce a phase shift to get a rotation. See my demo code. It makes a rotated ellipse. Then it uses a second way, a rotation matrix, to rotate that ellipse by a specified angle.
% Creates a rotated ellipse, and then rotates it again by a specified angle using a second method: a rotation matrix.
clc; % Clear the command window.
workspace; % Make sure the workspace panel is showing.
clearvars;
format longg;
format compact;
fontSize = 20;
% Parameterize the equation.
t = linspace(0, 360,1000);
phaseShift = 20;
xAmplitude = 2;
yAmplitude = 1;
x = xAmplitude * sind(t + phaseShift);
y = yAmplitude * cosd(t);
% Now plot the rotated ellipse.
plot(x, y, 'b-', 'LineWidth', 2);
axis equal
grid on;
xlabel('X', 'FontSize', fontSize);
ylabel('Y', 'FontSize', fontSize);
title('Rotated Ellipses', 'FontSize', fontSize);
text(-1.75, 1.4, 'Parametric --', 'Color', 'b', 'FontSize', fontSize);
% Now plot another ellipse and multiply it by a rotation matrix.
% https://en.wikipedia.org/wiki/Rotation_matrix
rotationAngle = 30;
transformMatrix = [cosd(rotationAngle), sind(rotationAngle);...
-sind(rotationAngle), cosd(rotationAngle)]
xAligned = xAmplitude * sind(t);
yAligned = yAmplitude * cosd(t);
xyAligned = [xAligned; yAligned]';
xyRotated = xyAligned * transformMatrix;
xRotated = xyRotated(:, 1);
yRotated = xyRotated(:, 2);
hold on;
plot(xRotated, yRotated, 'g-', 'LineWidth', 2);
% Plot a line at 30 degrees
slope = tand(30);
x1 = min(x(:));
y1 = slope * x1;
x2 = max(x(:));
y2 = slope * x2;
line([x1 x2], [y1 y2], 'Color', 'r');
text(-1.75, 1.25, 'Rotation Matrix --', 'Color', 'g', 'FontSize', fontSize);
text(-1.75, 1.1, '30 Degree Line --', 'Color', 'r', 'FontSize', fontSize);
% Enlarge figure to full screen.
set(gcf, 'units','normalized','outerposition',[0 0 1 1]);
  2 Commenti
Snowleopard
Snowleopard il 21 Nov 2016
Modificato: Snowleopard il 21 Nov 2016
Thanks for your support, I got to rotate ellipse but I have to rotate them on the pivotal point as showed in attached pic.My ellipses are of different major and minor axis so I am unable to manage that. Earlier I had managed by subtracting yCenter = (2*R)-(R-R1); the major axis differences so it was working, now with each angle the distance is varying so my aim to rotate them relative to pivotal point is not working.
Image Analyst
Image Analyst il 21 Nov 2016
I think maybe you just didn't spend the time to go through the math, so I did it for you:
% Creates a rotated ellipse, and then rotate it again by specified angles using a second method: a rotation matrix.
clc; % Clear the command window.
workspace; % Make sure the workspace panel is showing.
clearvars;
format long g;
format compact;
fontSize = 20;
darkGreen = [0, 0.6, 0];
% Parameterize the equation.
t = linspace(0, 360,1000);
xAmplitude = 1;
yAmplitude = 2.5;
xCenter = 2.5;
yCenter = 5;
xOriginal = xAmplitude * sind(t) + xCenter;
yOriginal = yAmplitude * cosd(t) + yCenter;
% Now plot the rotated ellipse.
plot(xOriginal, yOriginal, 'b-', 'LineWidth', 2);
axis equal
grid on;
xlabel('X', 'FontSize', fontSize);
ylabel('Y', 'FontSize', fontSize);
title('Rotated Ellipses', 'FontSize', fontSize);
xlim([-3, 8]);
ylim([-3, 8]);
% Enlarge figure to full screen.
set(gcf, 'Units', 'Normalized','OuterPosition',[0 0 1 1]);
drawnow;
hold on;
% Now plot more ellipses and multiply it by a rotation matrix.
% https://en.wikipedia.org/wiki/Rotation_matrix
% For each angle, subtract the center, multiply by the rotation matrix and add back in the center.
for rotationAngle = 10 : 20 : 350
transformMatrix = [cosd(rotationAngle), sind(rotationAngle);...
-sind(rotationAngle), cosd(rotationAngle)];
xAligned = (xOriginal - xCenter);
yAligned = (yOriginal - yCenter/2);
xyAligned = [xAligned; yAligned]';
xyRotated = xyAligned * transformMatrix;
xRotated = xyRotated(:, 1) + xCenter;
yRotated = xyRotated(:, 2) + yCenter/2;
hold on;
plot(xRotated, yRotated, '-', 'Color', darkGreen, 'LineWidth', 2);
end

Accedi per commentare.

Più risposte (0)

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by