Re: Exemple minimal

Denis Roegel <[email protected]> Sun, 26 Jun 2005 14:46:58 +0200
Newsgroups gmane.comp.tex.metafont
Message-ID <[email protected]>
On Sun, Jun 26, 2005 at 12:28:07AM +0200, Jean-Michel Boucart wrote:
> Denis Roegel a =E9crit :
>=20
> >Si vous voulez, au sein d'un objet, conna=EEtre la valeur x
> >du point i de cet objet, utilisez une construction comme
> >
> >  vec[points_[ipnt_(1)]]x
> >
> >ou aussi =E9crire=20
> >
> >  xval(pnt_obj("OIJK",1))
> >
> >pour la valeur x du point 1 de l'objet OIJK.
> >
> > =20
> >
> Et pourquoi pas vec[pnt(1)]x ou xval(pnt(1)) ? Est-ce parce qu'il faut=20
> dinstinguer deux ordres de r=E9f=E9rences d'un point ?

Tout d'abord, une remarque sur la construction vec[]x, vec[]y, vec[]z.
R=E9trospectivement, je regrette d'avoir s=E9par=E9 les composantes alors
que j'aurais pu utiliser le type color, d'o=F9 quelques lourdeurs.

Maintenant, si vous regardez les d=E9finitions de ipnt_ et pnt, on a :

def ipnt_(expr i)=3Di+current_point_offset_ enddef;
def pnt(expr i)=3Dpoints_[ipnt_(i)] enddef;

current_point_offset_ est l'ordre du point fictif 0 d'un objet
(les points commencent =E0 1 par objet). Cet ordre est simplement aussi
le nombre de points d'objets ant=E9rieurement d=E9finis dans d'autres
objets. Ce nombre n'inclut pas les points d=E9finis hors des objets,
par exemple Obs. C'est peut-=EAtre criticable, mais c'est comme =E7a.

ipnt_(i) est donc le num=E9ro du point i de l'objet courant=20
(current_point_offset_ varie par objet et ne doit pas =EAtre utilis=E9=20
hors d'un objet) en consid=E9rant tous les points se trouvant dans
des objets.=20

Le tableau points_ fait la correspondance entre les num=E9ros des
points d'objets et les num=E9ros absolus. Donc en principe, pnt(i)
est le num=E9ro absolu.=20

Les =E9critures vec[pnt(1)]x ou xval(pnt(1)) devraient fonctionner,
je n'y avais pas pens=E9.

>=20
> Je vais me limiter pour le moment aux questions li=E9es =E0 mes projets=
=20
> actuels mais  il y a une par ailleurs une foule de questions qui resten=
t=20
> en suspend. Peut-=EAtre suis-je trop n=E9ophyte en programation objet.
>=20
> Ca m'=E9tonne de voir dans le source que vous proposez,
>=20
> show_point("1:",pnt_obj("OIJK",1));
>=20
> dans la proc=E9dure draw_Repere, l'assignation de l'objet "OIJK" =E0 la=
=20
> classe Repere figurant plus loin. J'ai le sentiment  d'une circularit=E9=
=20
> que je ne sais comment exprimer, d'autant que =E7a marche (je n'en dout=
ais=20
> pas).

Ce bout de code n'est interpr=E9t=E9 qu'au trac=E9, lorsque l'objet est
d=E9j=E0 d=E9fini, et cela ne pose donc pas de probl=E8me.

> Comment colorer un plan (le quadrilat=E8re qui le repr=E9sente et qui e=
st=20
> d=E9fini par des points) ?

Si le quadrilat=E8re est form=E9 de quatre points i,j,k,l d'un m=EAme obj=
et,
il doit suffire d'adapter un peu une macro comme draw_arrow
qui est

def draw_arrow(expr i,j)=3D
  drawarrow z[ipnt_(i)]--z[ipnt_(j)];
enddef;

z[ipnt_(i)] est le projet=E9 du point i de l'objet.

D'o=F9=20

def dessine_quadrilatere(expr i,j,k,l)=3D
  fill z[ipnt_(i)]--z[ipnt_(j)]--z[ipnt_(k)]--z[ipnt_(l)]--cycle
    withcolor blue;
enddef;

On peut aussi faire quelque chose de plus g=E9n=E9ral qui prend un polygo=
ne
en adaptant draw_lines.

Bon courage !

D. Roegel