IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Modules Perl Discussion :

Dessin avec Imager.. erreur dans mon script


Sujet :

Modules Perl

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    août 2005
    Messages
    346
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : août 2005
    Messages : 346
    Points : 119
    Points
    119
    Par défaut Dessin avec Imager.. erreur dans mon script
    Bonjour!

    Je débute avec Imager, pour générer de simples images avec le tracé d'emprises (des rectangle, lignes, polygones).
    Mais j'obtiens une image en 'mirroir'... par rapport aux vraies coordonnées. Il faudrait inverser l'axe des Y je dirai... je suppose que c'est mon code qui est erroné, mais je ne vois pas où.


    Le voici:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    my($fichier,@emprises)=@_; # @emprises au format XYZ en sec d'arc décimales
    # Premiere chose à faire: definir l'emprise globale de 0 à x.
    # Donc trouver XMIN et YMIN et XMAX et YMAX
    my ($xmin,$xmax,$ymin,$ymax)=(-1,-1,-1,-1);
    	foreach my $ligne (@emprises) {
    		if ($ligne =~ m/(-?\d+)(\.\d+)?\s(-?\d+)(\.\d+)?.*/) {
    		my $x = "$1$2";
    		my $y = "$3$4";
    		$xmin=$x if (($xmin == -1) || ($xmin > $x));
    		$ymin=$y if (($ymin == -1) || ($ymin > $y));
    		$xmax=$x if (($xmax == -1) || ($xmax < $x));
    		$ymax=$y if (($ymax == -1) || ($ymax < $y));
    		} # Fin if
    	} # Fin foreach
     
     
    #On fait une premiere mise en forme d'emprises pour tout passer en positif
    #	if (($xmin < 0) || ($ymin < 0)) {
    	my $difference_x = 0-$xmin;
    	my $difference_y = 0-$ymin;
    	print "Diff X: $difference_x\nY: $difference_y\n";
    		foreach my $ligne (@emprises) {
    			if ($ligne =~ m/(-?\d+)(\.\d+)?\s(-?\d+)(\.\d+)?.*/) {
    			my $x = "$1$2";
    			my $y = "$3$4";
    			$x += $difference_x;
    			$y += $difference_y;
    			$ligne = "$x $y\n";
    			print $ligne;
    			} # Fin if
    		} # Fin de foreach
    	$xmin = 0;
    	$ymin = 0;
    	$xmax += $difference_x;
    	$ymax += $difference_y;
    #	} # Fin if
     
    # On ramene maintenant l'ensemble à 800*600 pixels (1 seconde=1pixel actuellement)
     
    print "Resolution : $res_x * $res_y\n";
    my $coef_homothetie_x = $xmax / $res_x;
    my $coef_homothetie_y = $ymax / $res_y;
    	if (($coef_homothetie_x > 1) || ($coef_homothetie_y > 1)) { # Il faut reduire par le coef le plus grand
    	my $coef;
    	$coef = $coef_homothetie_x if ($coef_homothetie_x > $coef_homothetie_y);
    	$coef = $coef_homothetie_y if ($coef_homothetie_x <= $coef_homothetie_y);
     
    	#On modifie les x/y des emprises par le coef
    	print "Reduction coef $coef...\n";
    	$xmax = 0;
    	$ymax=0;
    		foreach my $ligne (@emprises) {
    			if ($ligne =~ m/(-?\d+)(\.\d+)?\s(-?\d+)(\.\d+)?.*/) {
    			my $x = "$1$2";
    			my $y = "$3$4";
    			$x = ($x / $coef) if ($x >0);
    			$y = ($y / $coef) if ($y >0);
    			$xmin=$x if (($xmin == -1) || ($xmin > $x));
    			$ymin=$y if (($ymin == -1) || ($ymin > $y));
    			$xmax=$x if (($xmax == -1) || ($xmax < $x));
    			$ymax=$y if (($ymax == -1) || ($ymax < $y));
     
    			$ligne = "$x $y\n";
    			print $ligne;
    			} # Fin if
    		} # Fin de foreach
    	} # FIn if
     
    print "X Varie de $xmin à $xmax\nY de $ymin à $ymax\n";
    	if ($xmax * $ymax < 100) { # Si moins de 100 pixels², probleme!
    	&afficher_erreur("\aERREUR pendant la creation du graphique. Taille image incohérente.");
    	exit 1;
    	} # Fin if
     
    # On peut créer l'image...
    my $image = Imager->new(xsize =>$xmax, ysize => $ymax);
     
    # On crée maintenant les emprises en polygones des cartes
    my @polygone;
    my $fill = Imager::Fill->new(hatch=>'dots4', fg=>'red', bg=>'white');
     
    	foreach my $ligne (@emprises) { # Tant qu'on a des lignes.. on les lit!
    		if ($ligne =~ m/(-?\d+)(\.\d+)?\s(-?\d+)(\.\d+)?.*/) {
    		my $x = "$1$2";
    		my $y = "$3$4";
    		push @polygone, [$x,$y];
    		} # Fin if
    		elsif ($ligne eq "\n") { # Fin du polygnone
    		$image->polyline(points => \@polygone, color => 'red', fill => $fill );
    		@polygone=();
    		} # Fin elsif
    	} # Fin de foreach
     
     $image->write(file=>'tutorial1.bmp')
          or die 'Cannot save tutorial1.bmp: ', $image->errstr;
    Voici ce que ca donne:
    Nom : erreur_mirroir.gif
Affichages : 34
Taille : 15,5 Ko
    Au dessus, les emprises correctement positionnées, en dessous, l'image générée... en mirroir.

    Quelqu'un voit-il une erreur qqpart?

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    juin 2006
    Messages
    427
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juin 2006
    Messages : 427
    Points : 459
    Points
    459
    Par défaut
    et bien tu connais la solution: inverse l'axe des y

    Dans al plupart des librairies graphiques (0,0) est en haut à gauche.
    Je suppose que c'est le cas pour Imager, et que toi tu a considéré dans ton algo qu'il etait en bas à gauche
    Recherche staigiaire(s) motivé(s) sur projet perl/reseau a grande echelle. Me contacter par mp.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    août 2005
    Messages
    346
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : août 2005
    Messages : 346
    Points : 119
    Points
    119
    Par défaut ... :) perspicace :)
    Oui en effet, disons que je n'imaginais pas qu'Imager prenne son origine en haut à gauche auquel cas ca me rassure. Car si c'est une erreur dans mon script, j'aimerai éviter d'avoir recours à ce genre de correction d'erreur car à la fin on ne s'en sort plus (plusieurs scripts vont se servir/modifier l'image).

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Erreur dans mon script
    Par Akim13 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 08/06/2008, 18h15
  2. [GD] Redimension d'image - plusieurs erreurs dans mon script
    Par Henry9 dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 18/02/2007, 10h58
  3. Erreur dans mon script
    Par dcollart dans le forum Linux
    Réponses: 3
    Dernier message: 21/09/2006, 15h02
  4. erreur dans mon script
    Par Swata dans le forum Langage
    Réponses: 4
    Dernier message: 21/09/2005, 00h02
  5. [langage]erreur dans mon script
    Par Fabouney dans le forum Langage
    Réponses: 11
    Dernier message: 30/06/2005, 14h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo