如何描述从中心点径向向外移动的线?

How can I describe lines moving radially outwards from a center point?

我在 3d space (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.S。将在 MATLAB

中实现

你的倾斜平面是怎么定义的?
用基点P0和两个垂直的单位向量UV来定义它。从任何其他人那里得到这种表示并不难。例如,如果平面的法向量分别与轴 OX、OY、OZ 成角度 ax、ay、az,则其标准化形式为 N = (nx, ny, nz) = (余弦(ax),余弦(ay),余弦(az))。可以选择任意向量U(位于平面内)as described here,求V向量为向量积V = U x N
那么需要的点数是:

P = P0 + U * R * Cos(Theta) + V * R * Sin(Theta)

你可以先让坐标从P0向外,然后用rotation matrix旋转坐标。

因此,正如 MBo 指出的那样,您对所有 R 和 theta 取点 P:

P = [ P0x + R * cos(theta); P0y + R * sin(θ); 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,sorry):

图中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')

这是否回答了您的问题?现在,这些点位于所有 36 度角的倍数处,距离平面中的点 P0 的距离为 1 和 2,该平面在围绕点 P0 的所有轴上倾斜 45 度。如果你需要单独的 'pixels' 来指定你的线(所以整数坐标),你可以将坐标四舍五入,这将是一种最近邻方法:

coordinates_tilted_nearest = round(coordinates_tilted);