Ci-dessous un fichier pour dessiner deux octaèdres partageant une arête commune :

verbatimtex
%&latex
\documentclass{article}
  \usepackage{mathpple}
  \usepackage{mhchem}
  \usepackage{xcolor}
\begin{document}
etex

input 3danim
input 3dgeom
output_res:=72;
drawing_scale:=40cm;
path a, pa, pb;
pair y;

%set_plane_(projection_plane)(point_null,vec_I,vec_J);
set_plane_(projection_plane)(point_null,vec_I,vec_K);

new_plane_(horizontal_plane)(point_null,vec_I,vec_J);

new_points(vertex)(12);
% Tétraèdre régulier
set_point_(vertex1)(0,0,0); % Origine O
set_point_(vertex2)(1,0,0); % A
set_point_(vertex3)(0,1,0); % B
set_point_(vertex4)(-1,0,0); % C
set_point_(vertex5)(0,-1,0); % D
set_point_(vertex6)(0,0,1);  % E
set_point_(vertex7)(0,0,-1); % F
set_point_(vertex8)(-1,2,0); % G
set_point_(vertex9)(-2,1,0); % H
set_point_(vertex10)(-1,1,1); % I
set_point_(vertex11)(-1,1,-1); % J
set_point_(vertex12)(-1,1,0); % K
% Observateur
i:=5;
%for i:=0 upto 10:
\beginfig(100+i)
  set_point_(Obs)(20*cosd(3.6*i),20*sind(3.6*i),6);
Obs_phi:=90; Obs_dist:=2; point_of_view_abs(vertex1,Obs_phi);
% Projections
for j:=1 upto 12:
  project_point(j,vertex[j]);
endfor;
% Lines
% détermine les points d'intersection visuels où une arête cache une autre
%boolean b, c;
%b:=def_visual_inter(i)(z4,z10,z3,z6); 
%set_point_(vertex13)(i);
%c:=def_visual_inter(j)(z4,z11,z3,z7);
%set_point_(vertex13)(j);
draw z2--z3--z6--z2--cycle;
draw z2--z7--z5--z2--cycle; draw z7--z3; draw z5--z6;
draw z10 -- z3; draw z3 --z11 -- z8 -- z3 -- cycle;
draw z8 -- z10 -- z4; draw z4 -- z11 -- z3;
drawoptions(dashed evenly);
draw z2--z4--z6; draw z5--z3;draw z5--z4--z3 -- z9;
draw z6--z7--z4;
draw z8 -- z9 -- z4 -- z8 -- cycle;
draw z11 -- z 10 -- z9 -- z11 --cycle;
drawoptions();
% dessine un cercle rouge pour l'atome de Fe2+
pickup pencircle scaled 1pt;
a = fullcircle scaled 5 mm;
fill a withcolor .7 red;
draw a;
% dessine les molécules d'eau d'hydratation 
for i:= 1 upto 11:
  pa:=a shifted z[i];
  draw pa;
endfor;
% dessine un cercle orange pour l'atome de Mg2+
pb:=fullcircle scaled 5 mm shifted z12;
fill pb withcolor .7 green;
draw pb;
% colorie en bleu les OH pontants
a:= fullcircle scaled 5 mm;
for i:= 3 upto 4:
  pa:=a shifted z[i];
  fill pa withcolor .7 blue;
  draw pa;
endfor;
% trace le double pont OH
pickup pencircle scaled 4pt;
drawoptions(dashed evenly scaled 4);
draw z1 -- z4 -- z12 -- z3 -- z1 -- cycle;

%label.top(btex \ce{H2O} etex,z6);
%label.rt(btex \ce{Fe^{2+}} etex,z1);
%label.rt(btex \ce{OH} etex,z4);
%label.rt(btex \ce{OH} etex,z3);
%label.rt(btex \ce{Mg^{2+}} etex,z12);
  label.rt(btex C etex,z4);
%  label.bot(btex F etex,z7);
%

%  label.rt(btex G etex,z8);
%  label.urt(btex H etex,z9);
  label.top(btex I etex,z10);
  label.bot(btex J etex,z11);
endfig;
%endfor;
free_points(vertex)(12);
end.

et le fichier .tex de visualisation :

% fig.tex fichier pour test d'une figure créée sous Metapost par
% fig.mp ou sous Tikz 
\documentclass[12pt,a4paper]{article}
\usepackage[dvips]{graphicx}%
\DeclareGraphicsRule{*}{mps}{*}{}
\usepackage[OT1]{fontenc}
\usepackage[ansinew]{inputenc}
\usepackage{times}
\usepackage[french,english]{babel}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage[normalem,normalbf]{ulem} %pour le soulignement
\usepackage{fancyhdr}
\usepackage{siunitx}
\title{} % 
\author{G. Bourrié}%  
\date{}  % 
% \graphicspath{{figures/}} % chemin d'accès des figures
\normalsize
\lhead{}
\chead{}
\rhead{}
\renewcommand{\headrulewidth}{0pt}
\lfoot{}
\cfoot{}
\rfoot{}

\begin{document}
\selectlanguage{french}
\thispagestyle{fancy}
\enlargethispage{-\baselineskip}
\begin{figure}
  \centering
  \begin{tabular}{cccc}

\includegraphics[scale=1]{heterodimere.105} &

  \end{tabular}

% remplacer fig par le nom du fichier figure
\caption{Deux octaèdres réguliers partageant une arête commune}
\end{figure}

\end{document}

