Bonjour,
je cherche comment projeter une image(comme texture) sur les faces triangulaires de l'icosaèdre avec mapping toolbox du Matlab.
Merci
Bonjour,
je cherche comment projeter une image(comme texture) sur les faces triangulaires de l'icosaèdre avec mapping toolbox du Matlab.
Merci
Je ne connais pas bien la Mapping Toolbox
Je me suis donc amusé avec cette contribution : Texture Patch by Dirk-Jan Kroon
Voici un début de réponse :
Le fichier wiki.png (tiré de wikipedia) est attaché ci-dessous ainsi que le résultat de son plaquage sur l'icosaèdre.
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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110 phi = (1+sqrt(5))/2; VV = [ 0 -phi -1 0 -phi -1 0 -phi -1 0 -phi -1 0 -phi -1 1 0 -phi phi -1 0 0 -phi 1 -phi -1 0 -1 0 -phi 1 0 -phi phi 1 0 1 0 phi -1 0 phi -phi 1 0 0 phi -1 phi 1 0 0 phi 1 0 phi 1 0 phi 1 0 phi 1 0 phi 1 ]; FF = [ 12 13 18 17 22 16 12 6 7 17 16 11 12 7 13 7 6 1 7 2 8 7 8 13 13 8 14 8 3 9 8 14 9 13 14 19 21 15 16 20 14 15 14 9 15 16 11 10 15 9 10 9 4 10 10 5 11 15 10 16 ]; figure patch('vertices',VV,'faces',FF,'facecolor','r'); hold on text(VV(:,1),VV(:,2),VV(:,3), num2str((1:size(VV,1)).')) axis equal vis3d figure TV = [ 23 1 69 1 115 1 160 1 206 1 1 35 45 35 91 35 137 35 183 35 228 35 24 70 68 70 114 70 160 70 206 70 250 70 46 105 92 105 138 105 183 105 230 105 ]; TV(:,1) = TV(:,1)/253; TV(:,2) = TV(:,2)/108; TF = FF; texture = imread('wiki.png','png'); texture = permute(texture,[2 1 3]); options.EdgeColor = 'none'; options.PSize = 128; patcht(FF,VV,TF,TV,texture, options) hold on text(VV(:,1),VV(:,2),VV(:,3), num2str((1:size(VV,1)).')) grid on axis equal vis3d figure image(texture) axis image hold on plot( TV(:,2)*108,TV(:,1)*253,'r*'); text(TV(:,2)*108,TV(:,1)*253, num2str((1:size(TV,1)).'))
Bonjour,
Je vous remercie infiniment pour la réponse, vraiment c'est une réponse très pertinente.
Mais j'ai deux ambiguïtés : la première les vertex, j’ai vu dans le code qu’il y a 22 vertex, je ne sais pas pourquoi 22 vertex dans VV.
La deuxième des choses est le contenu de fichier FV :
ces chiffres se sont des coordonnées ou autre chose ?.
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 TV = [ 23 1 69 1 115 1 160 1 206 1 1 35 45 35 91 35 137 35 183 35 228 35 24 70 68 70 114 70 160 70 206 70 250 70 46 105 92 105 138 105 183 105 230 105 ];
Pourquoi vous avez utilisé 253 et 108 dans les deux tables
Cordialement
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 TV(:,1) = TV(:,1)/253; TV(:,2) = TV(:,2)/108;
Par ce qu'il ne faut pas prendre en considération les sommets de l'icosaèdre, mais ceux des triangles sur l'image du patron déplié.
Il y a 12 sommets sur l'icosaèdre, mais 22 sur le patron déplié (voir l'image attachée)
Ce sont les coordonnées (approximatives) en pixels des sommets des triangles sur l'image du patron déplié
Pour ramener les coordonnées des sommets dans l’intervalle [0 1] (l'image fait 253x108 pixels)
Ce n'est pas nécessaire selon l'aide de la fonction patcht, mais je trouve que le rendu final est meilleur.
Au passage, il aurait été sans doute plus juste de faire :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 TV(:,1) = (TV(:,1)-1)/252; TV(:,2) = (TV(:,2)-1)/107;
Voici une version simplifiée qui permet de sans doute mieux comprendre le principe :
On notera ici que comme la texture appliquée est plus simple, moins de sommets sont nécessaires pour définir l'icosaèdre
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 phi = (1+sqrt(5))/2; VV = [ 0 -phi -1 1 0 -phi phi -1 0 0 -phi 1 -phi -1 0 -1 0 -phi phi 1 0 1 0 phi -1 0 phi -phi 1 0 0 phi -1 0 phi 1 ]; FF = [ 7 8 12 7 12 11 7 2 3 7 11 2 7 3 8 3 2 1 3 1 4 3 4 8 8 4 9 4 1 5 4 9 5 8 9 12 12 10 11 12 9 10 9 5 10 11 2 6 10 5 6 5 1 6 6 1 2 10 6 11 ]; r = 5; th = linspace(0,2*pi,4); th(end) = []; x = r*cos(th(:)); y = r*sin(th(:)); c = [12 12 ; 38 12 ; 38 38]; TV = [ x+c(1,1) y+c(1,2) x+c(2,1) y+c(2,2) x+c(3,1) y+c(3,2)]; TF = [1 2 3 1 2 3 4 5 6 7 8 9 7 8 9 1 2 3 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 1 2 3 1 2 3 1 2 3 7 8 9 4 5 6 4 5 6 1 2 3 1 2 3 7 8 9]; texture = imread('d1395244-3.png'); texture = permute(texture,[2 1 3]); options.PSize = 64; figure patcht(FF,VV,TF,TV,texture, options) axis equal vis3d off
Le fichier d1395244-3.png et le résultat du placage de la texture sont attachés à ce message.
Voici un autre morceau de code qui illustre le "découpage" de la texture :
Ce qui donne la dernière image attachée.
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 texture = imread('d1395244-3.png'); r = 5; th = linspace(0,2*pi,4); th(end) = []; x = r*cos(th(:)); y = r*sin(th(:)); c = [12 12 ; 38 12 ; 38 38]; TV = [ x+c(1,1) y+c(1,2) x+c(2,1) y+c(2,2) x+c(3,1) y+c(3,2)]; TF = [ 1 2 3 4 5 6 7 8 9]; figure image(texture) axis image hold on patch('vertices',TV, 'faces', TF, 'facecolor','none') text(TV(:,1),TV(:,2),num2str((1:size(TV,1)).'),'fontsize',18,'color','b')
Les triangles sont juste présents pour visualiser les zones où la texture est prise en compte.
Pour finir un exemple encore plus simple avec une "vraie" texture.
Les fichiers de textures peuvent être téléchargés sur Museum Texture (ou autres)
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 %texturefile = 'texture-crepis-b.jpg'; texturefile = 'texture-herbe-a.jpg'; phi = (1+sqrt(5))/2; VV = [ 0 -phi -1 1 0 -phi phi -1 0 0 -phi 1 -phi -1 0 -1 0 -phi phi 1 0 1 0 phi -1 0 phi -phi 1 0 0 phi -1 0 phi 1 ]; FF = [ 7 8 12 7 12 11 7 2 3 7 11 2 7 3 8 3 2 1 3 1 4 3 4 8 8 4 9 4 1 5 4 9 5 8 9 12 12 10 11 12 9 10 9 5 10 11 2 6 10 5 6 5 1 6 6 1 2 10 6 11 ]; r = 150; th = linspace(0,2*pi,4); th(end) = []; x = r*cos(th(:)); y = r*sin(th(:)); c = [140 140]; TV = [x+c(1,1) y+c(1,2)]; TF = repmat([1 2 3],size(FF,1),1); texture = imread(texturefile,'jpg'); texture = permute(texture,[2 1 3]); options.PSize = 200; figure patcht(FF,VV,TF,TV,texture, options) axis equal vis3d off
Je vous remercie infiniment encore pour vos efforts.
La texture avec des images simples sa marche, mais avec la carte du monde (*.jpg) je trouve que l'habillage de l'icosaèdre ne se fait pas bien. Il y a un chevauchement entre les continents, ainsi il y a une genre de dilatation dans certaines parties.
avec des images simple(texture par exemple) on peut pas détecter le problème, par contre avec des cartes ou d'autres choses on peut le distinguer.
ci-joint l'image que je l'utilise dans mes travaux.
Merci
Noureddine
Il faut juste utiliser un découpage de la terre identique au patron de mon premier exemple.
Une simple recherche d'images avec "earth icosahedron" m'a par exemple amené à ce site : Planetary Icosahedrons
[Edit] Une version simplifiée du code suivant est disponible ici : http://www.developpez.net/forums/d14...t/#post7723660
Le code correspondant :
Voir le résultat sur l'image attachée
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 phi = (1+sqrt(5))/2; VV = [ 0 -phi -1 0 -phi -1 0 -phi -1 0 -phi -1 0 -phi -1 1 0 -phi phi -1 0 0 -phi 1 -phi -1 0 -1 0 -phi 1 0 -phi phi 1 0 1 0 phi -1 0 phi -phi 1 0 0 phi -1 phi 1 0 0 phi 1 0 phi 1 0 phi 1 0 phi 1 0 phi 1 ]; FF = [ 12 13 18 17 22 16 12 6 7 17 16 11 12 7 13 7 6 1 7 2 8 7 8 13 13 8 14 8 3 9 8 14 9 13 14 19 21 15 16 20 14 15 14 9 15 16 11 10 15 9 10 9 4 10 10 5 11 15 10 16 ]; texture = imread('icoearth.jpg','jpg'); texture = permute(texture,[2 1 3]); TV = [ 150 0 450 0 750 0 1050 0 1350 0 0 260 300 260 600 260 900 260 1200 260 1500 260 150 520 450 520 750 520 1050 520 1350 520 1650 520 300 780 600 780 900 780 1200 780 1500 780 ]; TV(:,1) = (TV(:,1)-1)/(size(texture,1)-1); TV(:,2) = (TV(:,2)-1)/(size(texture,2)-1); TF = FF; options.EdgeColor = 'none'; options.PSize = 200; figure patcht(FF,VV,TF,TV,texture, options) axis equal vis3d off
Sinon, juste par curiosité, quel est l'intérêt scientifique de projeter la terre sur un icosaèdre ?
Bonjour,
Je vous remercie à l’avance de l'attention.
Ma recherche consiste à habiller l’icosaèdre dans plusieurs niveaux de subdivision puis le dépliage de la structure obtenue.
Donc, je dois commencer par un icosaèdre puis faire la subdivision de ses faces triangulaires (niveau1, niveau 2, ....) donc à chaque fois j'ai un nombre de faces et dans chaque niveau je fais le dépliage de la structure. C’est pour cela je suis obliger de travailler avec un globe entier.
Je voudrais savoir si le travail avec le globe (sous forme rectangulaire) est possible et donne un résultat.
Cordialement
Noureddine
Bonjour Professeur,
Merci Monsieur de votre rapidité et de votre efficacité.
Je vous remercie pour vos efforts , merci de m’aider.
Cordialement
Noureddine
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager