- Timestamp:
- Aug 5, 2001, 8:27:13 PM (24 years ago)
- Location:
- trunk/SophyaPI/PI
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/SophyaPI/PI/pidrawer.cc
r1589 r1618 385 385 if (mLAtt == PI_NotDefLineAtt) g->SelLine(PI_ThinLine); 386 386 else g->SelLine(mLAtt); 387 // On calcule les ticks387 // On calcule les ticks 388 388 CalcTicks(); 389 389 … … 509 509 } 510 510 511 512 513 514 511 void 515 512 PIDrawer::DrawHTicks(PIGraphicUC* g, double y, double tickUp, double tickDown, double xBeg, double xStep) … … 531 528 double xOffset = 0; 532 529 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; 534 552 for (double x=xBeg; x<=xMax; x += xStep) { 535 553 // Attention aux erreurs d'arrondi quand x->0 536 554 // car on code 5.1698e-26 au lieu de 0 537 555 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;} 541 558 double largeur = g->CalcStringWidth(label); 542 559 if (just == 1) … … 547 564 xOffset = 0; 548 565 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 ++; 550 572 } 551 573 } … … 555 577 { 556 578 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 558 585 for (double y=yBeg; y<=yMax; y += yStep) { 559 586 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;} 562 589 double largeur = g->CalcStringWidth(label); 563 590 if (just == 1) … … 588 615 } 589 616 617 /* --Methode-Static-- */ 618 int 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 } 590 676 591 677 /* -------------------------------------------------------------- */ -
trunk/SophyaPI/PI/pidrawer.h
r1568 r1618 93 93 // Calcul des Distances optimales des subdivisions 94 94 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); 95 97 96 98 // Les objets/methodes suivants devraient etre protected
Note:
See TracChangeset
for help on using the changeset viewer.