[Bf-python] AngleBetweenVecs still buggy.

Joseph Gilbert jgilbert at TIGR.org
Mon Sep 26 18:46:40 CEST 2005


This would be a nice issue to be submitted to the bug tracker. Please 
describe the conditions under which your getting NAN returned.

Campbell Barton wrote:

> Hi, There are a number of existing fixes for 
> Mathutils.AngleBetweenVecs being buggy. For the Nth time I'm  using a 
> python workaround, but its frustrating that there have been 4 people 
> who have released fixes, some ~5 months old.
>
> Heres what I'm currently using as a python wrapper that works around 
> Anglebetween Vecs returning NAN.
>
>
> # VEC ANGLE NEVER RETURNS NAN!
> #=============================================================================# 
>
> # Math functions   
> #=============================================================================# 
>
> X,Y,Z = 0,1,2
>
> def vecMagnitude(vec):
>    '''Calculates the magnitude of a vector and returns the result.
>
>         Assumes the vector is an XYZ vector.
>    '''
>    return math.sqrt(vec[X]**2 + vec[Y]**2 + vec[Z]**2)
>
>
> def vecDotProduct(vec1, vec2):
>    """Calculates the dot product of two vectors and returns it.
>
>         Assumes all the vectors are XYZ vectors.
>    """
>    return vec1[X]*vec2[X] + vec1[Y]*vec2[Y] + vec1[Z]*vec2[Z]
>
>
> def vecAngle(vec1, vec2):
>    """Calculates the angle between two vectors (in degrees) and 
> returns it.
>
>         Assumes all the vectors are XYZ vectors.
>    """
>    # Assume they could be the same first.
>    if vec1.x == vec2.x and\
>    vec1.y == vec2.y and\
>    vec1.z == vec2.z:
>        return 0
>        # Try NAN returning mathutils first
>    ang = Mathutils.AngleBetweenVecs(vec1, vec2)
>    if ang == ang: # Not nan?
>        return ang
>      # Ick Blender cant do it se we have to.
>      denom = vecMagnitude(vec1) * vecMagnitude(vec2)
>    if denom != 0:
>        quotient = vecDotProduct(vec1, vec2) / denom
>
>        #clip the quotient to acceptable values for acos
>        if quotient > 1:
>            quotient = 1
>        if quotient < -1:
>            quotient = -1
>
>        return math.acos(quotient) / math.pi * 180.0
>    else:
>        #the vectors are perpendicular
>        return 90.0
>
> _______________________________________________
> Bf-python mailing list
> Bf-python at projects.blender.org
> http://projects.blender.org/mailman/listinfo/bf-python





More information about the Bf-python mailing list