Meshgrid orthogonal to a line in 3D Space

9 views (last 30 days)
ADSW121365 on 20 May 2022
Commented: ADSW121365 on 23 May 2022
In 3D space, how do I generate a set of points, like a meshgrid, orthogonal to a specific straight line passing through its center? This is definitely not a difficult problem, but I'm overcomplicating it somewhere in my brain and related questions didn't help me with the gridding part.
For a line orientated along one axis, what I'm trying to do is this:
X = [-5:5]; Y = ones(size(X)); Z = ones(size(X)); %Define Line
No_points = 5;
plane_x = linspace(-1,1,5); plane_y = linspace(0.9,1.1,5); plane_z = linspace(0.9,1.1,5); %Specify Points
figure;plot3(X,Y,Z,'r-'); hold on; plot3(plane_x(:),plane_y(:),plane_z(:),'k.');
How do I generate the same orthogonal meshgrid of points passing through the origin for a "3D line", e.g:
X = [-5:5]; Y = X; Z = X;

Answers (3)

Matt J
Matt J on 20 May 2022
Edited: Matt J on 20 May 2022
Pick a 3D direction vector for the straight line, e.g.
B=null(d.'); %basis
XYZ=B(:,1).*res(x) + B(:,2).*res(y) +d(:).*res(z);
scatter3(XYZ(1,:), XYZ(2,:), XYZ(3,:) );
axis equal
xlabel X, ylabel Y, zlabel Z, view(30,40)

Sign in to comment.

Matt J
Matt J on 20 May 2022
Edited: Matt J on 20 May 2022
There are also ready-made File Exchange tools you can use, like this one
d=[1;1;1]; %direction of line
gtPlane=planarFit.groundtruth([],d,0); %ground truth plane
b1=cross([0,1,0],gtPlane.normal); %Make one sampling direction parallel to x-z plane
b2=[]; %Make the other direction orthogonal to b1
XYZ=gtPlane.sample(b0,b1,b2,t,t); %Post-sample the plane
XYZ=num2cell( cell2mat(XYZ)+d(:).*reshape(t,1,1,[]) ,[2,3]); %expand along d
hPost=scatter3(XYZ{1}(:), XYZ{2}(:), XYZ{3}(:));
xlabel X, ylabel Y, zlabel Z; view(30,40); axis equal

Matt J
Matt J on 20 May 2022
Edited: Matt J on 20 May 2022
You can also start with an unrotated grid, then rotate it:
d=[1;1;1]; d=d(:).'/norm(d);
XYZ=num2cell( [X(:),Y(:),Z(:)]*R',1);
axis equal
xlabel X, ylabel Y, zlabel Z, view(30,40)
  1 Comment
ADSW121365 on 23 May 2022
Firstly, I assume my question is at fault rather than the answer. Both the first and this answer give the same solution, however this is more concise. Choosing Nx = 3 to make the issue/question clearer.
clear,close all; clc;
Line_X = linspace(-5,5,5); Line_Y = Line_X; Line_Z = Line_X;
%Generate Evaluation Points:
Xl = -2; Xu = 2; Nx = 3; Yl = -2; Yu = 2; Ny = 100; Zl = -2; Zu = 2; Nz = 100;
[opt_x,opt_y,opt_z] = ...
%Rotate Points:
d=[1;1;1]; d=d(:).'/norm(d);
opt = [opt_x(:),opt_y(:),opt_z(:)]*R';
opt_x = opt(:,1)'; opt_y = opt(:,2)'; opt_z = opt(:,3)';
figure; plot3(Line_X,Line_Y,Line_Z,'r-'); hold on;
Here I am trying to make each of the 'planes' to intersect the line, but be perpendicular at all points. Returning back the the version I am able to code, for the simpler line used in my question I am looking for:
X = [-5:5]; Y = ones(size(X)); Z = ones(size(X)); %Define Line
plane_x = linspace(-2,2,3); plane_y = linspace(0.9,1.1,100); plane_z = linspace(0.9,1.1,100);
figure;plot3(X,Y,Z,'r-'); hold on;

Sign in to comment.




Community Treasure Hunt

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

Start Hunting!