<div dir="ltr"><div><div><div><div><div>First of all, you could simplify your code with dotProduct, writing<br></div><div><br></div>dot2 := p1 dotProduct: p2.<br><br></div>But maybe you just need<br><br></div>((p1 normalized) dotProduct: (p2 normalized)) arcCos         ;-)<br>
<br></div>You can also explore the polar coordinates...<br><br></div>Alain<br></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Sun, Mar 16, 2014 at 8:01 PM, MartinW <span dir="ltr"><<a href="mailto:wm@fastmail.fm" target="_blank">wm@fastmail.fm</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hello,<br>
i probably made some embarassing mistake, but as i cannot find it, i ask you<br>
to have a look at this method.<br>
It should calculate the angle between two vectors. And vectors are instances<br>
of Point (perhaps here is already a misconception?).<br>
It is used in my flocking simulation PharoBoids<br>
(<a href="http://smalltalkhub.com/#!/~MartinWalk/Boids" target="_blank">http://smalltalkhub.com/#!/~MartinWalk/Boids</a>)<br>
<br>
Here is my version of the method:<br>
<br>
angleBetween: vector1 and: vector2 onError: aBlock<br>
        | cosinusOfAngle innerProductOfVectors productOfVectorsLengths|<br>
        innerProductOfVectors := (vector1 dotProduct: vector2).<br>
        productOfVectorsLengths := (vector1 r) * (vector2 r).<br>
        productOfVectorsLengths = 0 ifTrue: [ ^ aBlock value ].<br>
        cosinusOfAngle := innerProductOfVectors / productOfVectorsLengths.<br>
        ^ cosinusOfAngle arcCos<br>
<br>
But my Boids behave wrong when i use it. I found another implementation of<br>
the same problem by Igor Stasenko which works and looks like this:<br>
<br>
angleBetween: p1 and: p2 ifDegenerate: aBlock<br>
" Calculate an angle (in radians) between two vectors.<br>
Evaluate a block, in case if calculation not possible because one of the<br>
vectors has zero length "<br>
<br>
        | x1 y1 x2 y2 dot2 n2 |<br>
        x1 := p1 x.<br>
        y1 := p1 y.<br>
        x2 := p2 x.<br>
        y2 := p2 y.<br>
<br>
        dot2 := x1 * x2 + (y1 * y2).<br>
        dot2 := dot2 * dot2.<br>
<br>
        n2 := (x1*x1 + (y1*y1)) * (x2*x2 + (y2*y2)).<br>
<br>
        n2 = 0 ifTrue: [ ^ aBlock value ].<br>
<br>
        ^ (dot2 / n2) arcCos<br>
<br>
Can anybody explain the problem of my method? M.<br>
<br>
<br>
<br>
--<br>
View this message in context: <a href="http://forum.world.st/Calculate-angle-between-two-vectors-probably-Igor-tp4749351.html" target="_blank">http://forum.world.st/Calculate-angle-between-two-vectors-probably-Igor-tp4749351.html</a><br>

Sent from the Pharo Smalltalk Users mailing list archive at Nabble.com.<br>
<br>
</blockquote></div><br></div>