- 注册时间
- 2019-3-7
- 最后登录
- 1970-1-1
- 威望
- 星
- 金币
- 枚
- 贡献
- 分
- 经验
- 点
- 鲜花
- 朵
- 魅力
- 点
- 上传
- 次
- 下载
- 次
- 积分
- 47
- 在线时间
- 小时
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?欢迎注册
×
假设有一个半径为R的球S,其球心在原点(0,0,0)处。在球面上有一个半径为r的圆C,其在xOy平面上的投影为\(x^2+y^2=r^2 \),即一个圆心在(0,0)点且半径为r的圆。
现在如果将球绕x轴和y轴旋转一定角度(分别是α、β),圆C在xOy面上的投影会变成一个中心在\((x_e, y_e)\),长短轴分别为a,b,倾斜角为θ的椭圆。其方程其实只是球S与一个和原点距离为\(\sqrt{R^2-r^2}\)的平面联立并带入\(z=0\)的结果。
(↑这个结论只在u、v不太大的角度下成立,角度大了会变成其他圆锥曲线,不过我实际上关心的是它的逆问题,所以无所谓)
我的问题是,现在已知椭圆E的中心在\((x_e, y_e)\)处,其长短轴分别为a,b,倾斜角为θ,然后知道其对应的球球心在原点半径为R,其对应圆C的半径为r,希望求解圆C的方程,或者旋转角α、β。
配的图方便理解就好,代码中坐标系方向有点奇怪,主要是因为其物理模型是图像处理的问题。
- clear all;close all;clc;hold all;
- % 右手系 x右 y下 z里
- % 球
- R=24;r=11;a=sqrt(R^2-r^2);
- % 旋转 以正前方为起点 顺时针为正
- alpha=20; % 水平旋转 绕y轴
- beta=15; % 垂直旋转 绕x轴
- x0 = 0;
- y0 = 0;
- z0 = -a;
- alpha = deg2rad(alpha);
- beta = deg2rad(beta);
- x0 = x0*cos(alpha) + z0*sin(alpha);
- y0 = x0*sin(alpha)*sin(beta) + y0*cos(beta) - z0*sin(beta)*cos(alpha);
- z0 = -x0*sin(alpha)*cos(beta) + y0*sin(beta) + z0*cos(beta)*cos(alpha);
- % 平面
- [x,y,z]=meshgrid(-25:1:25);
- f = x0 .* (x - x0) + y0 .* (y - y0) + z0 .* (z - z0);
- % 球
- [u, v]=meshgrid((0:0.02:1)*pi, (-1:0.02:1)*pi);
- xi = R .* sin(u) .* cos(v);
- yi = R .* sin(u) .* sin(v);
- zi = R .* cos(u);
- subplot(1,2,1);
- % patch(isosurface(x,y,z,f,0), 'EdgeColor', 'none', 'FaceColor', 'b', 'FaceAlpha', 0.2);
- surface(xi, yi, zi, 'EdgeColor', 'k', 'FaceColor', 'none', 'EdgeAlpha', 0.3);
- h = contourslice(x, y, z, f, xi, yi, zi,[0,0]);
- line([0 x0],[0 y0],[0 z0], 'Color', 'm', 'LineWidth', 3)
- xx = h.XData;yy = h.YData;zz = h.ZData;
- set(h, 'EdgeColor', 'r', 'LineWidth', 3);
- xlabel('x');ylabel('y');zlabel('z');
- axis equal; grid on; box on;axis([-30 30 -30 30 -30 30]);view(3);
- view(0,90);
- subplot(1,2,2);
- mask = isfinite(yy) & isfinite(xx);
- xx=xx(mask);yy=yy(mask);
- plot(xx,yy);
- xlabel('x');ylabel('y');
- axis equal; grid on; box on;axis([-30 30 -30 30]);
复制代码
|
-
-
评分
-
查看全部评分
|