Comment cacher des arêtes non vues en perspective 3D avec Metapost
Bonjour à tous,
ci-joint Ci-dessous un fichier pour dessiner deux octaèdres partageant une arête commune.
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 `.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é\footnote{\small\textrm{%
Institut National de la Recherche Agronomique\\
Géochimie des Sols et des Eaux\\
BP 80 - F13545 Aix-en-Provence cedex 04 France\\
Tél.: +33 4 42 90 85 41 Fax~: + 33 4 42 90 85 17
E-mail: bourrie@aix.inra.fr}\hfil}}%
\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 *CJ* et CI *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 *I* et J *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 `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.
Bien cordialement,
Guilhem Bourrié`MetaPost`.