Alain Martel <kua### [at] videotronca> wrote:
> > In creating some testing for include file macros I came across code for
> > the two VAngle* macros (and two similar rotation related macros):
> > #macro VAngle(V1, V2)
> > #end
> > The min(1,..) is obviously trying to protect acos from domain errors.
> > Why only the clamp to the positive side? Aren't we as exposed to <-1.0?
> > Often enough in code - including POV_Ray's own - I've seen code clamping
> > to a [-1..1] range after a dot product into acos() for acos domain
> > concerns.
> > I cannot come up with reasoning to clamp only the positive side. Anyone
> > else? If valid to do, we might be able to slightly streamline some
> > internal code.
> > Bill P.
> The reason is quite simple : Normally, the vdot function of two
> normalized vectors can not return a value that is less than -1 nor more
> than 1.
I think that this is only in theory. In practice there will sometimes be
roundoff errors that cause problems.
> So, the min() could probably be safely removed.
> #macro VAngle(V1, V2)
> acos(vdot(vnormalize(V1), vnormalize(V2)))
Post a reply to this message