Richard A. O'Keefe
ok at cs.otago.ac.nz
Wed Aug 7 03:09:49 UTC 2002
stephane ducasse <ducasse at iam.unibe.ch> wrote:
Certain methods often accept aPoint or a number but sign was not
defined on Point reducing the polymorphism between number and points.
"Answer a new point representing the sign of the point.
Answer 1 if the receiver is greater than 0, -1 if less than 0, else 0."
^ self class x: x sign y: y sign
I note that the comment disagrees with the code:
it does NOT answer 1, -1, or 0, ever.
It is not clear to me what "the sign of the point" could actually mean.
The most natural interpretation, to me, would be the method currently
known as #normalized.
"Answer a new point representing the same direction as this
point, considered as a 2-vector, but with standard magnitude.
Ensure that (pt theta) = (pt sign theta)."
r := self r.
^r = 0 ifTrue: [self shallowCopy] ifFalse: [self / r]
It appears that Point>>abs regards a Point simply as a pair of numbers
without geometric significance, so I suppose having Point>>sign act
the same way is consistent: pt sign * pt abs = pt.
But it's regrettable that Point arithmetic is so ad hack.
Suggestion 1. Change the comment in Ducasse's method to
"Answer a new point whose coordinates are the signs of my coordinates.
Ensure that (pt sign * pt abs) = pt."
^self class x: x sign y: y sign
Suggestion 2. Fix #normalized; (0 at 0) normalized gets a division by zero.
At a minimum, make it explicit in the comment that it's not meant to "work".
"Answer a new point with the same direction (theta) as the
receiver, but with unit magnitude (r). NOT DEFINED for 0 at 0.
pt normalized theta = pt theta
pt normalized r = 1
pt normalized * pt r = pt
Code optimized for speed -- ar 8/26/2001"
r := ((x*x) + (y*y)) sqrt.
^(x/r) @ (y/r)
More information about the Squeak-dev