Denis Roegel donne une méthode pour calculer l'intersection visuelle entre un plan et une arête.

Je n'arrive pas à utiliser cette méthode.

En l'occurrence, une partie des segments CJ et CI devrait être en pointillés, C étant le sommet de l'octaèdre en bleu, en arrière du plan de la figure, I et J les sommets de l'octaèdre de droite en haut et en bas.

Comment faire ?

Je n'arrive pas non plus à utiliser la fonction assign_obj et l'instanciation de classe avec les instructions pour octaèdres et j'ai donc repris l'écriture à partir des instructions de base de MetaPost.

Posée 18 Sep '22, 17:00

GBourri%C3%A9's gravatar image

GBourrié
413
Taux d'acceptation : 0%

Modifiée 18 Sep '22, 17:10

Pathe's gravatar image

Pathe ♦♦
7.5k29197245

@GBourrié - les formules de politesse et les signatures sont à éviter : celles de votre contribution ont été supprimées.

(18 Sep '22, 17:07) Pathe ♦♦ Pathe's gravatar image

@GBourrié : il serait peut-être utile de placer votre code MetaPost dans un environnement mplibcode (fourni par le package luamplib), de manière à ce qu'il soit compilable en ligne.

(18 Sep '22, 17:23) Pathe ♦♦ Pathe's gravatar image

Bienvenue sur TeXnique.fr !

(18 Sep '22, 17:28) denis ♦♦ denis's gravatar image

Je pense qu'il faut utiliser def_visual_inter_ plutôt que def_visual_inter. Et sur les noms des points plutôt que sur les projections. En ne gardant que les octaèdres, ça donnerait un truc comme ça :

\documentclass{standalone}
\usepackage{luamplib}
\everymplib{input 3dgeom;}
\begin{document}
\begin{mplibcode}
output_res:=72;
drawing_scale:=40cm;
path a, pa, pb;
pair y;

new_points(vertex)(14);
set_point_(vertex1)(0,0,0); % Origine O
set_point_(vertex2)(1,0,0); % A
set_point_(vertex3)(0,1,0); % B
set_point_(vertex4)(-1,0,0); % C
set_point_(vertex5)(0,-1,0); % D
set_point_(vertex6)(0,0,1);  % E
set_point_(vertex7)(0,0,-1); % F
set_point_(vertex8)(-1,2,0); % G
set_point_(vertex9)(-2,1,0); % H
set_point_(vertex10)(-1,1,1); % I
set_point_(vertex11)(-1,1,-1); % J
set_point_(vertex12)(-1,1,0); % K
% Observateur
i:=5;
%for i:=0 upto 10:
beginfig(100+i)
  set_point_(Obs)(20*cosd(3.6*i),20*sind(3.6*i),6);
Obs_phi:=90; Obs_dist:=2; point_of_view_abs(vertex1,Obs_phi);
% Lines
% détermine les points d'intersection visuels où une arête cache une autre
boolean b, c;
b:=def_visual_inter_(vertex13)(vertex4,vertex10,vertex3,vertex6); 
c:=def_visual_inter_(vertex14)(vertex4,vertex11,vertex3,vertex7); 
% Projections
for j:=1 upto 14:
  project_point(j,vertex[j]);
endfor;
draw z6--z3--z2--z7--z3;
draw z7--z5--z6--z2--z5;
draw z3--z8--z10--z3--z11--z8;
draw z10--z13;draw z11--z14;   % Les parties apparentes
drawoptions(dashed evenly);
draw z13--z4;draw z14--z4;  % Les parties cachées
draw z3--z4--z5;
draw z6--z4--z7; 
draw z8--z9--z4 ;
draw z10--z9--z11;

endfig;
%endfor;
free_points(vertex)(14);
\end{mplibcode}
\end{document}

Pour utiliser les classes, c'est vrai que ça a l'air compliqué, je suppose qu'on peut partir de la définition de octahedron dans 3dpoly.mp et la modifier pour changer les couleurs notamment ou les supprimer. Sans modification, ça donne ça :

\documentclass{standalone}
\usepackage{luamplib}
\everymplib{input 3dgeom;
            input 3dpoly;
            }
\begin{document}
\begin{mplibcode}

assign_obj("octa","octahedron");
new_point(origine);
set_point_(origine)(0,0,0);

beginfig(1);
set_point_(Obs)(15,8,6);
Obs_phi:=90; Obs_dist:=10; point_of_view_abs(origine,Obs_phi);
draw_obj("octa");
endfig;

free_point(origine);

\end{mplibcode}
\end{document}
Lien permanent

Publiée 22 Sep '22, 17:29

logamath's gravatar image

logamath
42316
Taux d'acceptation : 40%

1

Merci beaucoup, c'est super !

(28 Sep '22, 12:04) GBourrié GBourri%C3%A9's gravatar image
Votre réponse
(dés)activer l'aperçu

Suivre cette question

Par courriel :

Une fois que vous serez enregistré, vous pourrez souscrire à n'importe quelle mise à jour ici

Par flux RSS :

Réponses

Réponses et commentaires

Bases de Markdown

  • *italique* ou _italique_
  • **gras** ou __gras__
  • Lien ::[texte](http://url.com/ "Titre ")
  • Image : ?![alt texte](/path/img.jpg "Titre ")
  • Liste numérotée : 1. Foo 2. Bar
  • Pour ajouter un passage à la ligne, ajoutez deux espaces à l'endroit où vous souhaitez que la ligne commence.
  • Les balises HTML de base sont également prises en charge.