Changeset 1618 in Sophya


Ignore:
Timestamp:
Aug 5, 2001, 8:27:13 PM (24 years ago)
Author:
cmv
Message:

des labels mieux geres sur laxe des x cmv 5/8/01

Location:
trunk/SophyaPI/PI
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/SophyaPI/PI/pidrawer.cc

    r1589 r1618  
    385385  if (mLAtt == PI_NotDefLineAtt)  g->SelLine(PI_ThinLine);
    386386  else g->SelLine(mLAtt);
    387 //  On calcule les ticks
     387  //  On calcule les ticks
    388388  CalcTicks();
    389389
     
    509509}
    510510
    511 
    512 
    513 
    514511void
    515512PIDrawer::DrawHTicks(PIGraphicUC* g, double y, double tickUp, double tickDown, double xBeg, double xStep)
     
    531528  double xOffset = 0;
    532529  int kk;
    533   g->SelFontSz(xMajTickLen*4., mFAtt);
     530
     531  g->SelFontSz(xMajTickLen*3., mFAtt);
     532
     533  // Choix du bon format pour les labels des axes;
     534  string format;
     535  BonFormatAxes(xBeg,xMax,xStep,format);
     536
     537  // Pour que les labels ne se sur-ecrivent pas (On ne peut pas changer
     538  // xStep a ce niveau sinon les labels ne sont pas en face des ticks)
     539  double largeurmax = -1.;
     540  int ntick = 0;
     541  for(double x=xMin;x<=xMax;x+=xStep) {
     542    double xx = (fabs(x/xStep)<1.e-5) ? 0.: x;
     543    char label[64]; sprintf(label,format.c_str(), xx);
     544    for(kk=0;kk<64;kk++) if(label[kk]==' ') {label[kk]='\0'; break;}
     545    double largeur = g->CalcStringWidth(label);
     546    if(largeur>largeurmax) largeurmax=largeur;
     547    ntick++;
     548  }
     549  largeurmax *= 1.1;  // 10% de securite
     550
     551  double xlastlabel = xBeg; int ntick1=0;
    534552  for (double x=xBeg; x<=xMax; x += xStep) {
    535553      // Attention aux erreurs d'arrondi quand x->0
    536554      //        car on code 5.1698e-26 au lieu de 0
    537555      double xx = (fabs(x/xStep)<1.e-5) ? 0.: x;
    538       char label[20]; sprintf(label, "%-6g", xx);
    539       for(kk=0; kk<20; kk++)
    540         if (label[kk] == ' ')   { label[kk] = '\0' ; break; }
     556      char label[64]; sprintf(label,format.c_str(), xx);
     557      for(kk=0;kk<64;kk++) if(label[kk]==' ') {label[kk]='\0'; break;}
    541558      double largeur = g->CalcStringWidth(label);
    542559      if (just == 1)
     
    547564        xOffset = 0;
    548565      if (aXdir)  xOffset = -xOffset;
    549       g->DrawString(g->DeltaUCX(x,xOffset), y, label);
     566      if( ntick1==0 || ntick1==ntick-1
     567        || (xlastlabel+largeurmax<x && x+largeurmax<xMax) ) {
     568        g->DrawString(g->DeltaUCX(x,xOffset), y, label);
     569        xlastlabel = x;
     570      }
     571      ntick1 ++;
    550572  }
    551573}
     
    555577{
    556578  double xOffset = 0;
    557   g->SelFontSz(xMajTickLen*4., mFAtt);
     579  g->SelFontSz(xMajTickLen*3., mFAtt);
     580
     581  // Choix du bon format pour les labels des axes;
     582  string format;
     583  BonFormatAxes(yBeg,yMax,yStep,format);
     584
    558585  for (double y=yBeg; y<=yMax; y += yStep) {
    559586      double yy = (fabs(y/yStep)<1.e-5) ? 0.: y;
    560 //    char label[20]; sprintf(label, "%-6g", yy);
    561       char label[20]; sprintf(label, "%g", yy);
     587      char label[64]; sprintf(label,format.c_str(),yy);
     588      for(int kk=0;kk<64;kk++) if(label[kk]==' ') {label[kk]='\0'; break;}
    562589      double largeur = g->CalcStringWidth(label);
    563590      if (just == 1)
     
    588615}
    589616
     617/* --Methode-Static-- */
     618int PIDrawer::BonFormatAxes(double xmin,double xmax,double dx,string& format)
     619// Calcul format optimal pour ecrire les axes
     620// double = 17 digits : +d.(16digits)e+ddd  -> e25.18 est large!
     621{
     622 format = "%-6g";  // format par default
     623 if(xmin>=xmax || dx<=0.) return -1;
     624
     625 //////////// Calcul du nombre de digits necessaires
     626 char str[32],str0[32];
     627 int ndig = 0;
     628 //printf("           1         2         3\n");
     629 //printf("|0123456789012345678901234567890|\n");
     630 int npass = 0;  // au cas ou dx est tout petit et "x+=dx == x" !
     631 for(double x=xmin; x<=xmax; x+=dx) {
     632   // Le format %e ecrit les "-" pour x<0 mais pas les "+" pour x>0
     633   // Il faut gerer le zero car 0 -> 0.000e+00 mais -0 -> -0.000e+00
     634   if(x>0.)      sprintf(str,"+%-26.18e",x);
     635   else if(x<0.) sprintf(str,"-%-26.18e",fabs(x));
     636   else          sprintf(str,"+%-26.18e",0.);
     637   //printf("|%s|",str);
     638   if(npass!=0) {
     639     int j;
     640     for(j=0;j<(int)strlen(str);j++) if(str0[j]!=str[j]) break;
     641     //printf(" -> ...j= %d",j);
     642     if(j>ndig) ndig=j;
     643     //printf("    ndig= %d  |%26.18e| (%-6g)\n",ndig,x,x);
     644   } //else printf("\n");
     645   strcpy(str0,str);
     646   if(npass>1000) break; npass++;
     647 }
     648
     649 //////////// Calcul du bon format
     650 // position du "e"
     651 char* cdum = index(str,'e');
     652 int pose = cdum - str;
     653 //printf("pose=%d   strlen=%d\n",pose,strlen(str));
     654
     655 // on differe dans les puissances ..e+ddd
     656 if(ndig>pose) return 0;
     657
     658 // on calcule le nombre de digits necessaires
     659 ndig -= 2;  // +1 - 3 (car par ex:"+9.")
     660
     661 // Si peu de digits on reste avec le format par defaut
     662 // Attention: %6g arrondi le 6ieme digit -> ndig<5 !
     663 if(ndig<6) return ndig;
     664
     665 // On evite d'ecrire d.ddde+00   -> format %f
     666 if(  (xmin>=1. && xmin<10. && xmax>=1. && xmax<10.)
     667   || (xmin>-10. && xmin<=-1. && xmax>-10. && xmax<=-1.) ) {
     668   sprintf(str,"%%-26.%df",ndig);
     669 } else {
     670   sprintf(str,"%%-26.%de",ndig);
     671 }
     672 format = str;
     673 //printf("format= %s\n",format.c_str());
     674 return ndig;
     675}
    590676
    591677/*  --------------------------------------------------------------  */
  • trunk/SophyaPI/PI/pidrawer.h

    r1568 r1618  
    9393//  Calcul des Distances optimales des subdivisions
    9494  static void        BestTicks(double rmin,double rmax,int nticks,double& majt);
     95//  Calcul du format optimal pour les axes
     96  static int BonFormatAxes(double xmin,double xmax,double dx,string& format);
    9597
    9698//  Les objets/methodes suivants devraient etre protected     
Note: See TracChangeset for help on using the changeset viewer.