+ private function chk_distance($distance, $min, $max) {
+ if ($distance >= $min && $distance <= $max) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ private function randomizeLocation($localisation, $distance, $min, $max) {
+ // Generate random float in [0, 1[, [0, 1)
+ $u = rand(0, getrandmax() - 1) / getrandmax();
+ $v = rand(0, getrandmax() - 1) / getrandmax();
+
+ if ($this->chk_distance($distance, $min, $max)) {
+ $r = $distance / 111300;
+ } else {
+ return $this->PersonLocalisationFuzzyWrongDistance();
+ }
+
+ $w = $r * sqrt($u);
+ $t = 2 * pi() * $v;
+
+ $x = $w * cos($t);
+ $lng_off = $x / cos(deg2rad($localisation->getLatitude()));
+ $lat_off = $w * sin($t);
+
+ $fuzzy_localisation = new Localisation();
+ $fuzzy_localisation->setTimestamp($localisation->getTimestamp());
+ $fuzzy_localisation->setLatitude($localisation->getLatitude() + $lat_off);
+ $fuzzy_localisation->setLongitude($localisation->getLongitude() + $lng_off);
+ return $fuzzy_localisation;
+ }
+
+ /**
+ * @Rest\Get(
+ * path = "/api/person/{id}/localisation/fuzzy/{distance}",
+ * name = "person_localisation_fuzzy",
+ * requirements = {"id"="\d+", "distance"="\d+"}
+ * )
+ * @Rest\View()
+ */
+ public function getLocalisationFuzzyAction(Request $request)
+ {
+ //TODO: Check that the authenticated user is allowed to see the localisation
+ $em = $this->getDoctrine()->getManager();
+
+ $localisation = $this->getLastLocalisation($em, $request->get('id'));
+
+ if (empty($localisation)) {
+ return $this->PersonLocalisationNotFound();
+ }
+
+ return $this->randomizeLocation($localisation, $request->get('distance'), 200, 500);
+ }
+