Utilisation de ConvexPoly.osax
Vous pouvez ouvrir le dictionnaire de ConvexPoly.osax dans un éditeur de script. Ce dictionnaire présente l'ensemble des commandes disponibles et la définition des différents objets tels les plans (demi-espaces) et les polyèdres. Les polyèdres canoniques peuvent être obtenus en exécutant les lignes suivantes :
set poly to platonic polyhedron 2 -- 1 à 5. Les 5 solides platoniques.
set poly to archimedean polyhedron 2 -- 1 à 13. Les 13 solides archimédiens.
set poly to catalan polyhedron 2 -- 1 à 13. les solides catalans (dual des archimédiens).
Ces commandes renvoient des records AppleScript qui décrivent le polyèdre (voir ci-dessous).
Les solides platoniques sont classés ainsi :
1 Cube, 2 Octahedron, 3 Tetrahedron, 4 Icosahedron, 5 Dodecahedron.
Les solides archimédiens classés ainsi :
1 CubeOctahedron, 2 Great Rhombicosidodecahedron, 3 Great Rhombicuboctahedron, 4 Icosidodecahedron, 5 Small Rhombicosidodecahedron, 6 Small Rhombicuboctahedron, 7 Snub Cube, 8 Snub Dodecahedron, 9 Truncated Cube, 10 Truncated Dodecahedron, 11 Truncated Icosahedron, 12 Truncated Octahedron, 13 Truncated Tetrahedron.
Les solides catalans classés ainsi :
1 Rhombic Dodecahedron, 2 Disdyakis Triacontahedron, 3 Disdyakis Dodecahedron, 4 Rhombic Triacontahedron, 5 Deltoidal Hexecontahedron, 6 Deltoidal Icositetrahedron, 7 Pentagonal Icositetrahedron, 8 Pentagonal Hexecontahedron, 9 Triakis Octahedron, 10 Triakis Icosahedron, 11 Pentakis Dodecahedron, 12 Tetrakis Hexahedron, 13 Triakis Tetrahedron.
Les polyèdres platoniques et archimédiens sont inscrits dans la sphère de rayon scale centrée à l'origine. Les solides catalans sont tangents à cette même sphère. Le paramètre optionnel scale vaut 100 par défaut et peut être utilisé pour obtenir des coordonnées simplifiant l'affichage ou pour tout autre raison.
Par exemple :
set poly to platonic polyhedron 2 -- Octahedron
-- {plane list:{{normal:{-0.57735026919, -0.57735026919, -0.57735026919}, cst:57.735026918963}, {normal:{-0.57735026919, -0.57735026919, 0.57735026919}, cst:57.735026918963}, {normal:{-0.57735026919, 0.57735026919, -0.57735026919}, cst:57.735026918963}, {normal:{-0.57735026919, 0.57735026919, 0.57735026919}, cst:57.735026918963}, {normal:{0.57735026919, -0.57735026919, -0.57735026919}, cst:57.735026918963}, {normal:{0.57735026919, -0.57735026919, 0.57735026919}, cst:57.735026918963}, {normal:{0.57735026919, 0.57735026919, -0.57735026919}, cst:57.735026918963}, {normal:{0.57735026919, 0.57735026919, 0.57735026919}, cst:57.735026918963}}, vertex list:{{0.0, 0.0, 100.0}, {100.0, 0.0, 0.0}, {0.0, 100.0, 0.0}, {0.0, 0.0, -100.0}, {0.0, -100.0, 0.0}, {-100.0, 0.0, 0.0}}, facet list:{{5, 4, 6}, {1, 5, 6}, {4, 3, 6}, {3, 1, 6}, {2, 4, 5}, {1, 2, 5}, {2, 3, 4}, {2, 1, 3}}, name:"Octahedron"}
L'objet polyhedron contient une liste de plans, une liste de vertices et une liste de facettes. Un plan contient un vecteur normal et une constante cst. Cela définit l'ensemble des points pt tels que normal.pt = cst et par extension le demi espace défini par normal.pt ≤ cst. Par exemple :
set poly to platonic polyhedron 2 scale 1
set p to item 1 of plane list of poly
-- {normal:{-0.57735026919, -0.57735026919, -0.57735026919}, cst:0.57735026919}
normal of p
-- {-0.57735026919, -0.57735026919, -0.57735026919}
cst of p
-- 0.57735026919
Les vertices peuvent être obtenus ainsi :
set poly to platonic polyhedron 2
item 1 of vertex list of poly
-- {0.0, 0.0, 100.0}
Les facettes peuvent être obtenus ainsi:
set poly to platonic polyhedron 2
item 1 of facet list of poly
-- {5, 4, 6}
Cette facette est le triangle joignant les éléments 5, 4 et 6 de vertex list of poly. Les facettes sont rangées dans le même ordre que les plans, ce qui veut dire que item 5 of facet list of poly est la facette contenues dans le plan item 5 of plane list of poly.
Vous pouvez construire votre propre polyèdre en fournissant une liste de vertices ou une liste de plans.
Par exemple, vous pouvez fournir une liste de vertices pour obtenir l'enveloppe convexe de ces vertices :
set vlist to {{0, 0, 0}, {1, 0, 0}, {0, 1, 0}, {0, 0, 1}} -- un simplex
set poly to convex polyhedron with vertex list vlist
-- {plane list:{{normal:{0.57735026919, 0.57735026919, 0.57735026919}, cst:0.57735026919}, {normal:{-1.0, 0.0, 0.0}, cst:0.0}, {normal:{0.0, -1.0, 0.0}, cst:0.0}, {normal:{0.0, 0.0, -1.0}, cst:0.0}}, vertex list:{{0.0, 0.0, 0.0}, {1.0, 0.0, 0.0}, {0.0, 1.0, 0.0}, {0.0, 0.0, 1.0}}, facet list:{{3, 2, 4}, {1, 3, 4}, {2, 1, 4}, {1, 2, 3}}}
Ou bien vous pouvez fournir une liste de plans (demi-espaces) pour obtenir l'intersection (si elle existe) de ces demi-espaces) :
set plist to {{normal:{0.0, 0.0, -1.0}, cst:0.0}, {normal:{0.0, -1.0, 0.0}, cst:0.0}, {normal:{-1.0, 0.0, 0.0}, cst:0.0}, {normal:{0.57735026919, 0.57735026919, 0.57735026919}, cst:0.57735026919}}
set poly to convex polyhedron with plane list plist
-- {plane list:{{normal:{0.0, 0.0, -1.0}, cst:0.0}, {normal:{0.0, -1.0, 0.0}, cst:0.0}, {normal:{-1.0, 0.0, 0.0}, cst:0.0}, {normal:{0.57735026919, 0.57735026919, 0.57735026919}, cst:0.57735026919}}, vertex list:{{0.0, 0.0, 1.0}, {0.0, 1.0, 0.0}, {1.0, 0.0, 0.0}, {0.0, 0.0, 0.0}}, facet list:{{3, 2, 4}, {1, 3, 4}, {2, 1, 4}, {1, 2, 3}}}
Notez que vertex list of poly et plane list of poly peuvent être des listes vides si les données fournies sont inconsistantes.
Les polyèdres peuvent subir des rotations, des translations et des agrandissements d'échelles. Par exemple :
set poly to platonic polyhedron 1
set poly to rotate polyhedron poly axis {0, 0, 1} angle pi / 2
set poly to translate polyhedron poly vector {0, 0, 100}
set poly to scale polyhedron poly scale 1/100
L'intersection de polyèdres convexes est un polyèdre convexe. Il peut être obtenu comme suit :
set poly1 to platonic polyhedron 1
set poly2 to platonic polyhedron 2
set poly3 to platonic polyhedron 3
set poly123 to intersect polyhedra {poly1,poly2,poly3}
Vous pouvez obtenir la projection 2D d'un polyèdre en utilisant la commande project2D. Le paramètre directe de project2D est un polyèdre ou une liste de vertices. Les paramètres requis sont eye position, par exemple {0,1,0,0,0,1} :
set poly to platonic polyhedron 1 scale 100
set poly2D to project2D poly eye position {3, 2, 1, 0, 0, 1}
-- {facet list:{{1, 2, 3, 4}, {5, 6, 2, 1}, {1, 4, 7, 5}}, edge list:{{1, 2}, {2, 3}, {3, 4}, {4, 1}, {5, 6}, {6, 2}, {1, 5}, {4, 7}, {7, 5}}, vertex list:{{16.012815380509, 34.236839400873}, {80.064076902544, 59.914468951528}, {-16.012815380509, 77.032888651964}, {-80.064076902544, 51.35525910131}, {16.012815380509, -77.032888651964}, {80.064076902544, -51.35525910131}, {-80.064076902544, -59.914468951528}}}
vertex list of poly2D sont des vecteurs 2D et facet list contient la liste des facettes visibles. Vous pouvez appeler project2D avec deux paramètres booléens optionnels plane list et hidden.Avec le paramètre plane list, poly2D renverra la liste des plans visibles; Avec le paramètre hidden, poly2D renverra également la liste hidden facet list des facettes invisibles et (si les deux paramètres plane listet hidden activés) la liste hidden plane list des plans cachés.
Visualisation des polyèdres convexes
Smile est un éditeur de scripts contenant des extensions dont un moteur graphique vous permettant facilement de créer des fenêtres graphiques et d'afficher des données géométriques au format PDF. Le script suivant permet d'afficher un polyèdre platonique.
set poly to platonic polyhedron 4 scale 150 --icosahedron
set poly2D to project2D poly eye position {2, 2, 1, 0, 0, 1}
set w to BeginFigure(0)
SetTransformation({1, 0, 0, 1, 200, 200}) --centre l'affichage dans la fenêtre
repeat with f in facet list of poly2D
set l to {}
repeat with i in f
set end of l to item i of vertex list of poly2D
end repeat
MoveTo(item 1 of l)
LineTo(l)
ClosePath()
end repeat
SetFillColor({0.7, 0.7, 0.7})
DrawPath(3)
EndFigure()
set name of w to name of poly
Des fichiers d'exemples sont fournis avec ConvexPoly.osax.
Le dossier Samples contient un dialogue Display polyhedron permettant de gérer l'affichage des polyèdres convexes.
Utilisation des références
Dans la section précédente, vous obteniez un polyèdre sous la forme d'un record AppleScript de classe polyhedron. Si vous devez effectuer plusieurs calculs sur un même polyèdre, ce record est envoyé à chaque fois à ConvexPoly.osax qui recalcule alors le polyèdre. Vous pouvez éviter cela en spécifiant as polyhedron reference lorsque vous utilisez des commandes qui renvoient un polyèdre.
set poly to platonic polyhedron 1 as polyhedron reference
Dans ce cas, la représentation interne depoly est gardée en mémoire et les futurs appels utilisant poly ne nécessiteront pas de recalculer le polyèdre. Cela peut considérablement accélérer l'exécution de vos scripts. Vous pouvez obtenir la représentation en record AppleScript de votre polyèdre de la manière suivante :
set polyrecord to poly as polyhedron
Si vous ne souhaitez plus utiliser la variable poly vous devriez libérer la mémoire correspondante en exécutant la commande suivante :
delete polyhedron poly
|