[metapost] Re: new is_clockwise routine
gip.bilotta at iol.it
Sun Nov 27 12:23:31 CET 2005
Sunday, November 27, 2005 Paul Pichaureau wrote:
> Le samedi 26 novembre 2005 à 19:51:46, vous écriviez :
GB>> In general, to find the clockwiseness of a single Bézier
GB>> cubics it suffices to check for the sign of
GB>> (P1 - P0) × (P2 - P1)
GB>> (P2 - P1) × (P3 - P2)
GB>> (P0, P1, P2, P3 are the points that define the curve: P0 ..
GB>> controls P1 and P2 .. P3)
> I've tried to implement an algorithm of this type.
> Hélas, it's quite impossible in metapost, due to the limitation of the
> magnitude of real number. For example, with the bezier curve
> (-50,-50).. controls (50,150) and (150,50) ... (300,300)
> metapost have to compute
> (100,200) x (100,-100) = -10 000 - 20 000 < 4 096 BANG !
> (100,-100) x (150,250) = 25000 + 15 000 > 4 096 re-BANG !
> The worst is the result can be really simple (e.g. 0 or -1) but the
> metapost refuse even intermediate numbers greater than 4096...
I suspected you would come across a problem like this.
However, the solution is simple because we are interested in
the *sign* of the cross product, so instead of trying to
calculate a×b you just calculate dir(a) × dir(b): the sign
is the same but the vectors have unitary length and thus the
cross product will not bang.
Giuseppe "Oblomov" Bilotta
More information about the metapost