Rounding error? This may be the reason, igor's version is working with cos = (a dot b)^2 / (|ab|^2) while you are using cos = (a dot b) / |ab| 2014-03-16 17:01 GMT+01:00 MartinW <wm@fastmail.fm>:
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.
-- View this message in context: http://forum.world.st/Calculate-angle-between-two-vectors-probably-Igor-tp47... Sent from the Pharo Smalltalk Users mailing list archive at Nabble.com.