# Is it possible to express any planar transformation in terms of rotation?

## Main Question or Discussion Point

Hi,

I'm am trying to calculate the radius of curvature of a trajectory in a plane. I am using Frenet-Serret formulas and perpendicular bisector approach to calculate the radius. It comes out that both the approaches lead to same answer when I calculate the radius for a trajectory generated using just rotation transformation. However, when I calculate the radius for a trajectory generated using mixed transformation (involving both rotation and translation) the answers are significantly different. This seems to me as strange as the trajectory must have only one radius at each point though it might vary along the arc length. So, the question boils down to whether it is possible to express any general planar transformation by just rotation?

Thanks.

Regards,
Priyanshu

What do you mean by "a trajectory generated using mixed transformation (involving both rotation and translation)"?

I mean the homogeneous transformation matrix contains entry for both rotation and translation. Also, the rotation and translation vary as the trajectory is generated.

In 2 dimensions, the answer is yes except for the case of translation without rotation (infinite radius of curvature).

In 3 dimensions, a transformation that consists of a nontrivial rotation and a translation is not necessarily equivalent to a simple rotation. A counterexample is a rotation about some axis combined with translation along the same axis.

Thanks hamster. But I'm not clear about why is the radius obtained using both the approaches are significantly different when I increase the complexity of the curve in 2 dimensions. Say for t degrees of rotation, I translate by t^n and I vary t from 0 to 100. As I increase the value of n, the answer from both the approaches vary significantly. However, for a rotation+constant translation the radius by two approaches match exactly.

Here is the MATLAB Code. Basically I'm applying the calculations to four corners of a square which is being transformed.

clear all
close all
clc

dt = 1;
Scale = 3; % Just defined to care of the plotting stuff
Sx = [0 0 1 1 0];
Sy = [0 1 1 0 0];
Sz = [0 0 0 0 0];
P1 = [];
P2 = [];
P3 = [];
P4 = [];
K = [];
X = [];
Y = [];
Z = [];
Tprev = 0;

figure
plot(Sx,Sy)
axis(2*[-10 10 -10 10]*Scale);
grid on;
P = 2*Scale*[Sx; Sy; Sz;ones(size(Sx))];
Pprev = P;

for t = 1:dt:80
% R = makehgtform('zrotate',deg2rad(t),'translate',[(t/40) (t/40) 0]);
R = makehgtform('zrotate',deg2rad(t),'translate',[(t/50)^3 (t/50) 0]); % Homogeneous Transformation matrix
% R = makehgtform('zrotate',deg2rad(t),'translate',[2 4 0]);
Pnew = R*P; % Evaluation of transformed points
P1 = [P1 Pnew(1:2,1)];
P2 = [P2 Pnew(1:2,2)];
P3 = [P3 Pnew(1:2,3)];
P4 = [P4 Pnew(1:2,4)];
PC = [P1 P2 P3 P4];

dr = (Pnew-Pprev); %Calculating dr
Tnew = [dr(:,1)/(sum(dr(:,1).^2))^0.5,...
dr(:,2)/(sum(dr(:,2).^2))^0.5,...
dr(:,3)/(sum(dr(:,3).^2))^0.5,...
dr(:,4)/(sum(dr(:,4).^2))^0.5,...
dr(:,5)/(sum(dr(:,5).^2))^0.5]; %Calculating dr/ds
dT = (Tnew-Tprev);
dTds = [dT(:,1)/(sum(dr(:,1).^2))^0.5,...
dT(:,2)/(sum(dr(:,2).^2))^0.5,...
dT(:,3)/(sum(dr(:,3).^2))^0.5,...
dT(:,4)/(sum(dr(:,4).^2))^0.5,...
dT(:,5)/(sum(dr(:,5).^2))^0.5];

k = [(sum(dTds(:,1).^2))^0.5,...
(sum(dTds(:,2).^2))^0.5,...
(sum(dTds(:,3).^2))^0.5,...
(sum(dTds(:,4).^2))^0.5]
K = [K; k];

%Radius calculation using Perperndicular bisector method
drxyz = [dr(1:3,1), dr(1:3,2), dr(1:3,3), dr(1:3,4)];
Z = repmat([0; 0; 1],1,4);
Nr = cross(drxyz,Z);
Nr = [Nr(1:2,1)/sum(Nr(1:2,1).^2)^0.5, -Nr(1:2,2)/sum(Nr(1:2,2).^2)^0.5,...
Nr(1:2,3)/sum(Nr(1:2,3).^2)^0.5, -Nr(1:2,4)/sum(Nr(1:2,4).^2)^0.5];
MP = (Pnew+Pprev)/2;
DMP12 = [MP(1:2,2)-MP(1:2,1)];
DMP34 = [MP(1:2,4)-MP(1:2,3)];
lambda = [inv(Nr(:,1:2))*DMP12, inv(Nr(:,3:4))*DMP34]
r1 = MP(1:2,1)+lambda(1)*Nr(:,1)-Pnew(1:2,1); %Calculating the radius for 1st corner
r2 = MP(1:2,2)+lambda(2)*Nr(:,2)-Pnew(1:2,2);
r3 = MP(1:2,3)+lambda(3)*Nr(:,3)-Pnew(1:2,3);
r4 = MP(1:2,4)+lambda(4)*Nr(:,4)-Pnew(1:2,4);

%Plotting and annotating
plot(Pnew(1,:),Pnew(2,:),'-k',P1(1,:),P1(2,:),'-r',P2(1,:),P2(2,:),'-b',P3(1,:),...
P3(2,:),'-g',P4(1,:),P4(2,:),'-y');
text(Pnew(1,1),Pnew(2,1),'1');
text(Pnew(1,2),Pnew(2,2),'2');
text(Pnew(1,3),Pnew(2,3),'3');
text(Pnew(1,4),Pnew(2,4),'4');
axis(2*[-10 10 -10 10]*Scale);
grid on;
pause(0.01);
Pprev = Pnew;
Tprev = Tnew;
% pause;
end

figure
s = length(K)
h = plot(1:s,K(1:s,1),'-b',1:s,K(1:s,2),'-r',1:s,K(1:s,3),'-g',1:s,K(1:s,4),'-y');
axis tight
xlabel('Sample No \rightarrow','fontsize',12)
ylabel('\kappa \rightarrow','fontsize',12);
legend(h,'Vertex 1','Vertex 2','Vertex 3','Vertex 4');
grid on

figure
axis tight
xlabel('Sample No \rightarrow','fontsize',12)
legend(h,'Vertex 1','Vertex 2','Vertex 3','Vertex 4');
grid on

figure
axis tight
Title(' Radius of Curvature from perpendicular bisector','fontsize',12);
xlabel('Sample No \rightarrow','fontsize',12)