# [metapost] Re: d\'ej\`a vu or turningnumber, area et caetera

Boguslaw Jackowski bop at bop.com.pl
Fri Feb 4 12:57:40 CET 2005

```Hello,

DL> The turning angle is plus or minus 180. You're probably thinking of
DL> the exterior angle, which might be 0 or 360 at a cusp.

Yes, indeed.

DL> A _turning angle_
DL> of 360 leaves the ant facing the same way and will never occur.

Thank you for pointing out my terminological slip and sorry for being
imprecise.

WL> What about my approach using the angles between PP+ and Q-Q to get the
WL> orientation (*not* the turningnumber)?  This would be even simpler
WL> since it doesn't need special code to avoid overflow.  Do you see any
WL> problems?

Needs some explanations and some coding -- see my next letter (it's under
preparation since a few days but so called urgent matters hold me back
from finishing it).

TH> The only actual use I know of is that the "counterclockwise" macro in
TH> MF uses turningnumber to reverse a path explicitly (because it would
TH> have raised an error while coloring pixels, otherwise).

I heavily exploit this feature in font programs -- the orientation of paths
is a very important factor.

TH> I don't like the use of Area() for turningnumbers, because Area()
TH> assumes that the path is extremely well-behaved. Under that condition,
TH> it is definately  easier (as Werner suggests) to calculate a sum of
TH> direction angles. Counting angles is also a lot faster.

I don't say that using `Area' is obligatory. ;-)

Nevertheless, counting angles is not a trifle. Actually, the optimized
Werner's `is_clockwise' function, even without taking into account the
crossing of control vectors (how should I name them?) is as effcient as
counting `Area' (slightly worse, but it can be improved).

In my font programs I use the `emergency_turningnumber' defined
as follows:

vardef straighten_path(expr r) =
for k=0 upto length r - 1: point k of r -- endfor
if cycle r: cycle else: point infinity of r fi enddef;
vardef emergency_turningnumber primary r =
original_turningnumber(straighten_path(r))
enddef;

It is three times faster than `Area' and `is_clockwise'; of course,
it also does not work with weird paths.

Cheers -- Jacko

Ps. Dan, how your name should be pronounced? (English spelling for my
name would be Yatskovsky; hence also Yatsko ;-)

--
BOP s. c.
ul. Bora-Komorowskiego 24, 80-377 Gdansk, Poland
tel. (+48 58) 553 46 59,  fax (+48 58) 511 03 81
bop at bop.com.pl, http://www.bop.com.pl

```