# How to find the transformation matrix for a plat knowing the old and new coordinates of 3 points on it ?

3 views (last 30 days)
Commented: Matt J on 5 Nov 2019
Hi All
How do I define the transformation matrix of a plate that moves in space , knowing the old and new coordinates of 3 points on the plate ? (assume a circular plate and reference coordinate system in the center of the plate )

#### 1 Comment

Any ideas ?

Matt J on 14 Jun 2019

Matt J on 21 Oct 2019
As mentioned in the help doc, the code only does extrinsic rotations and the order of the rotations is specified by the second input argument:
>> help rot2taitbryan
Calculates extrinsic Tait-Bryan angles from rotation matrix
ang = rot2taitbryan(R,order)
* `R`: Rotation matrix (3x3)
* `order`: Order of angles to return; any of:
{'XYZ','XZY','YXZ','YZX','ZYX','ZXY'} %case insensitive
* `ANG`: Angles (degrees) in specified order
NOTE: order of application of these rotations is right-to-left, both as
indicated by `order` and `ANG'. So, as an example,
>> R=Rz(30)*Ry(20)*Rx(60)
R =
0.8138 0.0065 0.5811
0.4698 0.5811 -0.6645
-0.3420 0.8138 0.4698
>> rot2taitbryan(R,'zyx')
ans =
30.0000 20.0000 60.0000
Dear Matt : thank you for the above answer : but what if I don't know the order of rotation ?? this command asks for the order actually
second question : Does Absor.m give me the rotation matrix ? how can I get it ?
Matt J on 5 Nov 2019
but what if I don't know the order of rotation
The order is something you choose not something you determine. All 6 decompositions are equivalent - it just depends on your preference.
Does Absor.m give me the rotation matrix
Yes, it is in the regParams.R output.

Jan on 27 Jun 2019
You can define the motion by a translation of the center of the 3 points and a rotation of the local coordinate system.
PointsA = [x1, y1, z1; ...
x2, y2, z2; ...
x3, y3, z3];
PointsB = ...
Translation = mean(PointsB, 1) - mean(PointsA, 1);
% For the local coordinate systems find an orthonormal tripod:
v1 = PointsA(1, :) - PointsA(2, :);
n1 = v1 ./ norm(v1);
v2 = PointsA(2, :) - PointsA(3, :);
n2 = v2 ./ norm(v2);
c2 = cross(n1, n2);
n12 = c2 ./ norm(c2);
CoorA = [n1, n12, cross(n1, n12)];
% The same for B...
Rotation = CoorA * CoorB'
Anotehr approach would be the "Helical Axis": Any motion can be defined by an axis and some rotation around it and translation along it. See http://www.kwon3d.com/theory/jkinem/helical.html

Show 1 older comment
Matt J on 27 Jun 2019
so you are saying that using absor and rcParams.R is not a good idea ?
Jan's approach will be sub-optimal if you have non-neglible measurement errors in A and B. Also, if you decide to use more than 3 points (for data redundancy), absor will better accommodate that case.
Jan on 28 Jun 2019
@farzad: Of course I did not say that "using adsor is not a good idea". Especially if you have more than 3 points on a rigid body, an optimization appraoch is the correct approach.