note 88119 added to function.atan2
| From: | fred dot beck at rrd dot com | Date: | Sun, 11 Jan 2009 20:39:02 +0000 |
| Subject: | note 88119 added to function.atan2 | ||
| Groups: | php.notes | ||
| Request: | Send a blank email to php-notes+get-149070@lists.php.net to get a copy of this message | ||
<?php
/**
* Given an origin point of (0,0) and a destination point $x,$y
* somewhere on an axis grid, compass() determines the compass
* heading(direction) of the destination point from the origin
*
* HOWEVER, atan2(y,x)'s natural compass thinks east is north,
*
* {135}-------{ 90}-------{45}
* | +-----[ +y]-----+ |
* | | | |
* | | | |
* {180} [-x] [0,0] [+x] {0} <--------- North ?
* | | | |
* | | | |
* | +-----[ -y]-----+ |
* {-135}-------{-90}-------{-45}
*
*
* SO, we simply transpose the (y,x) parameters to atan2(x,y)
* which will both rotate(left) and reflect(mirror) the compass.
*
* Which gives us this compass
*
* {-45}-------{ 0 }-------{45}
* | +-----[ +y]-----+ |
* | | | |
* | | | |
* {-90} [-x] [0,0] [+x] {90}
* | | | |
* | | | |
* | +-----[ -y]-----+ |
* {-135}-------{180}-------{135}
*
* FINALLY,` we check if param $x was indeed a negative number,
* if so we simply add 360 to the negative angle returned by atan2()
*
*/
function compass($x,$y)
{
if($x==0 AND $y==0){ return 0; } // ...or return 360
return ($x < 0)
? rad2deg(atan2($x,$y))+360 // TRANSPOSED !! y,x params
: rad2deg(atan2($x,$y));
}
function polar($x,$y)
{
$N = ($y>0)?'N':'';
$S = ($y<0)?'S':'';
$E = ($x>0)?'E':'';
$W = ($x<0)?'W':'';
return $N.$S.$E.$W;
}
function show_compass($x,$y)
{
return '<BR>'
.polar($x,$y)
.' compass( x='.$x.', y='.$y.' )= '
.number_format(compass($x,$y),3).'°';
}
echo show_compass(0,3);
echo show_compass(.06,3);
echo show_compass(3,3);
echo show_compass(3,.06);
echo show_compass(3,0);
echo show_compass(3,-.06);
echo show_compass(3,-3);
echo show_compass(.06,-3);
echo show_compass(0,-3);
echo show_compass(-.06,-3);
echo show_compass(-3,-3);
echo show_compass(-3,-.06);
echo show_compass(-3,0);
echo show_compass(-3,.06);
echo show_compass(-3,3);
echo show_compass(-.06,3);
/* RENDERS THIS
N compass( x=0, y=3 )= 0 °
NE compass( x=0.06, y=3 )= 1.14576283818 °
NE compass( x=3, y=3 )= 45 °
NE compass( x=3, y=0.06 )= 88.8542371618 °
E compass( x=3, y=0 )= 90 °
SE compass( x=3, y=-0.06 )= 91.1457628382 °
SE compass( x=3, y=-3 )= 135 °
SE compass( x=0.06, y=-3 )= 178.854237162 °
S compass( x=0, y=-3 )= 180 °
SW compass( x=-0.06, y=-3 )= 181.145762838 °
SW compass( x=-3, y=-3 )= 225 °
SW compass( x=-3, y=-0.06 )= 268.854237162 °
W compass( x=-3, y=0 )= 270 °
NW compass( x=-3, y=0.06 )= 271.145762838 °
NW compass( x=-3, y=3 )= 315 °
NW compass( x=-0.06, y=3 )= 358.854237162 °
*/
?>
----
Server IP: 69.147.83.197
Probable Submitter: 75.248.101.81
----
Manual Page -- http://www.php.net/manual/en/function.atan2.php
Edit -- https://master.php.net/note/edit/88119
Del: integrated -- https://master.php.net/note/delete/88119/integrated
Del: useless -- https://master.php.net/note/delete/88119/useless
Del: bad code -- https://master.php.net/note/delete/88119/bad+code
Del: spam -- https://master.php.net/note/delete/88119/spam
Del: non-english -- https://master.php.net/note/delete/88119/non-english
Del: in docs -- https://master.php.net/note/delete/88119/in+docs
Del: other reasons-- https://master.php.net/note/delete/88119
Reject -- https://master.php.net/note/reject/88119
Search -- https://master.php.net/manage/user-notes.php