From: Gavin Kistner Date: 2004-10-11T21:57:18+09:00 Subject: Re: [QUIZ] Geodesic Dome Faces (#3) On Oct 11, 2004, at 4:09 AM, Dennis Ranke wrote: > v = b*x + a*(1.0-x) > ab.push v * (1 / Math.sqrt(v.inner_product(v))) The Vector class has its own magnitude/length property called .r, so: ab.push v * (1.0 / v.r ) would be slightly better. Or, as I did: # Extensions to the Vector class class Vector # Returns a Vector whose length (.r) is 1.0 def normalized self / self.r end # Divide the vector by a scalar # Scales the values in the Vector by 1.0 / n, and returns the new Vector def /( n ) self * ( 1.0 / n ) end # Modify the receiving vector to be of length (.r) 1.0 def normalize! len = self.r self.scale_by!( 1/len ) end # Modify the receiving vector, multiplying each component by the specified factor def scale_by!( scale_factor ) @elements.collect!{ |e| e*scale_factor } self end # Modify the receiving vector, scaling it to be the specified length def r=(new_len) old_len = self.r self.scale_by!( new_len/old_len ) unless new_len==old_len self end end