map & AoA

Le
kurtz le pirate
bonjour,

Alors la, je n'ai rien trouvé sur le web :( J'ai un tableau de tableau
qui a cette forme :

Begin Dump
$VAR1 = [
'0.0000',
'0.0000'
];
$VAR2 = [
'27.0000',
'28.0000'
];
$VAR3 = [
[
'72.0000',
'79.0000'
],
[
'46.0000',
'49.0000'
],
[
'26.9995',
'79.0000'
]
];
$VAR4 = [
[
'95.0000',
'42.0000'
],
[
'116.0000',
'79.0000'
],
[
'116.0000',
'42.0000'
]
];
$VAR5 = [
'57.0000',
'42.0000'
];
$VAR6 = [
[
'57.0000',
'0.0000'
],
[
'44.0000',
'36.0000'
],
[
'44.0000',
'13.0000'
]
];
$VAR7 = [
[
'95.0000',
'13.0000'
],
[
'68.0750',
'-11.0749'
],
[
'92.8691',
'-2.9822'
]
];
$VAR8 = [
[
'105.0000',
'-26.0000'
],
[
'97.0000',
'28.0000'
],
[
'136.9069',
'-10.8063'
]
];
$VAR9 = [
[
'-10.0000',
'49.0000'
],
[
'63.0000',
'-46.0000'
],
[
'-10.0000',
'28.0000'
]
];
End Dump

Chaque 'premier couple' représente un vecteur <x,y>.
J'ai une routine qui trouve le plus petit x et le plus petit y.
(XMin = -10.0000 et YMin = -26.0000 ici).

Et donc, je veux ajouter <XMIn, YMin> à tout les 'couples'.
Le "map{}" me paraît impossible à utiliser.

A part des boucles pour chaque tableau, voyez-vous un moyen de faire ça
facilement ?


Merci.
--
klp
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Paul Gaborit
Le #24930552
À (at) Sat, 03 Nov 2012 16:40:10 +0100,
kurtz le pirate
Chaque 'premier couple' représente un vecteur <x,y>.
J'ai une routine qui trouve le plus petit x et le plus petit y.
(XMin = -10.0000 et YMin = -26.0000 ici).

Et donc, je veux ajouter <XMIn, YMin> à tout les 'couples'.
Le "map{}" me paraît impossible à utiliser.

A part des boucles pour chaque tableau, voyez-vous un moyen de faire ça
facilement ?




Avec des map:

@arr = map {[map {[$_->[0] + $XMin,$_->[1]+$YMin]} @$_]} @array;

C'est concis mais pas très lisible...

--
Paul Gaborit - Perl en français -
kurtz le pirate
Le #24931502
In article Paul Gaborit
À (at) Sat, 03 Nov 2012 16:40:10 +0100,
kurtz le pirate
> Chaque 'premier couple' représente un vecteur <x,y>.
> J'ai une routine qui trouve le plus petit x et le plus petit y.
> (XMin = -10.0000 et YMin = -26.0000 ici).
>
> Et donc, je veux ajouter <XMIn, YMin> à tout les 'couples'.
> Le "map{}" me paraît impossible à utiliser.
>
> A part des boucles pour chaque tableau, voyez-vous un moyen de faire ça
> facilement ?
>

Avec des map:

@arr = map {[map {[$_->[0] + $XMin,$_->[1]+$YMin]} @$_]} @array;

C'est concis mais pas très lisible...




Waoooo... Pas très lisible au premier abord en effet.
Je vais essayer ça tout de suite.


Merci


--
klp
kurtz le pirate
Le #24931602
In article Paul Gaborit
Avec des map:

@arr = map {[map {[$_->[0] + $XMin,$_->[1]+$YMin]} @$_]} @array;

C'est concis mais pas très lisible...




c'était trop beau :(

Can't use string ("0.0000") as an ARRAY ref while "strict refs" in use
at /Users/me/perl/NewEps2Pov/newEps2Pov.pl line 105.



--
klp
Paul Gaborit
Le #24932162
À (at) Sun, 04 Nov 2012 09:58:28 +0100,
kurtz le pirate
In article Paul Gaborit
Avec des map:

@arr = map {[map {[$_->[0] + $XMin,$_->[1]+$YMin]} @$_]} @array;

C'est concis mais pas très lisible...




c'était trop beau :(

Can't use string ("0.0000") as an ARRAY ref while "strict refs" in use
at /Users/me/perl/NewEps2Pov/newEps2Pov.pl line 105.



