How to get the direction (in degrees) between two points?
Author 
Message 
s_climax

Posted: Tue May 04, 2004 5:32 pm Post subject: How to get the direction (in degrees) between two points? 


ssia






Sponsor Sponsor



Mazer

Posted: Tue May 04, 2004 6:09 pm Post subject: Re: How to get the direction (in degrees) between two points 


s_climax wrote: ssia
What the hell?
Anyways...
you can use arctand to give you an angle in degrees by supplying it with a slope. Of course that's not enough (most likely); that will just give you something between 90 and 90. You'll need to figure out the actual angle by checking which quadrant the second point is in with relation to the first point.






s_climax

Posted: Tue May 04, 2004 6:18 pm Post subject: (No subject) 


ssia stand for "subject says it all"
Isn't there just some code I can use with sin/cos?






Mazer

Posted: Tue May 04, 2004 6:30 pm Post subject: (No subject) 


Why would you want that?
You wanted a way to get an angle between two points. Given that you have points A (x1, y1) and B (x2, y2) you can get the angle from A to B using arctand (a.k.a. "tan inverse").
code: 
angle := arctand ((y2  y1) / (x2  x1))

Angle, in this case should be a float. This is also assuming that B is above and to the right of A on a cartesian plane. If it's to the left you'll get a negative angle. And of course make sure to check if the x values are equal so you don't get a division by zero error.






Cervantes

Posted: Tue May 04, 2004 7:29 pm Post subject: (No subject) 


code: 
function find_angle (x1, y1, x2, y2 : real) : real
if x2 = x1 then
if y2 >= y1 then
result 90
elsif y2 < y1 then
result 270
end if
else
if x2 > x1 and y2 >= y1 then %QUAD 1
result (arctand ((y2  y1) / (x2  x1)))
elsif x2 > x1 and y2 < y1 then %QUAD 2
result 360 + (arctand ((y2  y1) / (x2  x1)))
elsif x2 < x1 and y2 < y1 then %QUAD 3
result 180 + (arctand ((y2  y1) / (x2  x1)))
elsif x2 < x1 and y2 >= y1 then %QUAD 4
result 180 + (arctand ((y2  y1) / (x2  x1)))
end if
end if
end find_angle
Mouse.ButtonChoose ("multibutton")
var x1, y1, x2, y2 : real
var mx, my, btn : int
var firsthit := false
loop
cls
mousewhere (mx, my, btn)
if btn = 1 and firsthit = false then
firsthit := true
x1 := mx
y1 := my
end if
if btn = 100 then
firsthit := false
end if
if firsthit = true then
x2 := mx
y2 := my
drawline (round (x1), round (y1), round (x2), round (y2), black)
locate (1, 1)
put find_angle (x1, y1, x2, y2)
end if
View.Update
delay (10)
end loop

that's how.






s_climax

Posted: Tue May 04, 2004 8:24 pm Post subject: (No subject) 


If the line is horizontal and going to the right, shouldn't the angle be 360 or 0 not 270?






Cervantes

Posted: Thu May 06, 2004 4:48 pm Post subject: (No subject) 


no it shouldn't be.
and in this program and in normal cardinal directions, a horizontal line going to the right isn't 270, its 90.






Tony

Posted: Thu May 06, 2004 4:53 pm Post subject: (No subject) 


umm... no...
horizontal line that is directly to the right is 0
up is 90
left is 180
down is 270
do you know why? because cos(0) = 1

Tony's programming blog. DWITE  a programming contest. 




s_climax

Posted: Thu May 06, 2004 5:16 pm Post subject: (No subject) 


Thanks for clarifying that tony. I was right.






Cervantes

Posted: Thu May 06, 2004 5:19 pm Post subject: (No subject) 


Cervantes wrote: cardinal directions
anywho, a line going to the right still wasn't 270.






s_climax

Posted: Fri May 14, 2004 8:34 pm Post subject: (No subject) 


Will this work instead?
code: 
xDistance := personX  chaserX
yDistance := personY  chaserY
angle := tan (yDistance / xDistance)







Tony

Posted: Fri May 14, 2004 9:45 pm Post subject: (No subject) 


no, lol... first of all if xDistance = 0 you get runtime error (div 0) and even if you don't, it's arctan, not tan... that returns the ratio based on the angle (in radians)

Tony's programming blog. DWITE  a programming contest. 




guruguru

Posted: Fri May 14, 2004 11:14 pm Post subject: (No subject) 


My example was simply that, and example. Clearly there are errors that can occur (dividing by zero), but they can be tested for and then dealt with.
Sorry, I thought that Turing did it in degrees... my bad. Anyways, to convert to degrees, simple multiply the answer by 180/Pi.
As well, I realize that it works for only one quadrant. Again, this was an EXAMPLE, so you can easily modify it!!!







