如何将旋转应用于由中心和轴长度定义的椭圆?
How to apply rotation to an ellipse defined by center and axis lengths?
这很尴尬,但是。我的椭圆定义为:
centerX
和 centerY
;
majorAxis
和minorAxis
,两个轴的长度;
orientation
,水平 X 轴与椭圆长轴之间的角度。
我开始绘制长轴平行于 X 轴的椭圆:
theta = 0 : 0.05 : 2*pi;
orientation=orientation*pi/180;
xx = (majorAxis/2) * sin(theta) + centerX;
yy = (minorAxis/2) * cos(theta) + centerY;
%plot(xx,yy)
现在我只需要将这些东西旋转 orientation
度或辐射点。有什么帮助吗?我尝试了很多东西,例如:
- 绘制然后
rotate
对象;
- 定义旋转矩阵
R = [cos(orientation), -sin(orientation); sin(orientation), cos(orientation)];
并将其应用于 xx-centerX
和 yy-centerY
。
出于某种原因,我无法获得想要的结果。当然我需要点围绕中心旋转,而不是原点。
旁注:如果这有任何帮助,我正在尝试使用 Centroid
、[=24 绘制由 regionprops
定义的椭圆=]、MinorAxisLength
和 Orientation
属性。
致@Luis Mendo,这是我得到的:
这是另一个尝试:
对于底部特征,我或多或少得到了 orientation = 8
度,这是完全合理的。但是使用我在下面发布的代码,我得到了一个 -8
椭圆!
theta = 0 : 0.05 : 2*pi;
orientation=orientation*pi/180;
delta_x = (majorAxis/2) * sin(theta);
delta_y = (minorAxis/2) * cos(theta);
delta_x_ok = delta_x*cos(orientation) - delta_y*sin(orientation);
delta_y_ok = delta_x*sin(orientation) + delta_y*cos(orientation);
plot(delta_x_ok + centerX, delta_y_ok + centerY, 'r', 'LineWidth', 1.3);
orientation
可以是 theta
角度的偏移量。
theta = 0 : 0.05 : 2*pi;
orientation=orientation*pi/180;
xx = (majorAxis/2) * sin(theta + orientation) + centerX;
yy = (minorAxis/2) * cos(theta + orientation) + centerY;
%plot(xx,yy)
更新这只会改变椭圆的起点,没有任何效果。
xx-centerX
和 yy-centerY
可以解释为相对于轴 aligned 和 centered 的坐标旋转椭圆。要获得相对于实际(非旋转、非居中)轴的坐标,比如 xx2
和 yy2
,您只需要应用变换
xx2 = (xx-centerX)*cos(orientation) - (yy-centerY)*sin(orientation) + centerX;
yy2 = (xx-centerX)*sin(orientation) + (yy-centerY)*cos(orientation) + centerY;
然后用
绘制旋转的椭圆
plot(xx2,yy2)
示例:
majorAxis = 2;
minorAxis = 1;
centerX = 10;
centerY = 15;
orientation = -45;
theta = 0 : 0.05 : 2*pi;
orientation=orientation*pi/180;
xx = (majorAxis/2) * sin(theta) + centerX;
yy = (minorAxis/2) * cos(theta) + centerY;
xx2 = (xx-centerX)*cos(orientation) - (yy-centerY)*sin(orientation) + centerX;
yy2 = (xx-centerX)*sin(orientation) + (yy-centerY)*cos(orientation) + centerY;
plot(xx2,yy2)
axis equal
grid
椭圆中的空隙是由于theta
步没有划分2*pi
而产生的。要更正该问题,请使用例如
theta = linspace(0, 2*pi, 150);
这给出了
这很尴尬,但是。我的椭圆定义为:
centerX
和centerY
;majorAxis
和minorAxis
,两个轴的长度;orientation
,水平 X 轴与椭圆长轴之间的角度。
我开始绘制长轴平行于 X 轴的椭圆:
theta = 0 : 0.05 : 2*pi;
orientation=orientation*pi/180;
xx = (majorAxis/2) * sin(theta) + centerX;
yy = (minorAxis/2) * cos(theta) + centerY;
%plot(xx,yy)
现在我只需要将这些东西旋转 orientation
度或辐射点。有什么帮助吗?我尝试了很多东西,例如:
- 绘制然后
rotate
对象; - 定义旋转矩阵
R = [cos(orientation), -sin(orientation); sin(orientation), cos(orientation)];
并将其应用于xx-centerX
和yy-centerY
。
出于某种原因,我无法获得想要的结果。当然我需要点围绕中心旋转,而不是原点。
旁注:如果这有任何帮助,我正在尝试使用 Centroid
、[=24 绘制由 regionprops
定义的椭圆=]、MinorAxisLength
和 Orientation
属性。
致@Luis Mendo,这是我得到的:
这是另一个尝试:
对于底部特征,我或多或少得到了 orientation = 8
度,这是完全合理的。但是使用我在下面发布的代码,我得到了一个 -8
椭圆!
theta = 0 : 0.05 : 2*pi;
orientation=orientation*pi/180;
delta_x = (majorAxis/2) * sin(theta);
delta_y = (minorAxis/2) * cos(theta);
delta_x_ok = delta_x*cos(orientation) - delta_y*sin(orientation);
delta_y_ok = delta_x*sin(orientation) + delta_y*cos(orientation);
plot(delta_x_ok + centerX, delta_y_ok + centerY, 'r', 'LineWidth', 1.3);
orientation
可以是 theta
角度的偏移量。
theta = 0 : 0.05 : 2*pi;
orientation=orientation*pi/180;
xx = (majorAxis/2) * sin(theta + orientation) + centerX;
yy = (minorAxis/2) * cos(theta + orientation) + centerY;
%plot(xx,yy)
更新这只会改变椭圆的起点,没有任何效果。
xx-centerX
和 yy-centerY
可以解释为相对于轴 aligned 和 centered 的坐标旋转椭圆。要获得相对于实际(非旋转、非居中)轴的坐标,比如 xx2
和 yy2
,您只需要应用变换
xx2 = (xx-centerX)*cos(orientation) - (yy-centerY)*sin(orientation) + centerX;
yy2 = (xx-centerX)*sin(orientation) + (yy-centerY)*cos(orientation) + centerY;
然后用
绘制旋转的椭圆plot(xx2,yy2)
示例:
majorAxis = 2;
minorAxis = 1;
centerX = 10;
centerY = 15;
orientation = -45;
theta = 0 : 0.05 : 2*pi;
orientation=orientation*pi/180;
xx = (majorAxis/2) * sin(theta) + centerX;
yy = (minorAxis/2) * cos(theta) + centerY;
xx2 = (xx-centerX)*cos(orientation) - (yy-centerY)*sin(orientation) + centerX;
yy2 = (xx-centerX)*sin(orientation) + (yy-centerY)*cos(orientation) + centerY;
plot(xx2,yy2)
axis equal
grid
椭圆中的空隙是由于theta
步没有划分2*pi
而产生的。要更正该问题,请使用例如
theta = linspace(0, 2*pi, 150);
这给出了