1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| sub creerCercle {
# Renvoit une liste des points ("x,y") du cercle dont on fournit une coordonnée centrale et un rayon en metres
# $modulo, si >0 permet de simplifier la liste de retour en ne calculant qu'un point sur $modulo
my($centreX, $centreY, $rayon, $modulo) = @_;
my @pointsCercle;
$modulo = int($modulo);
$modulo = 1 if ($modulo == 0);
# Converti les coord en radians:
$centreX = deg2rad($centreX);
#print "X=$centreX rad\n";
$centreY = deg2rad($centreY);
my $rayonRad = $rayon/6378137; # TODO: deg2rad pas mieux ?
my ($pi) = pi;
#for($i=0; $i<=360; $i++) {
# $radial = deg2rad($i);
# $lat_rad = asin(sin($lat1)*cos($d_rad) + cos($lat1)*sin($d_rad)*cos($radial));
# $dlon_rad = atan2(sin($radial)*sin($d_rad)*cos($lat1), cos($d_rad)-sin($lat1)*sin($lat_rad));
# $lon_rad = fmod(($long1+$dlon_rad + M_PI), 2*M_PI) - M_PI;
# fwrite( $fileappend, rad2deg($lon_rad).",".rad2deg($lat_rad).",0 ");
# }
# Calcule les points du cercle:
for(my $i=0;$i<=360;$i++) {
next if ($i % $modulo != 0);
my $radial = deg2rad($i);
my $latRad = asin(sin($centreY)* cos($rayonRad) + cos($centreY)* sin($rayonRad)* cos($radial));
my $dLonRad = atan2(sin($radial)* sin($rayonRad)* cos($centreY), cos($rayonRad)-sin($centreY)* sin($latRad));
#my $lonRad = (($centreX + $dLonRad + $pi) % (2*$pi)) - $pi; # Utilise le reste de la division (Modulo)
my $lonRad = ($centreX + $dLonRad + pi) % (2*$pi) - pi; # Utilise le reste de la division (Modulo)
print ($centreX + $dLonRad + pi) % (2*$pi) - $pi;
my $lonDeg = rad2deg($lonRad);
print "Longitude = $lonRad rad = $lonDeg deg\n";
my $latDeg = rad2deg($latRad);
push @pointsCercle, "$lonDeg,$latDeg";
#print "$lonDeg,$latDeg\n";
} # Fin for
@_=@pointsCercle;
} # Fin de sub |
Partager