00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #include <stdlib.h>
00013
00014 #include "Riostream.h"
00015 #include "TROOT.h"
00016 #include "TEllipse.h"
00017 #include "TVirtualPad.h"
00018 #include "TMath.h"
00019 #include "TClass.h"
00020
00021 const Double_t kPI = 3.14159265358979323846;
00022
00023 ClassImp(TEllipse)
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051 TEllipse::TEllipse(): TObject(), TAttLine(), TAttFill()
00052 {
00053
00054
00055 fX1 = 0;
00056 fY1 = 0;
00057 fR1 = 1;
00058 fR2 = 1;
00059 fPhimin = 0;
00060 fPhimax = 360;
00061 fTheta = 0;
00062 }
00063
00064
00065
00066 TEllipse::TEllipse(Double_t x1, Double_t y1,Double_t r1,Double_t r2,Double_t phimin,Double_t phimax,Double_t theta)
00067 :TObject(), TAttLine(), TAttFill(0,1001)
00068 {
00069
00070
00071 fX1 = x1;
00072 fY1 = y1;
00073 fR1 = r1;
00074 fR2 = r2;
00075 fPhimin = phimin;
00076 fPhimax = phimax;
00077 fTheta = theta;
00078 if (r2 <= 0) fR2 = fR1;
00079 }
00080
00081
00082
00083 TEllipse::~TEllipse()
00084 {
00085
00086
00087 }
00088
00089
00090
00091 TEllipse::TEllipse(const TEllipse &ellipse) : TObject(ellipse), TAttLine(ellipse), TAttFill(ellipse)
00092 {
00093
00094
00095 fX1 = 0;
00096 fY1 = 0;
00097 fR1 = 1;
00098 fR2 = 1;
00099 fPhimin = 0;
00100 fPhimax = 360;
00101 fTheta = 0;
00102
00103 ((TEllipse&)ellipse).Copy(*this);
00104 }
00105
00106
00107
00108 void TEllipse::Copy(TObject &obj) const
00109 {
00110
00111
00112 TObject::Copy(obj);
00113 TAttLine::Copy(((TEllipse&)obj));
00114 TAttFill::Copy(((TEllipse&)obj));
00115 ((TEllipse&)obj).fX1 = fX1;
00116 ((TEllipse&)obj).fY1 = fY1;
00117 ((TEllipse&)obj).fR1 = fR1;
00118 ((TEllipse&)obj).fR2 = fR2;
00119 ((TEllipse&)obj).fPhimin = fPhimin;
00120 ((TEllipse&)obj).fPhimax = fPhimax;
00121 ((TEllipse&)obj).fTheta = fTheta;
00122 }
00123
00124
00125
00126 Int_t TEllipse::DistancetoPrimitive(Int_t px, Int_t py)
00127 {
00128
00129
00130
00131
00132
00133
00134
00135
00136 Double_t x = gPad->PadtoX(gPad->AbsPixeltoX(px));
00137 Double_t y = gPad->PadtoY(gPad->AbsPixeltoY(py));
00138
00139 Double_t dxnr = x - fX1;
00140 Double_t dynr = y - fY1;
00141
00142 Double_t ct = TMath::Cos(kPI*GetTheta()/180.0);
00143 Double_t st = TMath::Sin(kPI*GetTheta()/180.0);
00144
00145 Double_t dx = dxnr*ct + dynr*st;
00146 Double_t dy = -dxnr*st + dynr*ct;
00147
00148 Double_t r1 = fR1;
00149 Double_t r2 = fR2;
00150
00151 if (dx == 0 || r1 == 0 || r2 == 0) return 9999;
00152 Double_t distp = TMath::Sqrt(dx*dx + dy*dy);
00153
00154 Double_t tana = dy/dx;
00155 tana *= tana;
00156 Double_t distr = TMath::Sqrt((1+tana)/(1.0/(r1*r1) + tana/(r2*r2)));
00157 Int_t dist = 9999;
00158 if (GetFillColor() && GetFillStyle()) {
00159 if (distr > distp) dist = 0;
00160 } else {
00161 if (TMath::Abs(distr-distp)/(r1+r2) < 0.01) dist = 0;
00162 }
00163 return dist;
00164 }
00165
00166
00167
00168 void TEllipse::Draw(Option_t *option)
00169 {
00170
00171
00172 AppendPad(option);
00173
00174 }
00175
00176
00177
00178 void TEllipse::DrawEllipse(Double_t x1, Double_t y1,Double_t r1,Double_t r2,Double_t phimin,Double_t phimax,Double_t theta,Option_t *option)
00179 {
00180
00181
00182 TEllipse *newellipse = new TEllipse(x1, y1, r1, r2, phimin, phimax,theta);
00183 TAttLine::Copy(*newellipse);
00184 TAttFill::Copy(*newellipse);
00185 newellipse->SetBit(kCanDelete);
00186 newellipse->AppendPad(option);
00187 if (TestBit(kNoEdges)) newellipse->SetBit(kNoEdges);
00188 }
00189
00190
00191
00192 void TEllipse::ExecuteEvent(Int_t event, Int_t px, Int_t py)
00193 {
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206 Int_t kMaxDiff = 10;
00207 const Int_t kMinSize = 25;
00208 const Int_t np = 40;
00209 static Int_t x[np+2], y[np+2];
00210 static Int_t px1,py1,npe,r1,r2,sav1,sav2;
00211 static Int_t pxold, pyold;
00212 static Int_t sig,impair;
00213 Int_t i, dpx, dpy;
00214 Double_t angle,dx,dy,dphi,ct,st,fTy,fBy,fLx,fRx;
00215 static Bool_t pTop, pL, pR, pBot, pINSIDE;
00216 static Int_t pTx,pTy,pLx,pLy,pRx,pRy,pBx,pBy;
00217
00218 if (!gPad->IsEditable()) return;
00219
00220 switch (event) {
00221
00222 case kButton1Down:
00223 gVirtualX->SetLineColor(-1);
00224 TAttLine::Modify();
00225 dphi = (fPhimax-fPhimin)*kPI/(180*np);
00226 ct = TMath::Cos(kPI*fTheta/180);
00227 st = TMath::Sin(kPI*fTheta/180);
00228 for (i=0;i<np;i++) {
00229 angle = fPhimin*kPI/180 + Double_t(i)*dphi;
00230 dx = fR1*TMath::Cos(angle);
00231 dy = fR2*TMath::Sin(angle);
00232 x[i] = gPad->XtoAbsPixel(fX1 + dx*ct - dy*st);
00233 y[i] = gPad->YtoAbsPixel(fY1 + dx*st + dy*ct);
00234 }
00235 if (fPhimax-fPhimin >= 360 ) {
00236 x[np] = x[0];
00237 y[np] = y[0];
00238 npe = np;
00239 } else {
00240 x[np] = gPad->XtoAbsPixel(fX1);
00241 y[np] = gPad->YtoAbsPixel(fY1);
00242 x[np+1] = x[0];
00243 y[np+1] = y[0];
00244 npe = np + 1;
00245 }
00246 impair = 0;
00247 px1 = gPad->XtoAbsPixel(fX1);
00248 py1 = gPad->YtoAbsPixel(fY1);
00249 pTx = pBx = px1;
00250 pLy = pRy = py1;
00251 pTy = gPad->YtoAbsPixel(fR2+fY1);
00252 pBy = gPad->YtoAbsPixel(-fR2+fY1);
00253 pLx = gPad->XtoAbsPixel(-fR1+fX1);
00254 pRx = gPad->XtoAbsPixel(fR1+fX1);
00255 r2 = (pBy-pTy)/2;
00256 r1 = (pRx-pLx)/2;
00257 gVirtualX->DrawLine(pRx+4, py1+4, pRx-4, py1+4);
00258 gVirtualX->DrawLine(pRx-4, py1+4, pRx-4, py1-4);
00259 gVirtualX->DrawLine(pRx-4, py1-4, pRx+4, py1-4);
00260 gVirtualX->DrawLine(pRx+4, py1-4, pRx+4, py1+4);
00261 gVirtualX->DrawLine(pLx+4, py1+4, pLx-4, py1+4);
00262 gVirtualX->DrawLine(pLx-4, py1+4, pLx-4, py1-4);
00263 gVirtualX->DrawLine(pLx-4, py1-4, pLx+4, py1-4);
00264 gVirtualX->DrawLine(pLx+4, py1-4, pLx+4, py1+4);
00265 gVirtualX->DrawLine(px1+4, pBy+4, px1-4, pBy+4);
00266 gVirtualX->DrawLine(px1-4, pBy+4, px1-4, pBy-4);
00267 gVirtualX->DrawLine(px1-4, pBy-4, px1+4, pBy-4);
00268 gVirtualX->DrawLine(px1+4, pBy-4, px1+4, pBy+4);
00269 gVirtualX->DrawLine(px1+4, pTy+4, px1-4, pTy+4);
00270 gVirtualX->DrawLine(px1-4, pTy+4, px1-4, pTy-4);
00271 gVirtualX->DrawLine(px1-4, pTy-4, px1+4, pTy-4);
00272 gVirtualX->DrawLine(px1+4, pTy-4, px1+4, pTy+4);
00273
00274
00275 case kMouseMotion:
00276 px1 = gPad->XtoAbsPixel(fX1);
00277 py1 = gPad->YtoAbsPixel(fY1);
00278 pTx = pBx = px1;
00279 pLy = pRy = py1;
00280 pTy = gPad->YtoAbsPixel(fR2+fY1);
00281 pBy = gPad->YtoAbsPixel(-fR2+fY1);
00282 pLx = gPad->XtoAbsPixel(-fR1+fX1);
00283 pRx = gPad->XtoAbsPixel(fR1+fX1);
00284 pTop = pL = pR = pBot = pINSIDE = kFALSE;
00285 if ((TMath::Abs(px - pTx) < kMaxDiff) &&
00286 (TMath::Abs(py - pTy) < kMaxDiff)) {
00287 pTop = kTRUE;
00288 gPad->SetCursor(kTopSide);
00289 }
00290 else
00291 if ((TMath::Abs(px - pBx) < kMaxDiff) &&
00292 (TMath::Abs(py - pBy) < kMaxDiff)) {
00293 pBot = kTRUE;
00294 gPad->SetCursor(kBottomSide);
00295 }
00296 else
00297 if ((TMath::Abs(py - pLy) < kMaxDiff) &&
00298 (TMath::Abs(px - pLx) < kMaxDiff)) {
00299 pL = kTRUE;
00300 gPad->SetCursor(kLeftSide);
00301 }
00302 else
00303 if ((TMath::Abs(py - pRy) < kMaxDiff) &&
00304 (TMath::Abs(px - pRx) < kMaxDiff)) {
00305 pR = kTRUE;
00306 gPad->SetCursor(kRightSide);
00307 }
00308 else {pINSIDE= kTRUE; gPad->SetCursor(kMove); }
00309 pxold = px; pyold = py;
00310
00311 break;
00312
00313 case kButton1Motion:
00314 gVirtualX->DrawLine(pRx+4, py1+4, pRx-4, py1+4);
00315 gVirtualX->DrawLine(pRx-4, py1+4, pRx-4, py1-4);
00316 gVirtualX->DrawLine(pRx-4, py1-4, pRx+4, py1-4);
00317 gVirtualX->DrawLine(pRx+4, py1-4, pRx+4, py1+4);
00318 gVirtualX->DrawLine(pLx+4, py1+4, pLx-4, py1+4);
00319 gVirtualX->DrawLine(pLx-4, py1+4, pLx-4, py1-4);
00320 gVirtualX->DrawLine(pLx-4, py1-4, pLx+4, py1-4);
00321 gVirtualX->DrawLine(pLx+4, py1-4, pLx+4, py1+4);
00322 gVirtualX->DrawLine(px1+4, pBy+4, px1-4, pBy+4);
00323 gVirtualX->DrawLine(px1-4, pBy+4, px1-4, pBy-4);
00324 gVirtualX->DrawLine(px1-4, pBy-4, px1+4, pBy-4);
00325 gVirtualX->DrawLine(px1+4, pBy-4, px1+4, pBy+4);
00326 gVirtualX->DrawLine(px1+4, pTy+4, px1-4, pTy+4);
00327 gVirtualX->DrawLine(px1-4, pTy+4, px1-4, pTy-4);
00328 gVirtualX->DrawLine(px1-4, pTy-4, px1+4, pTy-4);
00329 gVirtualX->DrawLine(px1+4, pTy-4, px1+4, pTy+4);
00330 for (i=0;i<npe;i++) gVirtualX->DrawLine(x[i], y[i], x[i+1], y[i+1]);
00331 if (pTop) {
00332 sav1 = py1;
00333 sav2 = r2;
00334 py1 += (py - pyold)/2;
00335 r2 -= (py - pyold)/2;
00336 if (TMath::Abs(pyold-py)%2==1) impair++;
00337 if (py-pyold>0) sig=+1;
00338 else sig=-1;
00339 if (impair==2) { impair = 0; py1 += sig; r2 -= sig;}
00340 if (py1 > pBy-kMinSize) {py1 = sav1; r2 = sav2; py = pyold;}
00341 }
00342 if (pBot) {
00343 sav1 = py1;
00344 sav2 = r2;
00345 py1 += (py - pyold)/2;
00346 r2 += (py - pyold)/2;
00347 if (TMath::Abs(pyold-py)%2==1) impair++;
00348 if (py-pyold>0) sig=+1;
00349 else sig=-1;
00350 if (impair==2) { impair = 0; py1 += sig; r2 += sig;}
00351 if (py1 < pTy+kMinSize) {py1 = sav1; r2 = sav2; py = pyold;}
00352 }
00353 if (pL) {
00354 sav1 = px1;
00355 sav2 = r1;
00356 px1 += (px - pxold)/2;
00357 r1 -= (px - pxold)/2;
00358 if (TMath::Abs(pxold-px)%2==1) impair++;
00359 if (px-pxold>0) sig=+1;
00360 else sig=-1;
00361 if (impair==2) { impair = 0; px1 += sig; r1 -= sig;}
00362 if (px1 > pRx-kMinSize) {px1 = sav1; r1 = sav2; px = pxold;}
00363 }
00364 if (pR) {
00365 sav1 = px1;
00366 sav2 = r1;
00367 px1 += (px - pxold)/2;
00368 r1 += (px - pxold)/2;
00369 if (TMath::Abs(pxold-px)%2==1) impair++;
00370 if (px-pxold>0) sig=+1;
00371 else sig=-1;
00372 if (impair==2) { impair = 0; px1 += sig; r1 += sig;}
00373 if (px1 < pLx+kMinSize) {px1 = sav1; r1 = sav2; px = pxold;}
00374 }
00375 if (pTop || pBot || pL || pR) {
00376 gVirtualX->SetLineColor(-1);
00377 TAttLine::Modify();
00378 dphi = (fPhimax-fPhimin)*kPI/(180*np);
00379 ct = TMath::Cos(kPI*fTheta/180);
00380 st = TMath::Sin(kPI*fTheta/180);
00381 for (i=0;i<np;i++) {
00382 angle = fPhimin*kPI/180 + Double_t(i)*dphi;
00383 dx = r1*TMath::Cos(angle);
00384 dy = r2*TMath::Sin(angle);
00385 x[i] = px1 + Int_t(dx*ct - dy*st);
00386 y[i] = py1 + Int_t(dx*st + dy*ct);
00387 }
00388 if (fPhimax-fPhimin >= 360 ) {
00389 x[np] = x[0];
00390 y[np] = y[0];
00391 npe = np;
00392 } else {
00393 x[np] = px1;
00394 y[np] = py1;
00395 x[np+1] = x[0];
00396 y[np+1] = y[0];
00397 npe = np + 1;
00398 }
00399 for (i=0;i<npe;i++) gVirtualX->DrawLine(x[i], y[i], x[i+1], y[i+1]);
00400 }
00401 if (pINSIDE) {
00402 dpx = px-pxold; dpy = py-pyold;
00403 px1 += dpx; py1 += dpy;
00404 for (i=0;i<=npe;i++) { x[i] += dpx; y[i] += dpy;}
00405 for (i=0;i<npe;i++) gVirtualX->DrawLine(x[i], y[i], x[i+1], y[i+1]);
00406 }
00407 pTx = pBx = px1;
00408 pRx = px1+r1;
00409 pLx = px1-r1;
00410 pRy = pLy = py1;
00411 pTy = py1-r2;
00412 pBy = py1+r2;
00413 gVirtualX->DrawLine(pRx+4, py1+4, pRx-4, py1+4);
00414 gVirtualX->DrawLine(pRx-4, py1+4, pRx-4, py1-4);
00415 gVirtualX->DrawLine(pRx-4, py1-4, pRx+4, py1-4);
00416 gVirtualX->DrawLine(pRx+4, py1-4, pRx+4, py1+4);
00417 gVirtualX->DrawLine(pLx+4, py1+4, pLx-4, py1+4);
00418 gVirtualX->DrawLine(pLx-4, py1+4, pLx-4, py1-4);
00419 gVirtualX->DrawLine(pLx-4, py1-4, pLx+4, py1-4);
00420 gVirtualX->DrawLine(pLx+4, py1-4, pLx+4, py1+4);
00421 gVirtualX->DrawLine(px1+4, pBy+4, px1-4, pBy+4);
00422 gVirtualX->DrawLine(px1-4, pBy+4, px1-4, pBy-4);
00423 gVirtualX->DrawLine(px1-4, pBy-4, px1+4, pBy-4);
00424 gVirtualX->DrawLine(px1+4, pBy-4, px1+4, pBy+4);
00425 gVirtualX->DrawLine(px1+4, pTy+4, px1-4, pTy+4);
00426 gVirtualX->DrawLine(px1-4, pTy+4, px1-4, pTy-4);
00427 gVirtualX->DrawLine(px1-4, pTy-4, px1+4, pTy-4);
00428 gVirtualX->DrawLine(px1+4, pTy-4, px1+4, pTy+4);
00429 pxold = px;
00430 pyold = py;
00431 break;
00432
00433 case kButton1Up:
00434 if (gROOT->IsEscaped()) {
00435 gROOT->SetEscape(kFALSE);
00436 break;
00437 }
00438
00439 fX1 = gPad->AbsPixeltoX(px1);
00440 fY1 = gPad->AbsPixeltoY(py1);
00441 fBy = gPad->AbsPixeltoY(py1+r2);
00442 fTy = gPad->AbsPixeltoY(py1-r2);
00443 fLx = gPad->AbsPixeltoX(px1+r1);
00444 fRx = gPad->AbsPixeltoX(px1-r1);
00445 fR1 = TMath::Abs(fRx-fLx)/2;
00446 fR2 = TMath::Abs(fTy-fBy)/2;
00447 gPad->Modified(kTRUE);
00448 gVirtualX->SetLineColor(-1);
00449 }
00450 }
00451
00452
00453
00454 void TEllipse::ls(Option_t *) const
00455 {
00456
00457
00458 TROOT::IndentLevel();
00459 printf("%s: X1= %f Y1=%f R1=%f R2=%f\n",GetName(),fX1,fY1,fR1,fR2);
00460 }
00461
00462
00463
00464 void TEllipse::Paint(Option_t *option)
00465 {
00466
00467
00468 PaintEllipse(fX1,fY1,fR1,fR2,fPhimin,fPhimax,fTheta,option);
00469 }
00470
00471
00472
00473 void TEllipse::PaintEllipse(Double_t x1, Double_t y1, Double_t r1, Double_t r2,
00474 Double_t phimin, Double_t phimax, Double_t theta,
00475 Option_t *option)
00476 {
00477
00478
00479 const Int_t np = 200;
00480 static Double_t x[np+3], y[np+3];
00481 TAttLine::Modify();
00482 TAttFill::Modify();
00483
00484 Double_t phi1 = TMath::Min(phimin,phimax);
00485 Double_t phi2 = TMath::Max(phimin,phimax);
00486
00487
00488 Double_t circ = kPI*(r1+r2)*(phi2-phi1)/360;
00489 Int_t n = (Int_t)(np*circ/((gPad->GetX2()-gPad->GetX1())+(gPad->GetY2()-gPad->GetY1())));
00490 if (n < 8) n= 8;
00491 if (n > np) n = np;
00492 Double_t angle,dx,dy;
00493 Double_t dphi = (phi2-phi1)*kPI/(180*n);
00494 Double_t ct = TMath::Cos(kPI*theta/180);
00495 Double_t st = TMath::Sin(kPI*theta/180);
00496 for (Int_t i=0;i<=n;i++) {
00497 angle = phi1*kPI/180 + Double_t(i)*dphi;
00498 dx = r1*TMath::Cos(angle);
00499 dy = r2*TMath::Sin(angle);
00500 x[i] = gPad->XtoPad(x1 + dx*ct - dy*st);
00501 y[i] = gPad->YtoPad(y1 + dx*st + dy*ct);
00502 }
00503 TString opt = option;
00504 opt.ToLower();
00505 if (phi2-phi1 >= 360 ) {
00506 if (GetFillStyle()) gPad->PaintFillArea(n,x,y);
00507 if (GetLineStyle()) gPad->PaintPolyLine(n+1,x,y);
00508 } else {
00509 x[n+1] = gPad->XtoPad(x1);
00510 y[n+1] = gPad->YtoPad(y1);
00511 x[n+2] = x[0];
00512 y[n+2] = y[0];
00513 if (GetFillStyle()) gPad->PaintFillArea(n+2,x,y);
00514 if (GetLineStyle()) {
00515 if (TestBit(kNoEdges) || opt.Contains("only")) gPad->PaintPolyLine(n+1,x,y);
00516 else gPad->PaintPolyLine(n+3,x,y);
00517 }
00518 }
00519 }
00520
00521
00522
00523 void TEllipse::Print(Option_t *) const
00524 {
00525
00526
00527 printf("Ellipse: X1=%f Y1=%f R1=%f R2=%f",fX1,fY1,fR1,fR2);
00528 if (GetLineColor() != 1) printf(" Color=%d",GetLineColor());
00529 if (GetLineStyle() != 1) printf(" Style=%d",GetLineStyle());
00530 if (GetLineWidth() != 1) printf(" Width=%d",GetLineWidth());
00531 printf("\n");
00532 }
00533
00534
00535
00536 void TEllipse::SavePrimitive(ostream &out, Option_t * )
00537 {
00538
00539
00540 out<<" "<<endl;
00541 if (gROOT->ClassSaved(TEllipse::Class())) {
00542 out<<" ";
00543 } else {
00544 out<<" TEllipse *";
00545 }
00546 out<<"ellipse = new TEllipse("<<fX1<<","<<fY1<<","<<fR1<<","<<fR2
00547 <<","<<fPhimin<<","<<fPhimax<<","<<fTheta<<");"<<endl;
00548
00549 SaveFillAttributes(out,"ellipse",0,1001);
00550 SaveLineAttributes(out,"ellipse",1,1,1);
00551
00552 if (GetNoEdges()) out<<" ellipse->SetNoEdges();"<<endl;
00553
00554 out<<" ellipse->Draw();"<<endl;
00555 }
00556
00557
00558
00559 Bool_t TEllipse::GetNoEdges() const
00560 {
00561
00562
00563 return TestBit(kNoEdges) ? kTRUE : kFALSE;
00564 }
00565
00566
00567
00568 void TEllipse::SetNoEdges(Bool_t noEdges)
00569 {
00570
00571
00572
00573
00574 if (noEdges) SetBit(kNoEdges);
00575 else ResetBit(kNoEdges);
00576 }
00577
00578
00579
00580 void TEllipse::Streamer(TBuffer &R__b)
00581 {
00582
00583
00584 if (R__b.IsReading()) {
00585 UInt_t R__s, R__c;
00586 Version_t R__v = R__b.ReadVersion(&R__s, &R__c);
00587 if (R__v > 1) {
00588 R__b.ReadClassBuffer(TEllipse::Class(), this, R__v, R__s, R__c);
00589 return;
00590 }
00591
00592 TObject::Streamer(R__b);
00593 TAttLine::Streamer(R__b);
00594 TAttFill::Streamer(R__b);
00595 Float_t x1,y1,r1,r2,phimin,phimax,theta;
00596 R__b >> x1; fX1 = x1;
00597 R__b >> y1; fY1 = y1;
00598 R__b >> r1; fR1 = r1;
00599 R__b >> r2; fR2 = r2;
00600 R__b >> phimin; fPhimin = phimin;
00601 R__b >> phimax; fPhimax = phimax;
00602 R__b >> theta; fTheta = theta;
00603 R__b.CheckByteCount(R__s, R__c, TEllipse::IsA());
00604
00605
00606 } else {
00607 R__b.WriteClassBuffer(TEllipse::Class(),this);
00608 }
00609 }