Re: Fw: Distance between 2 points
- Posted by Hawke <mdeland at NWINFO.NET> Sep 30, 1998
- 566 views
Ralf Nieuwenhuijsen wrote: >...to be dimension free, who knows how many dimensions >we are gonna explore in the future ? agreed, wholeheartedly... >That is also the problem with your function here, >you forget to substract. > function distance(object a, object b) > return sqrt( (a*a)+(b*b) ) > end function >I think you meant this: actually, i was thinking of a pair of lists of right triangle legs.... so i really shoulda called it: function hyp(object opp, object adj) return sqrt( (opp*opp)+(adj*adj) ) end function and then you throw a list of pairs of legs at it... i figured doing it this way would make the angle calc easier (as carl showed how to do that) not only that, the theorem states: c^2=a^2 + b^2 which is what i thought was getting thrown at it in the first place... using carl's and mine together: function hyp2d(object opp, object adj) return sqrt( (opp*opp)+(adj*adj) ) end function function hyp3d(object x, object y, object z) return sqrt( (x*x)+(y*y)+(z*z) ) end function function FindDistanceAngle(sequence coor1, sequence coor2) --accepts a pair of coordinate lists, in the form: --{{x,y},{x,y}...{x,y}} OR {{x,y,z},{x,y,z}...{x,y,z}} --and calculates the distance between them and the relative angle --returns {distance,theta} where distance and theta --are sequences equal to length(coor1) and theta is in radians. --now, theta bears special note, that if it refers to a 2d --world then theta is a sequence of atoms. if theta --is to refer to a 3d world then theta is a sequence of --sequences in the form {rotation,rise} where rotation --is the angle along the x/y axis' and rise is the angle --above or below that plane integer len sequence dist,theta object opp,adj,x,y,z len = length(coor1) if len!=length(coor2) then Error("unequal argument length ") end if dist=coor2-coor1 theta=repeat(0,len) temp=dist[1] if atom(temp) then Error("got a 2 sided triangle handy???") end if if length(temp)=2 then for i=1 to len do temp=dist[i] adj=temp[1] opp=temp[2] --below is what i had in mind dist[i] =hyp2d(opp,adj) theta[i]=arctan(opp/adj) end for elsif length(temp)=3 then for i=1 to len do temp=dist[i] x=temp[1] y=temp[2] z=temp[3] dist[i] =hyp3d(x,y,z) temp =arctan(y/x) theta[i]={temp,arctan(z/temp)} end for else Error("trying to use the 4th dimension? ;)") end if return {dist,theta} end function >> function distance(object a, object b) >> return power( (a*a)+(b*b),0.5 ) >> end function >It might be less precize, because the result will always >be a float because you use .5 yeah i was worried about that... a 3-4-5 triangle becomes a 3-4-4.999999 triangle... *blech* >I wonder when Robert is gonna make calculations with >floats convert back to machine integers when possible. that could be handy... >>to see if power is faster than sqrt. >Something I dont expect. ditto... but it would be interesting to see, no? :) >First of all, sqrt takes less arguments, and thus >needs less conversion. ah, but was there actually another thread written for that, OR!, does sqrt actually call power??? makes ya wonder eh? :) > Off course a simple benchmark would tell wouldn't it ? 'tis why i suggested it compadre... >And now here's my fastest function I could come >up with (allowing a number of dimension ranging >from 0 to eternity) > function distance (object a, object b) > if atom (a) and atom(b) then > if a > b then > return a-b > else > return b-a > end if > end if --kill this below > a = power(a - b,2) --these two lines, instead of power(a-b,2) may --be a lot faster... EU is optimized for them a=a-b a=a*a --note: using a=(a-b)*(a-b) calculates (a-b) TWICE... > b = a[1] > for index = 2 to length(a) do > b = b + a[index] > end for > return sqrt (b) > end function > Now, how does this benchmark ? try both ways.. eh??? --Hawke'