[英]Slicing of 3D trajectory curve in MATLAB
我有對應於在三個維度上移動的粒子的數值數據,在 n 個等間隔時間 t = [1,2,3,4,5,...] 采樣,得到三個坐標 arrays,例如,對於 n=5 :
x = [1,2,3,4,5]
y = [1,5,6,7,10]
z = [2,3,8,9,10]
我已經能夠使用 cscvn 找到合適的插值,但我現在不知道如何找到對應於固定 z 值(即常量 z 切片)的 x 和 y 坐標。
您可以通過 cscvn 提取曲線 output 內的各個立方體,然后檢查每個立方體是否以及在何處與您選擇的 Z 值在該部分邊界內相交。
x = randi(10,[1 5]);
y = randi(10,[1 5]);
z = randi(10,[1 5]);
zChosen = 5;
curve = cscvn([x;y;z]);
parametricCrossingPoints = struct('crossingPoints',[],'Xs',[],'Ys',[],'Zs',[]);
parametricCrossingPoints = repmat(parametricCrossingPoints,curve.pieces,1);
% for each peice of the parametric curve, find the points where it crosses
% your desired z
for i = 1:size(curve.coefs,1)/3
% Find where parametric piece crosses zChosen
pPoints = roots(curve.coefs(i*3,:)'-[0;0;0;zChosen]);
% Filter out imaginary roots
pPoints = real(pPoints(imag(pPoints) == 0));
% Filter for points within the piece's boundary
pPoints(pPoints < 0 | pPoints > curve.breaks(i+1)-curve.breaks(i)) = [];
% Append points to list
parametricCrossingPoints(i).crossingPoints = pPoints + curve.breaks(i);
end
% Get x, y, and z of each crossing point
for i = 1:numel(parametricCrossingPoints)
xyzOfCrossingPoints = fnval(curve,parametricCrossingPoints(i).crossingPoints);
parametricCrossingPoints(i).Xs = xyzOfCrossingPoints(1,:);
parametricCrossingPoints(i).Ys = xyzOfCrossingPoints(2,:);
parametricCrossingPoints(i).Zs = xyzOfCrossingPoints(3,:); % Should all equal zChosen
end
% Collate points
Xs = [parametricCrossingPoints.Xs];
Ys = [parametricCrossingPoints.Ys];
Zs = [parametricCrossingPoints.Zs];
% Sometimes breakpoints aren't chosen, add them manually if necessary
xsToAdd = x(z == zChosen);
ysToAdd = y(z == zChosen);
for i = 1:numel(xsToAdd)
if ~any(Ys(Xs == xsToAdd(i)) == ysToAdd(i))
Xs(end+1) = xsToAdd(i);
Ys(end+1) = ysToAdd(i);
Zs(end+1) = zChosen;
end
end
% Plot results
fnplt(curve);
hold on
plot3(x,y,z,'o')
patch([min(x)-1,max(x)+1,max(x)+1,min(x)-1],...
[min(y)-1,min(y)-1,max(y)+1,max(y)+1],...
[zChosen,zChosen,zChosen,zChosen], ...
'green',...
'FaceAlpha',0.5)
plot3(Xs,Ys,Zs,'*')
hold off
對於每條曲線和指定的斷點,圍繞參數獨立參數(與您的時間 = t 不匹配)進行一些時髦的計算,但除此之外它非常簡單。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.