lff definition

borneq edited this page Jan 21, 2012 · 6 revisions

LibreCAD Font File explanation.

The header of file is self-documented

below a explanation of a glyph definition:

[0041] A
0.0000,0.0000;3.0000,9.0000;6.0000,9.000
1.0800,2.5500;4.7300,2.5500

line 1 => utf-8 code + letter

line 2 & 3 =>sequence like polyline vertex with ";" separating vertex and "," separating x,y coords. One polyline definition in each line of text

[0066] f
1,0;1,7.5;2.5,9,A-0.414214;3,9
0,6;3,6

line 2 =>sequence like polyline vertex with ";" seperating vertex and "," separating x,y coords, if there is a third field prefixed with "A" this field is a polyline bulge (the tangent of 1/4 of the arc angle)

[00C1] Á
C0041
2.000000,9.0000,4.0000,10.0000

line 2 =>copy defined char 0041 "A" as a nested block

Notes about arc bulge: The bulge is the tangent of 1/4 of the arc angle. If bulge is positive the arc included angle is counter-clockwise.

For code to calculate center, radius and included angle you can see the function, in file src/lib/engine/rs_polyline.cpp:

RS_Entity* RS_Polyline::createVertex(const RS_Vector& v, double bulge, bool prepend)

p.e. the formula to calculate the radius is:

A = arctangent(B)*4

R = absolute(D / (sin(A/2)*2) )

where

  • B is bulge

  • D is distance from start to end point

  • R is the calculated radius

Another formula to calculate the radius:

S = B*d

R = (SS + dd) / (2*S)

where

  • B is bulge

  • S is the calculated sagitta

  • d is half chord (half of distance from start to end point)

  • R is the calculated radius

Determining direction:

  • In: LastPoint and PrevPoint

  • Out: points starting and ending arc

    if (B>=0) { startPoint = PrevPoint; endPoint = LastPoint; }
    else { startPoint = LastPoint; endPoint = PrevPoint; }

Calculate center of circle of arc:

Point Middle = (PrevPoint + LastPoint) /2 
z - distance from Middle to Center
z = sqrt(sqr(R)-sqr(d)); //d = D/2
Center is in distance z from Middle in direction perpendicular to line between startPoint and endPoint
center.X = middle.X - (endPoint.y-startPoint.y)/d*z;
center.Y = middle.Y + (endPoint.x-startPoint.x)/d*z;
You can’t perform that action at this time.
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.
Press h to open a hovercard with more details.