45 TPolyLine::TPolyLine(): TObject()
57 TPolyLine::TPolyLine(Int_t n, Option_t *option)
58 :TObject(), TAttLine(), TAttFill()
69 fX =
new Double_t[fN];
70 fY =
new Double_t[fN];
78 TPolyLine::TPolyLine(Int_t n, Float_t *x, Float_t *y, Option_t *option)
79 :TObject(), TAttLine(), TAttFill()
90 fX =
new Double_t[fN];
91 fY =
new Double_t[fN];
93 for (Int_t i=0; i<fN;i++) { fX[i] = x[i]; fY[i] = y[i];}
102 TPolyLine::TPolyLine(Int_t n, Double_t *x, Double_t *y, Option_t *option)
103 :TObject(), TAttLine(), TAttFill()
114 fX =
new Double_t[fN];
115 fY =
new Double_t[fN];
116 if (!x || !y)
return;
117 for (Int_t i=0; i<fN;i++) { fX[i] = x[i]; fY[i] = y[i];}
124 TPolyLine& TPolyLine::operator=(
const TPolyLine& pl)
127 TObject::operator=(pl);
128 TAttLine::operator=(pl);
129 TAttFill::operator=(pl);
131 fLastPoint=pl.fLastPoint;
142 TPolyLine::~TPolyLine()
144 if (fX)
delete [] fX;
145 if (fY)
delete [] fY;
151 TPolyLine::TPolyLine(
const TPolyLine &polyline) : TObject(polyline), TAttLine(polyline), TAttFill(polyline)
157 ((TPolyLine&)polyline).Copy(*
this);
163 void TPolyLine::Copy(TObject &obj)
const
166 TAttLine::Copy(((TPolyLine&)obj));
167 TAttFill::Copy(((TPolyLine&)obj));
168 ((TPolyLine&)obj).fN = fN;
170 ((TPolyLine&)obj).fX =
new Double_t[fN];
171 ((TPolyLine&)obj).fY =
new Double_t[fN];
172 for (Int_t i=0; i<fN;i++) {((TPolyLine&)obj).fX[i] = fX[i]; ((TPolyLine&)obj).fY[i] = fY[i];}
174 ((TPolyLine&)obj).fX = 0;
175 ((TPolyLine&)obj).fY = 0;
177 ((TPolyLine&)obj).fOption = fOption;
178 ((TPolyLine&)obj).fLastPoint = fLastPoint;
198 Int_t TPolyLine::DistancetoPrimitive(Int_t px, Int_t py)
200 const Int_t big = 9999;
201 const Int_t kMaxDiff = 10;
204 Int_t i, pxp, pyp, d;
205 Int_t distance = big;
206 if (Size() <= 0)
return distance;
208 for (i=0;i<Size();i++) {
209 pxp = gPad->XtoAbsPixel(gPad->XtoPad(fX[i]));
210 pyp = gPad->YtoAbsPixel(gPad->YtoPad(fY[i]));
211 d = TMath::Abs(pxp-px) + TMath::Abs(pyp-py);
212 if (d < distance) distance = d;
214 if (distance < kMaxDiff)
return distance;
217 for (i=0;i<Size()-1;i++) {
218 d = DistancetoLine(px, py, gPad->XtoPad(fX[i]), gPad->YtoPad(fY[i]), gPad->XtoPad(fX[i+1]), gPad->YtoPad(fY[i+1]));
219 if (d < distance) distance = d;
223 if (fFillColor && fFillStyle && fX[0] == fX[fLastPoint] && fY[0] == fY[fLastPoint]) {
224 if (TMath::IsInside(gPad->AbsPixeltoX(px),gPad->AbsPixeltoY(py),fLastPoint+1,fX,fY)) distance = 0;
232 void TPolyLine::Draw(Option_t *option)
240 void TPolyLine::DrawPolyLine(Int_t n, Double_t *x, Double_t *y, Option_t *option)
242 TPolyLine *newpolyline =
new TPolyLine(n,x,y);
243 TAttLine::Copy(*newpolyline);
244 TAttFill::Copy(*newpolyline);
245 newpolyline->fOption = fOption;
246 newpolyline->SetBit(kCanDelete);
247 newpolyline->AppendPad(option);
261 void TPolyLine::ExecuteEvent(Int_t event, Int_t px, Int_t py)
266 Double_t xmin, xmax, ymin, ymax, dx, dy, dxr, dyr;
267 const Int_t kMaxDiff = 10;
268 static Bool_t middle;
269 static Int_t ipoint, pxp, pyp;
270 static Int_t px1,px2,py1,py2;
271 static Int_t pxold, pyold, px1old, py1old, px2old, py2old;
272 static Int_t dpx, dpy;
273 static Int_t *x=0, *y=0;
274 Bool_t opaque = gPad->OpaqueMoving();
276 if (!gPad->IsEditable())
return;
283 gVirtualX->SetLineColor(-1);
285 px1 = gPad->XtoAbsPixel(gPad->GetX1());
286 py1 = gPad->YtoAbsPixel(gPad->GetY1());
287 px2 = gPad->XtoAbsPixel(gPad->GetX2());
288 py2 = gPad->YtoAbsPixel(gPad->GetY2());
296 pxp = gPad->XtoAbsPixel(gPad->XtoPad(fX[i]));
297 pyp = gPad->YtoAbsPixel(gPad->YtoPad(fY[i]));
299 gVirtualX->DrawLine(pxp-4, pyp-4, pxp+4, pyp-4);
300 gVirtualX->DrawLine(pxp+4, pyp-4, pxp+4, pyp+4);
301 gVirtualX->DrawLine(pxp+4, pyp+4, pxp-4, pyp+4);
302 gVirtualX->DrawLine(pxp-4, pyp+4, pxp-4, pyp-4);
306 d = TMath::Abs(pxp-px) + TMath::Abs(pyp-py);
307 if (d < kMaxDiff) ipoint =i;
313 if (ipoint < 0)
return;
317 px2old = gPad->XtoAbsPixel(fX[1]);
318 py2old = gPad->YtoAbsPixel(fY[1]);
319 }
else if (ipoint == fN-1) {
320 px1old = gPad->XtoAbsPixel(gPad->XtoPad(fX[fN-2]));
321 py1old = gPad->YtoAbsPixel(gPad->YtoPad(fY[fN-2]));
325 px1old = gPad->XtoAbsPixel(gPad->XtoPad(fX[ipoint-1]));
326 py1old = gPad->YtoAbsPixel(gPad->YtoPad(fY[ipoint-1]));
327 px2old = gPad->XtoAbsPixel(gPad->XtoPad(fX[ipoint+1]));
328 py2old = gPad->YtoAbsPixel(gPad->YtoPad(fY[ipoint+1]));
330 pxold = gPad->XtoAbsPixel(gPad->XtoPad(fX[ipoint]));
331 pyold = gPad->YtoAbsPixel(gPad->YtoPad(fY[ipoint]));
340 pxp = gPad->XtoAbsPixel(gPad->XtoPad(fX[i]));
341 pyp = gPad->YtoAbsPixel(gPad->YtoPad(fY[i]));
342 d = TMath::Abs(pxp-px) + TMath::Abs(pyp-py);
343 if (d < kMaxDiff) middle = kFALSE;
348 if (middle) gPad->SetCursor(kMove);
349 else gPad->SetCursor(kHand);
355 for(i=0;i<np-1;i++) {
356 gVirtualX->DrawLine(x[i]+dpx, y[i]+dpy, x[i+1]+dpx, y[i+1]+dpy);
359 gVirtualX->DrawLine(pxp-4, pyp-4, pxp+4, pyp-4);
360 gVirtualX->DrawLine(pxp+4, pyp-4, pxp+4, pyp+4);
361 gVirtualX->DrawLine(pxp+4, pyp+4, pxp-4, pyp+4);
362 gVirtualX->DrawLine(pxp-4, pyp+4, pxp-4, pyp-4);
366 gVirtualX->DrawLine(pxp-4, pyp-4, pxp+4, pyp-4);
367 gVirtualX->DrawLine(pxp+4, pyp-4, pxp+4, pyp+4);
368 gVirtualX->DrawLine(pxp+4, pyp+4, pxp-4, pyp+4);
369 gVirtualX->DrawLine(pxp-4, pyp+4, pxp-4, pyp-4);
374 for(i=0;i<np-1;i++) {
375 gVirtualX->DrawLine(x[i]+dpx, y[i]+dpy, x[i+1]+dpx, y[i+1]+dpy);
378 gVirtualX->DrawLine(pxp-4, pyp-4, pxp+4, pyp-4);
379 gVirtualX->DrawLine(pxp+4, pyp-4, pxp+4, pyp+4);
380 gVirtualX->DrawLine(pxp+4, pyp+4, pxp-4, pyp+4);
381 gVirtualX->DrawLine(pxp-4, pyp+4, pxp-4, pyp-4);
385 gVirtualX->DrawLine(pxp-4, pyp-4, pxp+4, pyp-4);
386 gVirtualX->DrawLine(pxp+4, pyp-4, pxp+4, pyp+4);
387 gVirtualX->DrawLine(pxp+4, pyp+4, pxp-4, pyp+4);
388 gVirtualX->DrawLine(pxp-4, pyp+4, pxp-4, pyp-4);
390 if (px1old) gVirtualX->DrawLine(px1old, py1old, pxold, pyold);
391 if (px2old) gVirtualX->DrawLine(pxold, pyold, px2old, py2old);
392 gVirtualX->DrawLine(pxold-4, pyold-4, pxold+4, pyold-4);
393 gVirtualX->DrawLine(pxold+4, pyold-4, pxold+4, pyold+4);
394 gVirtualX->DrawLine(pxold+4, pyold+4, pxold-4, pyold+4);
395 gVirtualX->DrawLine(pxold-4, pyold+4, pxold-4, pyold-4);
397 pxold = TMath::Max(pxold, px1);
398 pxold = TMath::Min(pxold, px2);
400 pyold = TMath::Max(pyold, py2);
401 pyold = TMath::Min(pyold, py1);
402 if (px1old) gVirtualX->DrawLine(px1old, py1old, pxold, pyold);
403 if (px2old) gVirtualX->DrawLine(pxold, pyold, px2old, py2old);
404 gVirtualX->DrawLine(pxold-4, pyold-4, pxold+4, pyold-4);
405 gVirtualX->DrawLine(pxold+4, pyold-4, pxold+4, pyold+4);
406 gVirtualX->DrawLine(pxold+4, pyold+4, pxold-4, pyold+4);
407 gVirtualX->DrawLine(pxold-4, pyold+4, pxold-4, pyold-4);
411 for(i=0;i<np-1;i++) {
423 pxold = TMath::Max(pxold, px1);
424 pxold = TMath::Min(pxold, px2);
426 pyold = TMath::Max(pyold, py2);
427 pyold = TMath::Min(pyold, py1);
432 fX[i] = gPad->PadtoX(gPad->AbsPixeltoX(x[i]+dpx));
433 fY[i] = gPad->PadtoY(gPad->AbsPixeltoY(y[i]+dpy));
436 fX[ipoint] = gPad->PadtoX(gPad->AbsPixeltoX(pxold));
437 fY[ipoint] = gPad->PadtoY(gPad->AbsPixeltoY(pyold));
440 gPad->Modified(kTRUE);
447 xmin = gPad->GetUxmin();
448 xmax = gPad->GetUxmax();
449 ymin = gPad->GetUymin();
450 ymax = gPad->GetUymax();
453 dxr = dx/(1 - gPad->GetLeftMargin() - gPad->GetRightMargin());
454 dyr = dy/(1 - gPad->GetBottomMargin() - gPad->GetTopMargin());
458 gPad->Range(xmin - dxr*gPad->GetLeftMargin(),
459 ymin - dyr*gPad->GetBottomMargin(),
460 xmax + dxr*gPad->GetRightMargin(),
461 ymax + dyr*gPad->GetTopMargin());
462 gPad->RangeAxis(xmin, ymin, xmax, ymax);
467 fX[i] = gPad->PadtoX(gPad->AbsPixeltoX(x[i]+dpx));
468 fY[i] = gPad->PadtoY(gPad->AbsPixeltoY(y[i]+dpy));
471 fX[ipoint] = gPad->PadtoX(gPad->AbsPixeltoX(pxold));
472 fY[ipoint] = gPad->PadtoY(gPad->AbsPixeltoY(pyold));
477 gPad->Modified(kTRUE);
478 gVirtualX->SetLineColor(-1);
486 void TPolyLine::ls(Option_t *)
const
488 TROOT::IndentLevel();
489 printf(
"TPolyLine N=%d\n",fN);
495 Int_t TPolyLine::Merge(TCollection *li)
503 while ((pl = (TPolyLine*)next())) {
504 if (!pl->InheritsFrom(TPolyLine::Class())) {
505 Error(
"Add",
"Attempt to add object of class: %s to a %s",pl->ClassName(),this->ClassName());
508 npoints += pl->Size();
512 if (npoints > 1) SetPoint(npoints-1,0,0);
516 while ((pl = (TPolyLine*)next())) {
517 Int_t np = pl->Size();
518 Double_t *x = pl->GetX();
519 Double_t *y = pl->GetY();
520 for (Int_t i=0;i<np;i++) {
521 SetPoint(i,x[i],y[i]);
531 void TPolyLine::Paint(Option_t *option)
533 if (TestBit(kPolyLineNDC)) {
534 if (strlen(option) > 0) PaintPolyLineNDC(fLastPoint+1, fX, fY, option);
535 else PaintPolyLineNDC(fLastPoint+1, fX, fY, fOption.Data());
537 if (strlen(option) > 0) PaintPolyLine(fLastPoint+1, fX, fY, option);
538 else PaintPolyLine(fLastPoint+1, fX, fY, fOption.Data());
548 void TPolyLine::PaintPolyLine(Int_t n, Double_t *x, Double_t *y, Option_t *option)
555 if (gPad->GetLogx()) {
556 xx =
new Double_t[n];
557 for (Int_t ix=0;ix<n;ix++) xx[ix] = gPad->XtoPad(x[ix]);
559 if (gPad->GetLogy()) {
560 yy =
new Double_t[n];
561 for (Int_t iy=0;iy<n;iy++) yy[iy] = gPad->YtoPad(y[iy]);
563 if (*option ==
'f' || *option ==
'F') gPad->PaintFillArea(n,xx,yy,option);
564 else gPad->PaintPolyLine(n,xx,yy,option);
565 if (x != xx)
delete [] xx;
566 if (y != yy)
delete [] yy;
572 void TPolyLine::PaintPolyLineNDC(Int_t n, Double_t *x, Double_t *y, Option_t *option)
576 if (*option ==
'f' || *option ==
'F') gPad->PaintFillAreaNDC(n,x,y,option);
577 else gPad->PaintPolyLineNDC(n,x,y,option);
584 void TPolyLine::Print(Option_t *)
const
586 printf(
"PolyLine N=%d\n",fN);
592 void TPolyLine::SavePrimitive(std::ostream &out, Option_t *option )
596 if (gROOT->ClassSaved(TPolyLine::Class())) {
599 out<<
" Double_t *dum = 0;"<<std::endl;
602 out<<
"pline = new TPolyLine("<<fN<<
",dum,dum,"<<quote<<fOption<<quote<<
");"<<std::endl;
604 SaveFillAttributes(out,
"pline",0,1001);
605 SaveLineAttributes(out,
"pline",1,1,1);
607 for (Int_t i=0;i<Size();i++) {
608 out<<
" pline->SetPoint("<<i<<
","<<fX[i]<<
","<<fY[i]<<
");"<<std::endl;
611 <<quote<<option<<quote<<
");"<<std::endl;
617 void TPolyLine::SetNDC(Bool_t isNDC)
619 ResetBit(kPolyLineNDC);
620 if (isNDC) SetBit(kPolyLineNDC);
627 Int_t TPolyLine::SetNextPoint(Double_t x, Double_t y)
630 SetPoint(fLastPoint, x, y);
639 void TPolyLine::SetPoint(Int_t n, Double_t x, Double_t y)
642 if (!fX || !fY || n >= fN) {
644 Int_t newN = TMath::Max(2*fN,n+1);
645 Double_t *savex =
new Double_t [newN];
646 Double_t *savey =
new Double_t [newN];
648 memcpy(savex,fX,fN*
sizeof(Double_t));
649 memset(&savex[fN],0,(newN-fN)*
sizeof(Double_t));
653 memcpy(savey,fY,fN*
sizeof(Double_t));
654 memset(&savey[fN],0,(newN-fN)*
sizeof(Double_t));
663 fLastPoint = TMath::Max(fLastPoint,n);
671 void TPolyLine::SetPolyLine(Int_t n)
694 void TPolyLine::SetPolyLine(Int_t n, Float_t *x, Float_t *y, Option_t *option)
705 if (fX)
delete [] fX;
706 if (fY)
delete [] fY;
707 fX =
new Double_t[fN];
708 fY =
new Double_t[fN];
709 for (Int_t i=0; i<fN;i++) {
710 if (x) fX[i] = (Double_t)x[i];
711 if (y) fY[i] = (Double_t)y[i];
722 void TPolyLine::SetPolyLine(Int_t n, Double_t *x, Double_t *y, Option_t *option)
733 if (fX)
delete [] fX;
734 if (fY)
delete [] fY;
735 fX =
new Double_t[fN];
736 fY =
new Double_t[fN];
737 for (Int_t i=0; i<fN;i++) {
748 void TPolyLine::Streamer(TBuffer &b)
752 Version_t R__v = b.ReadVersion(&R__s, &R__c);
754 b.ReadClassBuffer(TPolyLine::Class(),
this, R__v, R__s, R__c);
758 TObject::Streamer(b);
759 TAttLine::Streamer(b);
760 TAttFill::Streamer(b);
762 fX =
new Double_t[fN];
763 fY =
new Double_t[fN];
764 Float_t *x =
new Float_t[fN];
765 Float_t *y =
new Float_t[fN];
766 b.ReadFastArray(x,fN);
767 b.ReadFastArray(y,fN);
768 for (Int_t i=0;i<fN;i++) {
773 b.CheckByteCount(R__s, R__c, TPolyLine::IsA());
777 b.WriteClassBuffer(TPolyLine::Class(),
this);