Changeset 9 in Sophya for trunk/SophyaPI/PI/piscdrawwdg.cc
- Timestamp:
- Mar 6, 1996, 11:52:37 PM (30 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/SophyaPI/PI/piscdrawwdg.cc
r8 r9 3 3 #include <algo.h> 4 4 5 6 5 PIScDrawWdg::PIScDrawWdg(PIContainerGen *par, char *nom, 7 6 int sx, int sy, int px, int py) … … 11 10 limitsFixed = 0; 12 11 xEndDrag = yEndDrag = xBegDrag = yBegDrag = 0; 12 SetAxesFlags(kAxesDflt); 13 clip = true; 13 14 } 14 15 … … 51 52 PIScDrawWdg::CalcScale() 52 53 { 53 xScale = XSize() / (xMax-xMin); 54 yScale = -YSize() / (yMax-yMin); 55 xOrg = -xMin * xScale + XPos(); 56 yOrg = -yMax * yScale + YPos(); 54 double margeH = (xMax-xMin)*0.2; 55 double margeV = (yMax-yMin)*0.2; 56 xScale = XSize() / (xMax-xMin + 2*margeH); 57 yScale = -YSize() / (yMax-yMin + 2*margeV); 58 xOrg = (-xMin + margeH) * xScale + XPos(); 59 yOrg = (-yMax - margeV) * yScale + YPos(); 57 60 } 58 61 … … 81 84 if (yFirstMinTick < yMin) yFirstMinTick += yMinTickStep; 82 85 83 xMajTickLen = -2/yScale; 84 xMinTickLen = -1/yScale; 85 yMajTickLen = 2/xScale; 86 yMinTickLen = 1/xScale; 86 // xMajTickLen = -2/yScale; 87 // xMinTickLen = -1/yScale; 88 // yMajTickLen = 2/xScale; 89 // yMinTickLen = 1/xScale; 90 91 yMajTickLen = (xMax-xMin)/100; 92 yMinTickLen = (xMax-xMin)/250; 93 xMajTickLen = (yMax-yMin)/100; 94 xMinTickLen = (yMax-yMin)/250; 95 87 96 } 88 97 … … 108 117 dypix = int(dy*yScale + .5); 109 118 } 119 120 double 121 PIScDrawWdg::ScStringWidth(char const* s) 122 { 123 return CalcStringWidth(s) / xScale; 124 } 125 126 void 127 PIScDrawWdg::ScSelFontSz(double size, PIFontAtt att) 128 { 129 int npt = int(fabs(size * yScale)+.5); 130 if (npt < 8) npt = 8; 131 if (npt > 127) npt = 127; 132 SelFontSzPt(npt, att); 133 } 134 110 135 111 136 void … … 120 145 PIScDrawWdg::ScDrawLine(double x1, double y1, double x2, double y2) 121 146 { 147 148 if (clip) { 149 if (x2 < xMin && x1 < xMin) return; 150 if (x2 > xMax && x1 > xMax) return; 151 if (y1 < yMin && y2 < yMin) return; 152 if (y2 > yMax && y2 > yMax) return; 153 if (x2 < x1) { 154 swap(x1,x2); 155 swap(y1,y2); 156 } 157 if (x2>xMax) { 158 y2 = y1 + (y2-y1)/(x2-x1)*(xMax-x1); 159 x2 = xMax; 160 } 161 if (x1<xMin) { 162 y1 = y2 + (y1-y2)/(x1-x2)*(xMin-x2); 163 x1 = xMin; 164 } 165 if (y2 < y1) { 166 swap(x1,x2); 167 swap(y1,y2); 168 } 169 if (y2>yMax) { 170 x2 = x1 + (x2-x1)/(y2-y1)*(yMax-y1); 171 y2 = yMax; 172 } 173 if (y1<yMin) { 174 x1 = x2 + (x1-x2)/(y1-y2)*(yMin-y2); 175 y1 = yMin; 176 } 177 } 122 178 int x1Pix, y1Pix, x2Pix, y2Pix; 123 179 Sc2Local(x1, y1, x1Pix, y1Pix); … … 129 185 PIScDrawWdg::ScDrawBox(double x, double y, double dx, double dy) 130 186 { 187 if (clip) { 188 if (dx < 0) { 189 x = x+dx; 190 dx = -dx; 191 } 192 if (dy < 0) { 193 y = y+dy; 194 dy = -dy; 195 } 196 if (x > xMax || x+dx < xMin || y > yMax || y+dy < yMin) return; 197 if (x < xMin) { 198 dx -= (xMin-x); 199 x = xMin; 200 } 201 if (y < yMin) { 202 dy -= (yMin-y); 203 y = yMin; 204 } 205 if (x+dx > xMax) 206 dx = (xMax-x); 207 if (y+dy > yMax) 208 dy = (yMax-y); 209 } 131 210 int xPix, yPix, x2Pix, y2Pix; 132 211 Sc2Local(x, y, xPix, yPix); … … 138 217 PIScDrawWdg::ScDrawFBox(double x, double y, double dx, double dy) 139 218 { 219 if (clip) { 220 if (dx < 0) { 221 x = x+dx; 222 dx = -dx; 223 } 224 if (dy < 0) { 225 y = y+dy; 226 dy = -dy; 227 } 228 if (x > xMax || x+dx < xMin || y > yMax || y+dy < yMin) return; 229 if (x < xMin) { 230 dx -= (xMin-x); 231 x = xMin; 232 } 233 if (y < yMin) { 234 dy -= (yMin-y); 235 y = yMin; 236 } 237 if (x+dx > xMax) 238 dx = (xMax-x); 239 if (y+dy > yMax) 240 dy = (yMax-y); 241 } 140 242 int xPix, yPix, x2Pix, y2Pix; 141 243 Sc2Local(x, y, xPix, yPix); … … 163 265 164 266 void 165 PIScDrawWdg::DrawAxes(int tickLevel, int markLevel) 166 { 167 // Les axes 168 169 ScDrawLine(xMin, 0, xMax, 0); 170 ScDrawLine(0, yMin, 0, yMax); 171 172 // Les ticks majeurs 173 174 if (tickLevel > 0) { 175 for (double x=xFirstMajTick; x<=xMax; x += xMajTickStep) 176 ScDrawLine(x, -xMajTickLen, x, xMajTickLen); 177 for (double y=yFirstMajTick; y<=yMax; y += yMajTickStep) 178 ScDrawLine(-yMajTickLen, y, yMajTickLen, y); 179 } 180 181 // Les ticks mineurs 182 183 if (tickLevel > 1) { 184 for (double x=xFirstMinTick; x<=xMax; x += xMinTickStep) 185 ScDrawLine(x, -xMinTickLen, x, xMinTickLen); 186 for (double y=yFirstMinTick; y<=yMax; y += yMinTickStep) 187 ScDrawLine(-yMinTickLen, y, yMinTickLen, y); 188 } 189 190 191 } 192 193 void 194 PIScDrawWdg::SetBBoxMargin(double h, double v) 195 { 196 bbmargeh = h; 197 bbmargev = v; 198 } 199 200 void 201 PIScDrawWdg::DrawBBox(int tickLevel, int tickFlags, int markLevel) 202 { 203 204 double xLow = xMin + bbmargeh; 205 double xHig = xMax - bbmargeh; 206 double yLow = yMin + bbmargev; 207 double yHig = yMax - bbmargev; 208 209 double extXMajTickLen = tickFlags&2 ? xMajTickLen : 0; 210 double intXMajTickLen = tickFlags&1 ? xMajTickLen : 0; 211 double extXMinTickLen = tickFlags&2 ? xMinTickLen : 0; 212 double intXMinTickLen = tickFlags&1 ? xMinTickLen : 0; 213 double extYMajTickLen = tickFlags&2 ? yMajTickLen : 0; 214 double intYMajTickLen = tickFlags&1 ? yMajTickLen : 0; 215 double extYMinTickLen = tickFlags&2 ? yMinTickLen : 0; 216 double intYMinTickLen = tickFlags&1 ? yMinTickLen : 0; 217 218 219 // Les bordures 220 221 ScDrawLine(xLow, yLow, xHig, yLow); 222 ScDrawLine(xHig, yLow, xHig, yHig); 223 ScDrawLine(xHig, yHig, xLow, yHig); 224 ScDrawLine(xLow, yHig, xLow, yLow); 225 226 // Les ticks majeurs 227 228 if (tickLevel > 0) { 229 for (double x=xFirstMajTick; x<=xHig; x += xMajTickStep) { 230 ScDrawLine(x, yLow - extXMajTickLen, x, yLow + intXMajTickLen); 231 ScDrawLine(x, yHig + extXMajTickLen, x, yHig + intXMajTickLen); 232 } 233 for (double y=yFirstMajTick; y<=yHig; y += yMajTickStep) { 234 ScDrawLine(xLow - extYMajTickLen, y, xLow + intYMajTickLen, y); 235 ScDrawLine(xHig + extYMajTickLen, y, xHig - intYMajTickLen, y); 236 } 237 } 238 239 240 // Les ticks mineurs 241 242 if (tickLevel > 1) { 243 for (double x=xFirstMinTick; x<=xHig; x += xMinTickStep) { 244 ScDrawLine(x, yLow - extXMinTickLen, x, yLow + intXMinTickLen); 245 ScDrawLine(x, yHig + extXMinTickLen, x, yHig + intXMinTickLen); 246 } 247 for (double y=yFirstMinTick; y<=yHig; y += yMinTickStep) { 248 ScDrawLine(xLow - extYMinTickLen, y, xLow + intYMinTickLen, y); 249 ScDrawLine(xHig + extYMinTickLen, y, xHig - intYMinTickLen, y); 250 } 251 } 252 253 // Les labels 254 if (markLevel > 0) { 255 for (double x=xFirstMajTick; x<=xHig; x += xMajTickStep) { 267 PIScDrawWdg::DrawHTicks(double y, double tickUp, double tickDown, double xBeg, double xStep) 268 { 269 for (double x=xBeg; x<=xMax; x += xStep) 270 ScDrawLine(x, y-tickDown, x, y+tickUp); 271 } 272 273 void 274 PIScDrawWdg::DrawVTicks(double x, double tickLeft, double tickRight, double yBeg, double yStep) 275 { 276 for (double y=yBeg; y<=yMax; y += yStep) 277 ScDrawLine(x-tickLeft, y, x+tickRight, y); 278 } 279 280 void 281 PIScDrawWdg::DrawHLabels(double y, double xBeg, double xStep, int just) 282 { 283 double xOffset = 0; 284 285 ScSelFontSz(xMajTickLen*4); 286 for (double x=xBeg; x<=xMax; x += xStep) { 256 287 char label[20]; sprintf(label, "%-6g", x); 257 ScDrawString(x, yLow - 8 * xMajTickLen, label); 258 ScDrawString(x, yHig + 2 * xMajTickLen, label); 259 } 260 for (double y=yFirstMajTick; y<=yHig; y += yMajTickStep) { 288 double largeur = ScStringWidth(label); 289 if (just == 1) 290 xOffset = -largeur; 291 else if (just == 0) 292 xOffset = -largeur/2; 293 else 294 xOffset = 0; 295 ScDrawString(x+xOffset, y, label); 296 } 297 } 298 299 void 300 PIScDrawWdg::DrawVLabels(double x, double yBeg, double yStep, int just) 301 { 302 double xOffset = 0; 303 ScSelFontSz(xMajTickLen*4); 304 for (double y=yBeg; y<=yMax; y += yStep) { 261 305 char label[20]; sprintf(label, "%-6g", y); 262 ScDrawString(xLow - 8 * yMajTickLen, y, label); 263 ScDrawString(xHig + 2 * yMajTickLen, y, label); 264 } 265 } 266 } 306 double largeur = ScStringWidth(label); 307 if (just == 1) 308 xOffset = -largeur; 309 else if (just == 0) 310 xOffset = -largeur/2; 311 else 312 xOffset = 0; 313 ScDrawString(x+xOffset, y, label); 314 } 315 } 316 317 318 void 319 PIScDrawWdg::DrawAxes(int flags) 320 { 321 NoClip(); 322 if (flags == -1) 323 flags = axesFlags; 324 325 326 if (flags & kStdAxes) { 327 328 // Les axes 329 330 ScDrawLine(xMin, 0, xMax, 0); 331 ScDrawLine(0, yMin, 0, yMax); 332 333 // Les ticks majeurs 334 335 if (flags & kMajTicks) { 336 DrawHTicks(0, xMajTickLen, xMajTickLen, xFirstMajTick, xMajTickStep); 337 DrawVTicks(0, yMajTickLen, yMajTickLen, yFirstMajTick, yMajTickStep); 338 } 339 340 // Les ticks mineurs 341 342 if (flags & kMinTicks) { 343 DrawHTicks(0, xMinTickLen, xMinTickLen, xFirstMinTick, xMinTickStep); 344 DrawVTicks(0, yMinTickLen, yMinTickLen, yFirstMinTick, yMinTickStep); 345 } 346 347 // Les labels 348 349 if (flags & kLabels) { 350 DrawHLabels(-xMajTickLen*8, xFirstMajTick, xMajTickStep,0); 351 DrawVLabels(-yMajTickLen*2, yFirstMajTick, yMajTickStep,1); 352 } 353 354 } 355 356 if (flags & kBoxAxes) { 357 358 // La boite 359 360 ScDrawLine(xMin, yMin, xMax, yMin); 361 ScDrawLine(xMax, yMin, xMax, yMax); 362 ScDrawLine(xMax, yMax, xMin, yMax); 363 ScDrawLine(xMin, yMax, xMin, yMin); 364 365 // Longueur des ticks 366 367 double extXMajTickLen = flags&kExtTicks ? xMajTickLen : 0; 368 double intXMajTickLen = flags&kIntTicks ? xMajTickLen : 0; 369 double extXMinTickLen = flags&kExtTicks ? xMinTickLen : 0; 370 double intXMinTickLen = flags&kIntTicks ? xMinTickLen : 0; 371 double extYMajTickLen = flags&kExtTicks ? yMajTickLen : 0; 372 double intYMajTickLen = flags&kIntTicks ? yMajTickLen : 0; 373 double extYMinTickLen = flags&kExtTicks ? yMinTickLen : 0; 374 double intYMinTickLen = flags&kIntTicks ? yMinTickLen : 0; 375 376 // Les ticks majeurs 377 378 if (flags & kMajTicks) { 379 DrawHTicks(yMin, intXMajTickLen, extXMajTickLen, xFirstMajTick, xMajTickStep); 380 DrawHTicks(yMax, extXMajTickLen, intXMajTickLen, xFirstMajTick, xMajTickStep); 381 DrawVTicks(xMin, extYMajTickLen, intYMajTickLen, yFirstMajTick, yMajTickStep); 382 DrawVTicks(xMax, intYMajTickLen, extYMajTickLen, yFirstMajTick, yMajTickStep); 383 } 384 385 // Les ticks mineurs 386 387 if (flags & kMinTicks) { 388 DrawHTicks(yMin, intXMinTickLen, extXMinTickLen, xFirstMinTick, xMinTickStep); 389 DrawHTicks(yMax, extXMinTickLen, intXMinTickLen, xFirstMinTick, xMinTickStep); 390 DrawVTicks(xMin, extYMinTickLen, intYMinTickLen, yFirstMinTick, yMinTickStep); 391 DrawVTicks(xMax, intYMinTickLen, extYMinTickLen, yFirstMinTick, yMinTickStep); 392 } 393 394 395 // Les labels 396 397 if (flags & kLabels) { 398 DrawHLabels(yMin-xMajTickLen*8, xFirstMajTick, xMajTickStep,0); 399 DrawHLabels(yMax+xMajTickLen*2, xFirstMajTick, xMajTickStep,0); 400 DrawVLabels(xMin-yMajTickLen*2, yFirstMajTick, yMajTickStep,1); 401 DrawVLabels(xMax+yMajTickLen*2, yFirstMajTick, yMajTickStep,-1); 402 } 403 } 404 Clip(); 405 } 406 407 267 408 268 409 void … … 302 443 303 444 void 304 PIScDrawWdg::SetAxesKind(int axesKind, int tickLevel, int markLevel) 305 { 306 axesChoice = axesKind; 307 tickChoice = tickLevel; 308 labelChoice = markLevel; 445 PIScDrawWdg::SetAxesFlags(int flags) 446 { 447 axesFlags = flags; 448 if (axesFlags & (kIntTicks | kExtTicks | kMajTicks | kMinTicks)) 449 axesFlags |= kTicks; 450 if ((axesFlags & (kTicks | kIntTicks | kExtTicks)) == kTicks) 451 axesFlags |= kIntTicks | kExtTicks; 452 if ((axesFlags & (kTicks | kMajTicks | kMinTicks)) == kTicks) 453 axesFlags |= kMajTicks; 309 454 } 310 455 … … 313 458 { 314 459 EraseWindow(); 315 if (axesChoice == 1) 316 DrawAxes(tickChoice, labelChoice); 317 else if (axesChoice == 2) 318 DrawBBox(tickChoice, labelChoice); 460 DrawAxes(); 319 461 CallDrawers(); 462 DrawSelf(); 320 463 } 321 464 … … 329 472 xEndDrag = xBegDrag = x; 330 473 yEndDrag = yBegDrag = y; 331 PIBeep();332 474 } 333 475 … … 429 571 PIScGFFDrawer::PIScGFFDrawer(GeneralFitFunction* f) 430 572 : mFunc(f), mNParms(f->NPar()), mParms(new double[mNParms]) 431 {} 573 { 574 ASSERT(f->NVar() == 1); 575 } 432 576 433 577 PIScGFFDrawer::~PIScGFFDrawer() … … 437 581 438 582 void 439 PIScGFFDrawer::SetParms(double const*) 440 {} 583 PIScGFFDrawer::SetParms(double const* p) 584 { 585 for (int i=0; i<mNParms; i++) 586 mParms[i] = p[i]; 587 } 441 588 442 589 … … 444 591 PIScGFFDrawer::Draw() 445 592 { 446 } 447 593 if (!mDrawWdg) return; 594 double xMax = mDrawWdg->XMax(); 595 double xMin = mDrawWdg->XMin(); 596 double yMax = mDrawWdg->YMax(); 597 double yMin = mDrawWdg->YMin(); 598 double xStep = (xMax - xMin)/100; 599 double xOld = xMin; 600 double yOld = 0; 601 // double yOld = f->Value(&xMin, mParms); 602 for (double x = xMin+xStep; x<xMax; x+=xStep) { 603 double y = 0; // $CHECK$ 604 // double y = f->Value(&x, mParms); 605 if (y>yMin && yOld>yMin && 606 y<yMax && yOld<yMax) 607 mDrawWdg->ScDrawLine(xOld, yOld, x, y); 608 xOld = x; 609 yOld = y; 610 } 611 } 612
Note:
See TracChangeset
for help on using the changeset viewer.