Login  Register

Calculate angle between two vectors (probably @Igor :)

Posted by MartinW on Mar 16, 2014; 4:01pm
URL: https://forum.world.st/Calculate-angle-between-two-vectors-probably-Igor-tp4749351.html

Hello,
i probably made some embarassing mistake, but as i cannot find it, i ask you to have a look at this method.
It should calculate the angle between two vectors. And vectors are instances of Point (perhaps here is already a misconception?).
It is used in my flocking simulation PharoBoids (http://smalltalkhub.com/#!/~MartinWalk/Boids)

Here is my version of the method:

angleBetween: vector1 and: vector2 onError: aBlock
        | cosinusOfAngle innerProductOfVectors productOfVectorsLengths|
        innerProductOfVectors := (vector1 dotProduct: vector2).
        productOfVectorsLengths := (vector1 r) * (vector2 r).
        productOfVectorsLengths = 0 ifTrue: [ ^ aBlock value ].
        cosinusOfAngle := innerProductOfVectors / productOfVectorsLengths.
        ^ cosinusOfAngle arcCos
       
But my Boids behave wrong when i use it. I found another implementation of the same problem by Igor Stasenko which works and looks like this:

angleBetween: p1 and: p2 ifDegenerate: aBlock
" Calculate an angle (in radians) between two vectors.
Evaluate a block, in case if calculation not possible because one of the vectors has zero length "

        | x1 y1 x2 y2 dot2 n2 |
        x1 := p1 x.
        y1 := p1 y.
        x2 := p2 x.
        y2 := p2 y.
       
        dot2 := x1 * x2 + (y1 * y2).
        dot2 := dot2 * dot2.
       
        n2 := (x1*x1 + (y1*y1)) * (x2*x2 + (y2*y2)).
       
        n2 = 0 ifTrue: [ ^ aBlock value ].
       
        ^ (dot2 / n2) arcCos
       
Can anybody explain the problem of my method? M.