Математическая сфера

Пожалуйста, прости меня за отсутствие кода. У меня не работает интернет, поэтому я делаю это со своего телефона. Я пытаюсь написать библиотеку для манипулирования точками на сфере с радиусом 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>';

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]