我在3d空间中有一个点(x,y,z)。我想离散地从那个点径向向外移动(比如r = 1和r = 2)。在x,y平面上,我可以通过步进((x + r cos(theta)),(y + r sin(theta)),z)向外移动,其中r = 1或2,theta每变化一次,比如10度。
但是,如果我想让一条线在倾斜的平面上向外移动并在这个平面内走我的线,我不确定如何描述这个动作。
我认为这只是使用球面坐标。但是,如果我使用(x = rho sin phi cos theta,y = ...,z = ...)从中心点绘制线条,那么不会形成圆锥而不是在平面上倾斜的圆? / p>
P.S。将在MATLAB中实现这个
答案 0 :(得分:1)
您的倾斜平面是如何定义的?
用基点 P0 和两个垂直单位向量 U 和 V 定义它。从任何其他人那里得到这种表示并不难。例如,如果平面的法向量分别具有轴OX,OY,OZ的角度ax,ay,az,则其标准化形式为 N =(nx,ny,nz)=(Cos(ax) ),Cos(ay),Cos(az))。您可以选择任意向量 U (位于平面中)as described here,并找到V向量作为向量积 V = U x的ñ强>
然后需要的点是:
P = P0 + U * R * Cos(Theta)+ V * R * Sin( THETA)
答案 1 :(得分:1)
您可以先从P0向外调整坐标,然后使用rotation matrix旋转坐标。
所以你为所有的R和thetas取得分数P,正如MBo所指出的那样:
P = [P0x + R * cos(theta); P0y + R * sin(theta); 0]
然后你制作一个旋转矩阵,用你想要的角度旋转XY平面
如果将其与坐标相乘,则得到旋转坐标。例如,对于点[1,0,0],绕Z轴旋转90度:
但是你可能想要围绕点P0旋转而不是关于原点旋转,那么你必须使用以下平移来制作仿射矩阵:
tx = x-r00 * x - r01 * y - r02 * z
ty = y-r10 * x - r11 * y - r12 * z
tz = z-r20 * x - r21 * y - r22 * z
然后用T和R做一个仿射变换矩阵(图中用M表示,对不起):
在这个图中,Q是旧坐标,Q'是新坐标。
我遇到了类似的问题并使用this回答并根据您的问题进行了调整:
%input point and rotated plane
p0 = [10;10;10;1]; % the last entry is your homogeneous dimension
r0 = [45,45,45]; r0 = r0*pi/180;
%rotation to plane
Rx=[1 0 0 0;
0 cos(r0(1)) sin(r0(1)) 0;
0 -sin(r0(1)) cos(r0(1)) 0;
0 0 0 1];
Ry=[cos(r0(2)) 0 -sin(r0(2)) 0;
0 1 0 0;
sin(r0(2)) 0 cos(r0(2)) 0;
0 0 0 1];
Rz=[cos(r0(3)) sin(r0(3)) 0 0;
-sin(r0(3)) cos(r0(3)) 0 0;
0 0 1 0;
0 0 0 1];
R = Rz*Ry*Rx; A = R;
T = ( eye(3)-R(1:3,1:3) ) * p0(1:3); %calculate translation to rotate about the point P0
A(1:3,4) = T; % to rotate about the origin just leave out this line
%make coordinates for the points going outward from p0
nangles = 36; anglestep = 2*pi/nangles;
nradii = 2; radiistep = 1;
thetas = anglestep:anglestep:2*pi;
rs = radiistep:radiistep:nradii*radiistep;
npoints = nradii*nangles;
coordinates = zeros(4,npoints); curpoint = 0;
for itheta = 1:nangles; for iradius = 1:nradii;
curpoint = curpoint+1;
coordinates(:, curpoint) = p0+rs(iradius)*[cos(thetas(itheta));sin(thetas(itheta));0;0];
end; end
coordinates_tilted = A*coordinates; %rotate the coordinates to the new plane
这导致了这个数字:
figure;
scatter3(coordinates_tilted(1,:),coordinates_tilted(2,:),coordinates_tilted(3,:), 'MarkerEdgeColor', 'green')
hold on
scatter3(coordinates(1,:),coordinates(2,:),coordinates(3,:), 'MarkerEdgeColor', 'red')
legend('tilted', 'original')
或将它们绘制成线条:
%or as lines
coorarray = reshape(coordinates, [4 nradii nangles]);
Xline = squeeze(coorarray(1,:,:));
Yline = squeeze(coorarray(2,:,:));
Zline = squeeze(coorarray(3,:,:));
coorarray_tilted = reshape(coordinates_tilted, [4 nradii nangles]);
Xline_tilted = squeeze(coorarray_tilted(1,:,:));
Yline_tilted = squeeze(coorarray_tilted(2,:,:));
Zline_tilted = squeeze(coorarray_tilted(3,:,:));
figure;
plot3(Xline,Yline,Zline, 'r');
hold on
plot3(Xline_tilted,Yline_tilted,Zline_tilted, 'g');
legend( 'original', 'tilted')
这是否回答了你的问题?现在,这些点是在距离点P0的所有轴上倾斜45度的平面中距离点P0为1和2的所有36度角的倍数。如果您需要单独的“像素”来指定您的线(所以整数坐标),您可以围绕坐标,这将是一种最近邻居的方法:
coordinates_tilted_nearest = round(coordinates_tilted);