File Exchange

## Frenet

version 1.0.0.0 (918 Bytes) by Daniel Claxton

### Daniel Claxton (view profile)

FRENET - Frenet-Serret Space Curve Invarients

Updated 01 Jun 2006

FRENET - Frenet-Serret Space Curve Invarients

[T,N,B,k,t] = frenet(x,y);
[T,N,B,k,t] = frenet(x,y,z);

Returns the 3 vector and 2 scaler
invarients of a space curve defined
by vectors x,y and z. If z is omitted
then the curve is only a 2D,
but the equations are still valid.

_ r'
T = ---- (Tangent)
|r'|

_ T'
N = ---- (Normal)
|T'|
_ _ _
B = T x N (Binormal)

k = |T'| (Curvature)

t = dot(-B',N) (Torsion)

Example:
theta = 2*pi*linspace(0,2,100);
x = cos(theta);
y = sin(theta);
z = theta/(2*pi);
[T,N,B,k,t] = frenet(x,y,z);
line(x,y,z), hold on

quiver3(x,y,z,T(:,1),T(:,2),T(:,3),'color','r')
quiver3(x,y,z,N(:,1),N(:,2),N(:,3),'color','g')
quiver3(x,y,z,B(:,1),B(:,2),B(:,3),'color','b')
legend('Curve','Tangent','Normal','Binormal')

### Cite As

Daniel Claxton (2020). Frenet (https://www.mathworks.com/matlabcentral/fileexchange/11169-frenet), MATLAB Central File Exchange. Retrieved .

Maria M.

### Maria M. (view profile)

Output for torsion is incorrect. Decided not to spend time trying to fix it. Try frenet_robust.zip instead!

Graham W Griffiths

### Graham W Griffiths (view profile)

Good function. However, I assume that using dx = gradient(x), etc. implies that the spacing in vector x should be uniform. If this is the case it should be made clear, as for many problems this will not be the case. For non-uniform spacing Fornberg's weights() function can be used to obtain an accurate gradient.
Ref: Bengt Fornberg (2010), Finite differences, Scholarpedia, 6(10):9685.

kim9091

argo

argo

Abhrajit

### Abhrajit (view profile)

Hi,

The torsion formula used in the code is not correct. It is not dot(-B,N) but dot(-B',N). Could you please check. Thanks

AL

Marc Cote

### Marc Cote (view profile)

With the correction of Peter Vatter, everything is working fine.

Thanks

Marc Cote

Peter Vatter

### Peter Vatter (view profile)

Thanks for the very nice code. It's the only piece I know which implements the way back - from a point cloud to the curvature and torsion values. Only the calculation of the torsion is actually incorrect. For an generic helix the calculated torsion is not constant. The fix by G.Z. unfortunately didn't work for me. I corrected the code as following (altough it certainly can be done shorter and easier):

dddr = [dddx dddy dddz];

t = vdot(cross(dr, ddr), dddr) ./ mag(cross(dr, ddr),1).^2;

function N = vdot(A, B)
%row-wise dot-product of A and B
N=zeros(size(A,1),1);
for i=1:size(A,1)
N(i) = dot(A(i,:), B(i,:));
end

david Fernandez

### david Fernandez (view profile)

Thanks it works perfect! but the example is wrong write, you have to transpose the T to use quiver3:
quiver3(x,y,z,T(:,1)',T(:,2)',T(:,3)','color','r')
quiver3(x,y,z,N(:,1)',N(:,2)',N(:,3)','color','g')
quiver3(x,y,z,B(:,1)',B(:,2)',B(:,3)','color','y')

G. Z.

### G. Z. (view profile)

Hi all,
It is a very nice and usefull code, however:
I am no expert on this kind of math, but there may be an error in the torsion calculation in the code:
t = dot(-B,N), instead t = dot(-B',N)
I know that the code as it is now does not give a correct answer for a synthetic helix..
worth checking.
Thanks!

J. Li

It is excellent for a curve that is really smoothly curved.

Do you have any idea how to handle the case that the curve is reduced to a straight line and/or the curved is reduced to a polygon as in the case of a nurb curve of order 2 in the Nurbs toolbox?

Thanks!