Index: trunk/SophyaPI/PI/pigraph3d.cc
===================================================================
--- trunk/SophyaPI/PI/pigraph3d.cc	(revision 155)
+++ trunk/SophyaPI/PI/pigraph3d.cc	(revision 158)
@@ -6,4 +6,30 @@
 #include <math.h>
 #include "pigraph3d.h"
+
+//++
+// Class	PIGraphic3D
+// Lib		PI
+// include	pigraph3d.h
+//
+//   	Classe fournissant les services de tracé graphique 
+//	en coordonnées utilisateur, et quelques primitives de tracé 3D
+//--
+//++
+// Links	Parent
+// PIGraphicUC
+//--
+
+//++
+// Titre	Constructeurs, méthodes
+//--
+//++
+// PIGraphic3D(PIGraphicGen* g, PIGrCoord x0, PIGrCoord y0, PIGrCoord dx, PIGrCoord dy)
+//	Constructeur d'un objet "PIGraph3D" à partir d'un "PIGraphic* g". L'espace
+//	de travail du nouvel objet "PIGraphic" correspond au rectangle défini par
+//	"(x0,y0)" , "dx,dy" du "PIGraphic" de départ.
+// 
+// int  kind()
+//	Renvoie le type ("= PI_3DGraphics")
+//--
 
 /* --Methode-- */
@@ -33,4 +59,41 @@
   return PI_3DGraphics; 
 }
+
+//++
+// Titre	Système de coordonnées 3D et projection
+//	Le système de coordonnées 3D est défini par la position de l'observateur (caméra),
+//	la direction de visée ou la position du centre du champ, 
+//	l'ouverture angulaire de la caméra selon les deux 
+//	axes de la projection (X,Y), eventuellement un angle correspondant à la rotation
+//	du plan image ("psi"). Les angles d'Euler ("teta", "phi", "psi" ) sont utilisés
+//	dans la définition du système de coordonnées et la projection est de type 
+//	perspective. 
+//
+//	Les coordonnées utilisateur définissant le plan image ("PIGraphicUC") vont de 
+//	X: "-dax , +dax"   Y : "-day , +day".  
+//--
+
+//++
+// void  Set3DCS_Obs(float xo, float yo, float zo, float teta, float phi, float psi, -
+//                  float dax, float day, float co, float dco=0.2)
+//	Définition du système de projection 3D à l'aide de la position de l'observateur 
+//	et de la direction de visée.
+//|	xo,yo,zo : Position de l'observateur (camera)
+//|	teta,phi : Direction de visee
+//|	psi : rotation du plan image
+//|	dax , day : Ouverture du plan image selon les deux axes = Xmax,Ymax / Z
+//|	co : distance au centre du champ
+//|	dco : profondeur de champ 
+//
+// void  Set3DCS(float xc, float yc, float zc, float xo, float yo, float zo, -
+//               float dax, float day, float dco=0.2, float psi=0.)
+//	Définition du système de projection 3D à partir de la position de l'observateur et 
+//	du centre du champ.
+//|	xc,yc,zc : Position du centre du champ
+//|	xo,yo,zo : Position de l'observateur (camera)
+//|	dax , day : Ouverture du plan image selon les deux axes = Xmax,Ymax / Z
+//|	dco : profondeur de champ 
+//|	psi : rotation du plan image
+//--
 
 static float deuxpi = 2*M_PI;
@@ -128,4 +191,27 @@
 }
 
+//++
+// bool Get3DCS(float& xc, float& yc, float& zc, float& xo, float& yo, float& zo, -
+//             float& teta, float& phi, float& psi, float& dax, float& day, float& co, float& dco);
+//	Renvoie les paramètres de définition du système de projection 3D.
+//	"Rc= true" si défini par  "Set3DCS_Obs()"
+//	
+// void  RotateObserver(float teta, float phi, float psi=0., bool rel=true)
+//	Positionne l'observateur (la caméra) en maintenant la position  
+//	du centre de champ fixe. Si "rel=false" : "teta, phi" determine la nouvelle
+//	direction de visée. Si "rel=false" : la direction de visée est tournée
+//	de l'angle "teta,phi". 
+// void  RotateObject(float teta, float phi, bool rel=true)
+//	Repostionne le centre du champ en maintenant la position de l'observateur fixe.
+//	Si "rel=false" : "teta, phi" determine la nouvelle direction de visée.
+//	Si "rel=false" : la direction de visée est tournée de l'angle "teta,phi". 
+// 
+// void  ZoomInOut(float fco, float fdax, float fday, bool rel=true)
+//	Eloigne ou approche l'observateur et modifie l'ouverture du plan image.
+//	si "real=true" : "fco, fdax, fday" sont des facteurs multiplicatifs
+//	par rapport aux valeurs actuelles, sinon des valeurs absolues. 
+//|	fco : distance observateur - centre du champ
+//|	fdax, fday : ouverture du plan image
+//--
 
 /* --Methode-- */
