Пожалуйста, прости меня за отсутствие кода. У меня не работает интернет, поэтому я делаю это со своего телефона. Я пытаюсь написать библиотеку для манипулирования точками на сфере с радиусом 1.
Я дал ему 8 баллов широта, долгота (код в рад)
+-45deg, + — 45 градусов
+-45deg, + — 135deg
И попросил декартовых координат и получил + -0,5, + — 0,5, + — sqrt (2)
Я ожидал, что все значения будут sqrt (2). Мой вход или выход неправильный?
редактировать:
наконец-то есть интернет-соединение, вот мой код. Функция перемещения работает, если направление равно 0 (прямо на север), но для любого другого направления оно, кажется, меняет числа больше, чем я ожидал.
class PARTICLE {
private $lat; //north and south - in radians
private $lon; //east and west - in radians
public function __construct($lat=0,$lon=0) {
$this->lat=$lat;
$this->lon=$lon;
}
/* **********************************************************************************************************
* Get Functions *
********************************************************************************************************** */
public function getLat() {
return $this->lat;
}
public function getLon() {
return $this->lon;
}
public function getXYZ() {
return array (
'x' => cos($this->lat) * cos($this->lon),
'y' => cos($this->lat) * sin($this->lon),
'z' => sin($this->lat)
);
}
/* **********************************************************************************************************
* Manipulate Functions *
********************************************************************************************************** */
public function setLat($lat) {
$this->lat=$lat;
}
public function setLon($lon) {
$this->lon=$lon;
}
public function move($bearing,$distance) {
//http://www.movable-type.co.uk/scripts/latlong.html
$lat = asin(sin($this->lat)*cos($distance)+cos($this->lat)*sin($distance)*cos($bearing));
$lon =$this->lon+atan2(sin($bearing)*sin($bearing)*cos($this->lat),cos($distance)-sin($this->lat)*sin($lat));
$this->lat=$lat;
$this->lon=fmod($lon+pi(),2*pi())-pi();
}
/* **********************************************************************************************************
* Static Functions *
********************************************************************************************************** */
public static function getDistance($point1,$point2) { //haversine formula for great circuler arc distance
$lat1=$point1->getLat();
$lat2=$point2->getLat();
$halfDeltaLat = ($lat2-$lat1)/2;
$halfDeltaLon=($point2->getLon()-$point1->getLon())/2;
$a=sin($halfDeltaLat)*sin($halfDeltaLat)+cos($lat1)*cos($lat2)*sin($halfDeltaLon)*sin($halfDeltaLon);
return 2*atan2(sqrt($a),sqrt(1-$a));
}
public static function getInitialBearing($start,$end) {
$y=sin($end->getLon()-$start->getLon()) * cos($end->getLat());
$x=cos($start->getLat())*sin($end->getLat())-sin($start->getLat())*cos($end->getLat())*cos($end->getLon()-$start->getLon());
return atan2($y, $x);
}
public static function getFinalBearing($start,$end) {
//get bearing from end to start
$theta=self::getInitialBearing($end,$start);
//reverse bearing direction
return ($theta+pi())%(2*pi());
}
public static function flip($point) {
$lat=0-$point->getLat();
$lon=$point->getLon()+pi();
return new self($lat,$lon);
}
public static function getRandom() {
$lat=rand(0-pi()*1000000,pi()*1000000)/1000000;
$lon=rand(0-pi()*1000000,pi()*1000000)/1000000;
return new self($lat,$lon);
}
}
тестовый код:
$point=new PARTICLE(0.5,0.5);
echo $point->getLat().' , '.$point->getLon().'<br>';
$point->move(pi()/2,0.1); //move off at 45 deg for 0.1rad
echo $point->getLat().' , '.$point->getLon().'<br>';
Задача ещё не решена.
Других решений пока нет …