Rotate the coordinate system to align an existing plane with Y'Z' plane
52 visualizzazioni (ultimi 30 giorni)
Mostra commenti meno recenti
I have a plane z = (-47.407313)*x + (0.322175)*y + (-3.333979) and data points of a ball flight trajectory on it. Even though the best fit is known to be a parabola, since the plane in discussion doesn't align with any of the XY, YZ and ZX planes, it is infeasible to define an explicit relationship z = F(x,y) for obtaining such a curve using curve fitting. Now, my only idea is to rotate the coordinate system so that the plane is parallel to Y'Z' where I can apply (z')=a(y')^2+b(y')+c. After finding the best fit and sampling the points on the fit, I need to retract the coordinate system to get the actual coordinates. Even though the idea seems clear, the application in MATLAB doesn't and I'm hoping someone can guide me with the rotation.
I would be grateful if anyone can suggest an alternate, easier approach to get the 3D best fit equation without this hassle.
3 Commenti
Risposte (3)
Torsten
il 15 Mag 2022
Modificato: Torsten
il 15 Mag 2022
But are you sure that the parabola in the YZ plane is not also rotated ?
5 Commenti
Torsten
il 16 Mag 2022
If you have a 3d-model of the parabola of the form
(a*t^2+b*t+c;d*t^2+e*t+f;g*t^2+h*t+i)
you can directly fit the 9 parameters in question.
Bruno Luong
il 16 Mag 2022
2 Commenti
Bruno Luong
il 16 Mag 2022
The answer I gave in the above thread shows to use SVD to fit a point clouds, the input point cloud can be a non degenerated curve (i.e. not a line) and not necessary a plane.
Matt J
il 16 Mag 2022
Modificato: Matt J
il 16 Mag 2022
If you didn't obtain your plane fit with planarFit() from,
then I suggest you do so. If you did use planarFit(), then the rotation is easy:
pfit=planarFit(xyz);
yz_prime = pfit.R(:,2:3)'*xyz;
However, once you've rotated the data this way, you still can't be sure in which direction gravity pulls (see also my comment above).
One solution would be to post-optimize the in-plane rotation of yz
theta=fminbnd(@(theta) postfun(theta,yz_prime), 0,pi);
[~,abc]=postfun(theta,yz_prime)
using the 1D objective function,
function [fval,abc]=postfun(theta,yz_prime)
R=makehgtform('zrotate',theta);
yz=R(1:2,1:2)*yz_prime;
[abc,S]=polyfit(yz(:,1),yz(:,2),2)
fval=S.normr;
end
Vedere anche
Categorie
Scopri di più su Get Started with Curve Fitting Toolbox in Help Center e File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!