# [metapost] Re: tangent

Boguslaw Jackowski bop at bop.com.pl
Tue Jan 18 11:06:54 CET 2005

```BJ> Could you present your solution?

HP> z is in origin, curve is concave (see picture)
HP>
HP>    |
HP> -------------------------
HP>    |     * * *
HP>    |   *        *
HP>    |  *           *
HP>    | *             *
HP>    |                *

Much better assumptions than just ``general'' ;-)

1. I'd rather use geometrical length as `delta' (this would
involve arctime and arclength operators). Time is very
imprecise and non-uniform.

2. Still better would be using a binary search, since you know
in advance that the time you're looking for is somewhere between
the time where the path goes rigthward and the length of the curve:

path curve; numeric intersect, t, tl, tr;
curve:=((0,0)..(100,100)..(300,-100)) shifted (100,-200); % exempli gratia
beginfig(100);
tl:=directiontime right of curve; tr:=length curve;
forever:
t:=1/2[tl,tr]; exitif (tr-tl)<2epsilon;
numeric intersect;
(intersect,0) = point t of curve + whatever * (direction t of curve);
if (intersect<0): tl:=t else: tr:=t fi;
endfor
show intersect; draw (point t of curve)--(intersect,0); draw curve;
endfig;
end.

3. My favorite technique, however, would be the following algorithm:

path curve; numeric t, tprev;
curve:=((0,0)..(100,100)..(1000,-100)) shifted (100,-200); % exempli gratia
def cdir expr t = directiontime point t of curve of curve; enddef;
beginfig(100);
t:=length curve;
forever: tprev:=t; t:=cdir t; exitif abs(t-tprev)<eps; endfor;
show t; draw origin--point t of curve; draw curve;
endfig;
end.

The only thing we have to know in advance is a time t such that
the line
origin--point t of curve
crosses the curve in two points (here t=length curve). The algorithm
then replaces the time by the time where the curve direction is parallel
to the secant. And again. And again. After a few steps the iteration
should converge.

Needless to say, there are infinitely many cases where each of
the algorithms would fail ;-) But it is not difficult to ``robustify''
the algorithm (3) so that if will work in most of reasonable cases.

Cheers -- Jacko

--
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

```