Et pourtant, sur l'exemple suivant, ça marche parfaitement. Peut-être
n'avez-vous pas bien décrit votre structure de données...

#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;

my @array = (
[ [23,45], [0,0], [12,10]],
[[-23,45], [0,10], [12,-10]],
[ [1,-45], [2,2], [4,3]],
);
print Dumper(@array);

my $XMin0;
my $YMin0;
my @arr = map {[map {[$_->[0] + $XMin,$_->[1]+$YMin]} @$_]} @array;
print Dumper(@arr);


--
Paul Gaborit - Perl en français -
Nicolas George
Le #24932152
Paul Gaborit , dans le message a écrit :
Et pourtant, sur l'exemple suivant, ça marche parfaitement. Peut-être
n'avez-vous pas bien décrit votre structure de données...



Si tu relis son message, tu peux voir que tous ses tableaux ne sont pas
emboîtés à la même profondeur. Je soupçonne un mauvais design à la base,
mais il peut y avoir une raison légitime.
Paul Gaborit
Le #24932632
À (at) 04 Nov 2012 12:12:48 GMT,
Nicolas George
Paul Gaborit , dans le message a écrit :
Et pourtant, sur l'exemple suivant, ça marche parfaitement. Peut-être
n'avez-vous pas bien décrit votre structure de données...



Si tu relis son message, tu peux voir que tous ses tableaux ne sont pas
emboîtés à la même profondeur. Je soupçonne un mauvais design à la base,
mais il peut y avoir une raison légitime.



Ah oui. Exact. Je n'avais pas remarqué que les deux premiers éléments
étaietn de simples tableaux alors que les suivants étaient des tableaux
de tableaux. Cette structure de données n'est donc pas régulière.

Avant de fournir une solution, j'aimerais être sûr que ce n'est
effectivement pas une erreur de design.

Attendons une réponse...

--
Paul Gaborit - Perl en français -
kurtz le pirate
Le #24946212
In article Paul Gaborit
À (at) 04 Nov 2012 12:12:48 GMT,
Nicolas George
> Paul Gaborit , dans le message > a écrit :
>> Et pourtant, sur l'exemple suivant, ça marche parfaitement. Peut-être
>> n'avez-vous pas bien décrit votre structure de données...
>
> Si tu relis son message, tu peux voir que tous ses tableaux ne sont pas
> emboîtés à la même profondeur. Je soupçonne un mauvais design à la base,
> mais il peut y avoir une raison légitime.

Ah oui. Exact. Je n'avais pas remarqué que les deux premiers éléments
étaietn de simples tableaux alors que les suivants étaient des tableaux
de tableaux. Cette structure de données n'est donc pas régulière.

Avant de fournir une solution, j'aimerais être sûr que ce n'est
effectivement pas une erreur de design.

Attendons une réponse...




Bonjour,

Non, se n'est pas une erreur de design. C'est les données qui sont comme
ça. Le script perl analyse un fichier postscript et en extrait les
points qui définissent un chemin. par exemple :

1845.0708 1924.1575 m
1921.6063 2003.5276 L
1975.4645 2063.0551 1921.6049 2148.0945 2049.1653 2148.0945 C
2173.8897 2148.0945 2173.8897 2043.2126 2114.3622 2043.2126 C
2006.6456 2043.2126 L
1969.7952 2026.2047 1969.7952 1961.0079 2006.6457 1924.1575 C
2038.0392 1892.764 2108.3217 1915.7041 2114.3622 1961.0079 C
2120.0315 2003.5276 2233.1533 1893.5255 2142.7086 1850.4567 C
2023.6535 1793.7638 1816.7244 2003.5276 1816.7244 2063.0551 C

On a chaque fois un couple de valeurs <x,y>. Pour certaines instructions
comme 'm' (moveTo) et 'L' (lineTo), un seul couple <x,y>.
Pour d'autres instructions comme 'C' (curveTo) en plus du point <x,y>,
il y a les coordonnées des 'banlanciers' (cf. courbe de bezier) : 3
points.

Et donc un tableau de tableaux 'variables'.

C'est un peu complexe en effet. Le map{} est trop compliqué ou pas
applicable (enfin pour moi). Je me suis débrouillé autrement en
analysant deux fois les lignes.

La première boucle recherche juste les minimums.
La deuxième boucle transforme les points (ajout des minimuns) et les
enregistre dans le tableau final.

Pour le fun, je veux bien voir l'utilisation de map{} sur une telle
structure.

En tout cas, merci de votre aide


--
klp
Publicité
Poster une réponse
Anonyme