@@ -141,4 +227,232 @@
 }
 
+
+/* --Methode-- */
+void PIGraphic3D::RotateObserver(float teta, float phi, float psi, bool rel)
+// Positionne l'observateur (la camera) de maniere a ce que la direction de 
+// visee soit tO=teta, pO=phi (rel=false) / tO+=teta pO+=phi (rel=true) 
+// en conservant le centre de champ fixe  
+{
+  if (rel) {
+    teta += tO;
+    phi += fO;
+    psi += pO;
+    }
+  while (teta < 0.)  teta += deuxpi;
+  while (teta > deuxpi)  teta -= deuxpi;
+  if (teta > M_PI)  { teta = M_PI-teta;  phi = phi+M_PI; }
+  float xo,yo,zo; 
+  zo = -cos((double)teta)*lCO+zC;
+  xo = -sin((double)teta)*cos((double)phi)*lCO+xC;
+  yo = -sin((double)teta)*sin((double)phi)*lCO+yC;
+  Set3DCS(xC,yC,zC, xo,yo,zo, daxO, dayO, dlCO, psi);
+}
+
+/* --Methode-- */
+void PIGraphic3D::RotateObject(float teta, float phi, bool rel)
+// Positionne l'objet (centre du champ) de maniere a ce que la direction de 
+// visee soit tO=teta, pO=phi (rel=false) / tO+=teta pO+=phi (rel=true) 
+// en conservant la position de l'observateur fixe.  
+{
+  if (rel) {
+    teta += tO;
+    phi += fO;
+    }
+  while (teta < 0.)  teta += deuxpi;
+  while (teta > deuxpi)  teta -= deuxpi;
+  if (teta > M_PI)  { teta = M_PI-teta;  phi = phi+M_PI; }
+  float xc,yc,zc; 
+  zc = cos((double)teta)*lCO+zO;
+  xc = sin((double)teta)*cos((double)phi)*lCO+xO;
+  yc = sin((double)teta)*sin((double)phi)*lCO+yO;
+  Set3DCS(xc,yc,zc, xO,yO,zO, daxO, dayO, dlCO, pO);
+}
+
+/* --Methode-- */
+void PIGraphic3D::ZoomInOut(float fco, float fdax, float fday, bool rel)
+{
+  if (fco < 0.001) fco = 1.;
+  if (fdax < 0.001) fdax = 1.;
+  if (fday < 0.001) fday = 1.;
+  double dl;
+  if (rel) {
+    dl = fco*lCO;  
+    fdax *= daxO;
+    fday *= dayO;
+  }
+  else dl = fco; 
+  float xo,yo,zo; 
+  if (dl < 1.e-5) dl = 1.e-5;
+  zo = zC-cos((double)tO)*dl;
+  xo = xC-sin((double)tO)*cos((double)fO)*dl;
+  yo = yC-sin((double)tO)*sin((double)fO)*dl;
+  Set3DCS(xC,yC,zC, xo,yo,zo, fdax, fday, dlCO, pO);
+//  Set3DCS_Obs(xo, yo, zo, tO, fO, pO, daxO*fda, dayO*fda, dl, dlCO);
+}
+
+/* --Methode-- */
+void PIGraphic3D::C3DC2ObsCS(float x, float y, float z, float& xp, float& yp, float& zp)
+{
+  double xc, yc, zc;
+  xc = x-xO;   yc = y-yO;    zc = z-zO;
+  xp = RE[0][0]*xc+RE[0][1]*yc+RE[0][2]*zc;
+  yp = -RE[1][0]*xc+RE[1][1]*yc+RE[1][2]*zc;  
+  zp = RE[2][0]*xc+RE[2][1]*yc+RE[2][2]*zc;
+}
+
+/* --Methode-- */
+void PIGraphic3D::Proj3DC2GrC(float x, float y, float z, float& xpix, float& ypix)
+{
+  double xc, yc, zc;
+  float xp, yp, zp;
+  xc = x-xO;   yc = y-yO;    zc = z-zO;
+  xp = RE[0][0]*xc+RE[0][1]*yc+RE[0][2]*zc;   
+  yp = RE[1][0]*xc+RE[1][1]*yc+RE[1][2]*zc;
+  zp = RE[2][0]*xc+RE[2][1]*yc+RE[2][2]*zc;
+  if ((zp>-1.e-6) && (zp < 1.e-6))   // Protection Divide/0
+    { xpix = ypix = 0.;   return; }
+  xpix = (float)(xOrg + (xp/zp)*xScale);
+  ypix = (float)(yOrg + (yp/zp)*yScale);
+//  printf("-DBG-Proj3DC2GrC() %g %g %g -> %g %g %g -> %g %g %g -> (%g %g)\n", x,y,z,xc,yc,zc,xp,yp,zp,xp/zp,yp/zp);
+//  printf("-DBG- ... (%g %g %g - %g %g) %g %g - %g %g -> %g %g \n", xO,yO,zO, tO,fO, xOrg, yOrg,xScale,yScale ,xpix,ypix);
+}
+
+//++
+// Titre	Primitives de tracé 3D
+//--
+//++
+// void  DrawString3D(PIGrCoord x0, PIGrCoord y0, PIGrCoord z0, char* s)
+//	Tracé de chaîne de caractères à la position "(x0,y0,z0)"
+// void  DrawOpaqueString3D(PIGrCoord x0, PIGrCoord y0, PIGrCoord z0, char* s)
+//	Tracé de chaîne opaque à la position "(x0,y0,z0)"
+// void  DrawLine3D(PIGrCoord x1, PIGrCoord y1, PIGrCoord z1, -
+//                  PIGrCoord x2, PIGrCoord y2, PIGrCoord z2)
+//	Tracé d'une ligne entre les deux points "(x1,y1,z1)" et "(x2,y2,z2)"
+// void  DrawPolygon3D(PIGrCoord *x, PIGrCoord *y, PIGrCoord *z, int n)
+//	Tracé de contour de polygone - sommets définis par le tableau 
+//	"(x[i],y[i],z[i])" , "i=0..n-1"
+// void  DrawFPolygon3D(PIGrCoord *x, PIGrCoord *y, PIGrCoord *z, int n)
+//	Tracé de polygone - "(x[i],y[i],z[i])" , "i=0..n-1"
+// void  DrawMarker3D(PIGrCoord x0, PIGrCoord y0, PIGrCoord z0)
+//	Tracé d'un signe (marker) au point "(x0,y0,z0)"
+// void  DrawMarkers3D(PIGrCoord *x, PIGrCoord *y, PIGrCoord *z, int n)
+//	Tracé de signes (marker) aux points "(x[i],y[i],z[i])" , "i=0..n-1"
+//--
+
+/* --Methode-- */
+void PIGraphic3D::DrawString3D(PIGrCoord x0, PIGrCoord y0, PIGrCoord z0, const char* s)
+{
+  if (!mGrC) return;
+  float xf, yf;
+  Proj3DC2GrC(x0, y0, z0, xf, yf);
+  mGrC->DrawString(xf, yf, s);
+  return;
+}
+
+/* --Methode-- */
+void PIGraphic3D::DrawOpaqueString3D(PIGrCoord x0, PIGrCoord y0, PIGrCoord z0, const char* s)
+{
+  if (!mGrC) return;
+  float xf, yf;
+  Proj3DC2GrC(x0, y0, z0, xf, yf);
+  mGrC->DrawOpaqueString(xf, yf, s);
+  return;
+}
+
+/* --Methode-- */
+void PIGraphic3D::DrawLine3D(PIGrCoord x1, PIGrCoord y1, PIGrCoord z1, 
+                             PIGrCoord x2, PIGrCoord y2, PIGrCoord z2)
+{
+  if (!mGrC) return;
+  float xf1, yf1, xf2, yf2;
+  Proj3DC2GrC(x1, y1, z1, xf1, yf1);
+  Proj3DC2GrC(x2, y2, z2, xf2, yf2);
+//  printf("-DBG-DrawLine3D() : %g %g %g -> %g %g | %g %g %g -> %g %g\n", 
+//         (float)x1, (float)y1, (float)z1, xf1, yf1, 
+//         (float)x2, (float)y2, (float)z2, xf2, yf2 );
+  mGrC->DrawLine(xf1, yf1, xf2, yf2);
+}
+
+#define NMXMULTP  30   // Pour multipoint sans new
+
+/* --Methode-- */
+void PIGraphic3D::DrawPolygon3D(PIGrCoord *x, PIGrCoord *y, PIGrCoord *z, int n)
+{
+  PIGrCoord xc[NMXMULTP], yc[NMXMULTP];
+  PIGrCoord *pxc, *pyc;
+  int i;
+  float xf, yf;
+ 
+  if (!mGrC) return;
+  if (n <= 0)  return;
+
+  if (n > NMXMULTP) { pxc = new PIGrCoord[n];  pyc = new PIGrCoord[n];  }
+  else { pxc = xc;  pyc = yc; }
+  for(i=0; i<n; i++) {
+    Proj3DC2GrC(x[i], y[i], z[i], xf, yf);
+    pxc[i] = xf;  pyc[i] = yf; 
+  }
+  mGrC->DrawPolygon(pxc, pyc, n, false);
+  if (n > NMXMULTP) { delete[] pxc;  delete[] pyc; }
+  return;
+}
+
+
+/* --Methode-- */
+void PIGraphic3D::DrawFPolygon3D(PIGrCoord *x, PIGrCoord *y, PIGrCoord *z, int n)
+{
+  PIGrCoord xc[NMXMULTP], yc[NMXMULTP];
+  PIGrCoord *pxc, *pyc;
+  int i;
+  float xf, yf;
+ 
+  if (!mGrC) return;
+  if (n <= 0)  return;
+
+  if (n > NMXMULTP) { pxc = new PIGrCoord[n];  pyc = new PIGrCoord[n];  }
+  else { pxc = xc;  pyc = yc; }
+  for(i=0; i<n; i++) {
+    Proj3DC2GrC(x[i], y[i], z[i], xf, yf);
+    pxc[i] = xf;  pyc[i] = yf; 
+  }
+  mGrC->DrawFPolygon(pxc, pyc, n, false);
+  if (n > NMXMULTP) { delete[] pxc;  delete[] pyc; }
+  return;
+}
+
+/* --Methode-- */
+void PIGraphic3D::DrawMarker3D(PIGrCoord x0, PIGrCoord y0, PIGrCoord z0)
+{
+  if (!mGrC) return;
+  float xf, yf;
+  Proj3DC2GrC(x0, y0, z0, xf, yf);
+  mGrC->DrawMarker(xf, yf);
+  return;
+}
+
+/* --Methode-- */
+void PIGraphic3D::DrawMarkers3D(PIGrCoord *x, PIGrCoord *y, PIGrCoord *z, int n)
+{
+  PIGrCoord xc[NMXMULTP], yc[NMXMULTP];
+  PIGrCoord *pxc, *pyc;
+  int i;
+  float xf, yf;
+ 
+  if (!mGrC) return;
+  if (n <= 0)  return;
+
+  if (n > NMXMULTP) { pxc = new PIGrCoord[n];  pyc = new PIGrCoord[n]; }
+  else { pxc = xc;  pyc = yc; }
+  for(i=0; i<n; i++) {
+    Proj3DC2GrC(x[i], y[i], z[i], xf, yf);
+    pxc[i] = xf;  pyc[i] = yf; 
+  }
+  mGrC->DrawMarkers(pxc, pyc, n);
+  if (n > NMXMULTP) { delete[] pxc;  delete[] pyc; }
+  return;
+}
+
+
+//  Methode pour debugger 
 /* --Methode-- */
 void PIGraphic3D::PrintCS()
@@ -164,205 +478,2 @@
 printf("C+(0,1,1) -> %g %g %g -> %g %g \n", xp, yp, zp, xpix, ypix); 
 }
-
-/* --Methode-- */
-void PIGraphic3D::RotateObserver(float teta, float phi, float psi, bool rel)
-// Positionne l'observateur (la camera) de maniere a ce que la direction de 
-// visee soit tO=teta, pO=phi (rel=false) / tO+=teta pO+=phi (rel=true) 
-// en conservant le centre de champ fixe  
-{
-  if (rel) {
-    teta += tO;
-    phi += fO;
-    psi += pO;
-    }
-  while (teta < 0.)  teta += deuxpi;
-  while (teta > deuxpi)  teta -= deuxpi;
-  if (teta > M_PI)  { teta = M_PI-teta;  phi = phi+M_PI; }
-  float xo,yo,zo; 
-  zo = -cos((double)teta)*lCO+zC;
-  xo = -sin((double)teta)*cos((double)phi)*lCO+xC;
-  yo = -sin((double)teta)*sin((double)phi)*lCO+yC;
-  Set3DCS(xC,yC,zC, xo,yo,zo, daxO, dayO, dlCO, psi);
-}
-
-/* --Methode-- */
-void PIGraphic3D::RotateObject(float teta, float phi, bool rel)
-// Positionne l'objet (centre du champ) de maniere a ce que la direction de 
-// visee soit tO=teta, pO=phi (rel=false) / tO+=teta pO+=phi (rel=true) 
-// en conservant la position de l'observateur fixe.  
-{
-  if (rel) {
-    teta += tO;
-    phi += fO;
-    }
-  while (teta < 0.)  teta += deuxpi;
-  while (teta > deuxpi)  teta -= deuxpi;
-  if (teta > M_PI)  { teta = M_PI-teta;  phi = phi+M_PI; }
-  float xc,yc,zc; 
-  zc = cos((double)teta)*lCO+zO;
-  xc = sin((double)teta)*cos((double)phi)*lCO+xO;
-  yc = sin((double)teta)*sin((double)phi)*lCO+yO;
-  Set3DCS(xc,yc,zc, xO,yO,zO, daxO, dayO, dlCO, pO);
-}
-
-/* --Methode-- */
-void PIGraphic3D::ZoomInOut(float fco, float fdax, float fday, bool rel)
-{
-  if (fco < 0.001) fco = 1.;
-  if (fdax < 0.001) fdax = 1.;
-  if (fday < 0.001) fday = 1.;
-  double dl;
-  if (rel) {
-    dl = fco*lCO;  
-    fdax *= daxO;
-    fday *= dayO;
-  }
-  else dl = fco; 
-  float xo,yo,zo; 
-  if (dl < 1.e-5) dl = 1.e-5;
-  zo = zC-cos((double)tO)*dl;
-  xo = xC-sin((double)tO)*cos((double)fO)*dl;
-  yo = yC-sin((double)tO)*sin((double)fO)*dl;
-  Set3DCS(xC,yC,zC, xo,yo,zo, fdax, fday, dl, pO);
-//  Set3DCS_Obs(xo, yo, zo, tO, fO, pO, daxO*fda, dayO*fda, dl, dlCO);
-}
-
-/* --Methode-- */
-void PIGraphic3D::C3DC2ObsCS(float x, float y, float z, float& xp, float& yp, float& zp)
-{
-  double xc, yc, zc;
-  xc = x-xO;   yc = y-yO;    zc = z-zO;
-  xp = RE[0][0]*xc+RE[0][1]*yc+RE[0][2]*zc;
-  yp = -RE[1][0]*xc+RE[1][1]*yc+RE[1][2]*zc;  
-  zp = RE[2][0]*xc+RE[2][1]*yc+RE[2][2]*zc;
-}
-
-/* --Methode-- */
-void PIGraphic3D::Proj3DC2GrC(float x, float y, float z, float& xpix, float& ypix)
-{
-  double xc, yc, zc;
-  float xp, yp, zp;
-  xc = x-xO;   yc = y-yO;    zc = z-zO;
-  xp = RE[0][0]*xc+RE[0][1]*yc+RE[0][2]*zc;   
-  yp = RE[1][0]*xc+RE[1][1]*yc+RE[1][2]*zc;
-  zp = RE[2][0]*xc+RE[2][1]*yc+RE[2][2]*zc;
-  if ((zp>-1.e-6) && (zp < 1.e-6))   // Protection Divide/0
-    { xpix = ypix = 0.;   return; }
-  xpix = (float)(xOrg + (xp/zp)*xScale);
-  ypix = (float)(yOrg + (yp/zp)*yScale);
-//  printf("-DBG-Proj3DC2GrC() %g %g %g -> %g %g %g -> %g %g %g -> (%g %g)\n", x,y,z,xc,yc,zc,xp,yp,zp,xp/zp,yp/zp);
-//  printf("-DBG- ... (%g %g %g - %g %g) %g %g - %g %g -> %g %g \n", xO,yO,zO, tO,fO, xOrg, yOrg,xScale,yScale ,xpix,ypix);
-}
-
-/* --Methode-- */
-void PIGraphic3D::DrawString3D(PIGrCoord x0, PIGrCoord y0, PIGrCoord z0, char* s)
-{
-  if (!mGrC) return;
-  float xf, yf;
-  Proj3DC2GrC(x0, y0, z0, xf, yf);
-  mGrC->DrawString(xf, yf, s);
-  return;
-}
-
-/* --Methode-- */
-void PIGraphic3D::DrawOpaqueString3D(PIGrCoord x0, PIGrCoord y0, PIGrCoord z0, char* s)
-{
-  if (!mGrC) return;
-  float xf, yf;
-  Proj3DC2GrC(x0, y0, z0, xf, yf);
-  mGrC->DrawOpaqueString(xf, yf, s);
-  return;
-}
-
-/* --Methode-- */
-void PIGraphic3D::DrawLine3D(PIGrCoord x1, PIGrCoord y1, PIGrCoord z1, 
-                             PIGrCoord x2, PIGrCoord y2, PIGrCoord z2)
-{
-  if (!mGrC) return;
-  float xf1, yf1, xf2, yf2;
-  Proj3DC2GrC(x1, y1, z1, xf1, yf1);
-  Proj3DC2GrC(x2, y2, z2, xf2, yf2);
-//  printf("-DBG-DrawLine3D() : %g %g %g -> %g %g | %g %g %g -> %g %g\n", 
-//         (float)x1, (float)y1, (float)z1, xf1, yf1, 
-//         (float)x2, (float)y2, (float)z2, xf2, yf2 );
-  mGrC->DrawLine(xf1, yf1, xf2, yf2);
-}
-
-#define NMXMULTP  30   // Pour multipoint sans new
-
-/* --Methode-- */
-void PIGraphic3D::DrawPolygon3D(PIGrCoord *x, PIGrCoord *y, PIGrCoord *z, int n)
-{
-  PIGrCoord xc[NMXMULTP], yc[NMXMULTP];
-  PIGrCoord *pxc, *pyc;
-  int i;
-  float xf, yf;
- 
-  if (!mGrC) return;
-  if (n <= 0)  return;
-
-  if (n > NMXMULTP) { pxc = new PIGrCoord[n];  pyc = new PIGrCoord[n];  }
-  else { pxc = xc;  pyc = yc; }
-  for(i=0; i<n; i++) {
-    Proj3DC2GrC(x[i], y[i], z[i], xf, yf);
-    pxc[i] = xf;  pyc[i] = yf; 
-  }
-  mGrC->DrawPolygon(pxc, pyc, n, false);
-  if (n > NMXMULTP) { delete[] pxc;  delete[] pyc; }
-  return;
-}
-
-
-/* --Methode-- */
-void PIGraphic3D::DrawFPolygon3D(PIGrCoord *x, PIGrCoord *y, PIGrCoord *z, int n)
-{
-  PIGrCoord xc[NMXMULTP], yc[NMXMULTP];
-  PIGrCoord *pxc, *pyc;
-  int i;
-  float xf, yf;
- 
-  if (!mGrC) return;
-  if (n <= 0)  return;
-
-  if (n > NMXMULTP) { pxc = new PIGrCoord[n];  pyc = new PIGrCoord[n];  }
-  else { pxc = xc;  pyc = yc; }
-  for(i=0; i<n; i++) {
-    Proj3DC2GrC(x[i], y[i], z[i], xf, yf);
-    pxc[i] = xf;  pyc[i] = yf; 
-  }
-  mGrC->DrawFPolygon(pxc, pyc, n, false);
-  if (n > NMXMULTP) { delete[] pxc;  delete[] pyc; }
-  return;
-}
-
-/* --Methode-- */
-void PIGraphic3D::DrawMarker3D(PIGrCoord x0, PIGrCoord y0, PIGrCoord z0)
-{
-  if (!mGrC) return;
-  float xf, yf;
-  Proj3DC2GrC(x0, y0, z0, xf, yf);
-  mGrC->DrawMarker(xf, yf);
-  return;
-}
-
-/* --Methode-- */
-void PIGraphic3D::DrawMarkers3D(PIGrCoord *x, PIGrCoord *y, PIGrCoord *z, int n)
-{
-  PIGrCoord xc[NMXMULTP], yc[NMXMULTP];
-  PIGrCoord *pxc, *pyc;
-  int i;
-  float xf, yf;
- 
-  if (!mGrC) return;
-  if (n <= 0)  return;
-
-  if (n > NMXMULTP) { pxc = new PIGrCoord[n];  pyc = new PIGrCoord[n]; }
-  else { pxc = xc;  pyc = yc; }
-  for(i=0; i<n; i++) {
-    Proj3DC2GrC(x[i], y[i], z[i], xf, yf);
-    pxc[i] = xf;  pyc[i] = yf; 
-  }
-  mGrC->DrawMarkers(pxc, pyc, n);
-  if (n > NMXMULTP) { delete[] pxc;  delete[] pyc; }
-  return;
-}
